From 1069e705d22520702a2f9f97f54a5cfb34363f17 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 17 Nov 2022 13:00:44 -0500 Subject: [PATCH 001/251] Display cursor frequency only to nearest Hz. --- map65/plotter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map65/plotter.cpp b/map65/plotter.cpp index 3c42051a4..ab53a4efb 100644 --- a/map65/plotter.cpp +++ b/map65/plotter.cpp @@ -776,7 +776,7 @@ void CPlotter::mouseMoveEvent (QMouseEvent * event) if(lower) { QToolTip::showText(event->globalPos(),QString::number(ndf)); } else { - QToolTip::showText(event->globalPos(),QString::number(freq)); + QToolTip::showText(event->globalPos(),QString::number(freq,'f',3)); } QWidget::mouseMoveEvent(event); } From 51eb142f4c81c96341f62c88e4bb9a99a31e151b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 1 Dec 2022 12:17:03 -0500 Subject: [PATCH 002/251] Improve wideband Q65 decoding in MAP65. --- lib/map65_mmdec.f90 | 2 +- map65/libm65/map65a.f90 | 6 +++--- map65/libm65/wideband_sync.f90 | 33 ++++++++++++++++++++++++--------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index ca9f959ed..18334ecf9 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -40,7 +40,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & lagain=(nagain.ne.0) bVHF=.true. emedelay=2.5 - ndepth=1 + ndepth=3 !Does this make it too slow? ntrperiod=60 open(17,file=trim(temp_dir)//'/red.dat',status='unknown') diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 index 87afa48cd..b0f43be7c 100644 --- a/map65/libm65/map65a.f90 +++ b/map65/libm65/map65a.f90 @@ -68,11 +68,11 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & endif !### ! do k=1,ncand -! freq=cand(k)%f+nkhz_center-48.0-1.27046 +! freq=cand(k)%f+nkhz_center-48.0 ! ipk=cand(k)%indx -! write(*,3010) nutc,k,db(cand(k)%snr),freq,cand(k)%xdt, & +! write(71,3071) k,db(cand(k)%snr),freq,cand(k)%xdt, & ! cand(k)%ipol,cand(k)%iflip,ipk,ldecoded(ipk) -!3010 format('=a',i5.4,i5,f8.2,f10.3,f8.2,2i3,i6,L4) +!3071 format(i3,f8.2,f10.3,f8.2,2i3,i6,L4) ! enddo !### diff --git a/map65/libm65/wideband_sync.f90 b/map65/libm65/wideband_sync.f90 index 90689ed1f..31a96d2cb 100644 --- a/map65/libm65/wideband_sync.f90 +++ b/map65/libm65/wideband_sync.f90 @@ -41,7 +41,7 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) type(candidate) :: cand(MAX_CANDIDATES) common/early/nhsym1,nhsym2,ldecoded(32768) - call wb_sync(ss,savg,xpol,jz,nfa,nfb) + call wb_sync(ss,savg,xpol,jz,nfa,nfb) !Output to sync() array tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 df3=96000.0/NFFT @@ -89,8 +89,6 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) if(diffhz.gt.-0.03*bw .and. diffhz.lt.1.03*bw) skip=.true. enddo if(skip) cycle -! write(*,3301) i,k,m,f0,diffhz,bw,db(snr1) -!3301 format('=A',3i5,f8.3,2f8.0,f8.2) k=k+1 cand(k)%snr=snr1 cand(k)%f=f0 @@ -99,6 +97,8 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) cand(k)%ipol=sync(n)%ipol cand(k)%iflip=nint(flip) cand(k)%indx=n +! write(50,3050) i,k,m,f0+32.0,diffhz,bw,snr1,db(snr1) +!3050 format(3i5,f8.3,2f8.0,2f8.2) if(k.ge.MAX_CANDIDATES) exit enddo ncand=k @@ -251,15 +251,30 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) enddo ! i (frequency bin) -! do i=ia,ib -! write(15,3015) 0.001*(i-1)*df3,sync(i)%ccfmax,sync(i)%xdt,sync(i)%ipol, & -! sync(i)%iflip,sync(i)%birdie -!3015 format(3f10.3,2i6,L5) -! enddo - call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) sync(ia:ib)%ccfmax=sync(ia:ib)%ccfmax/base + bw=65*4*1.66666667 !Q65-60C bandwidth + nbw=bw/df3 + 1 !Number of bins to blank + syncmin=2.0 + nguard=10 + do i=ia,ib + if(sync(i)%ccfmax.lt.syncmin) cycle + spk=maxval(sync(i:i+nbw)%ccfmax) + ip =maxloc(sync(i:i+nbw)%ccfmax) + i0=ip(1)+i-1 + ja=min(i,i0-nguard) + jb=i0+nbw+nguard + sync(ja:jb)%ccfmax=0. + sync(i0)%ccfmax=spk + enddo + +! do i=ia,ib +! write(15,3015) 0.001*(i-1)*df3+32.0,sync(i)%ccfmax,sync(i)%xdt, & +! sync(i)%ipol,sync(i)%iflip,sync(i)%birdie +!3015 format(3f10.3,2i6,L5) +! enddo + return end subroutine wb_sync From 6c018cb53fd84d05111bd572f9ae40cc5505c334 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 1 Dec 2022 12:36:48 -0500 Subject: [PATCH 003/251] Fix the Q65 submode indicator written to map65_rx.log. --- map65/libm65/q65b.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 92be6528a..15c0ea11b 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -181,8 +181,9 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & if(nutc.ne.nutc00 .or. msg0(1:28).ne.msg00 .or. freq1.ne.freq1_00) then ! Write to file map65_rx.log: ndecodes=ndecodes+1 - write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28),cq0 -1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': A',2x,a3) + write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28), & + cmode(2:2),cq0 +1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': ',a1,2x,a3) nutc00=nutc msg00=msg0(1:28) freq1_00=freq1 From 0055222306ae7858f15a34e80db7b5d9b3bba757 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 2 Dec 2022 09:18:52 -0500 Subject: [PATCH 004/251] Write MAP65 decodes to file 'wb_q65.txt', for use by WSJT-X. --- lib/map65_mmdec.f90 | 2 +- map65/libm65/ftninit.f90 | 1 + map65/libm65/m65.f90 | 4 ++-- map65/libm65/map65a.f90 | 2 ++ map65/libm65/q65b.f90 | 4 ++++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index 18334ecf9..e0456b788 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -40,7 +40,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & lagain=(nagain.ne.0) bVHF=.true. emedelay=2.5 - ndepth=3 !Does this make it too slow? + ndepth=2 !Does this make it too slow? ntrperiod=60 open(17,file=trim(temp_dir)//'/red.dat',status='unknown') diff --git a/map65/libm65/ftninit.f90 b/map65/libm65/ftninit.f90 index 90468319c..f97705942 100644 --- a/map65/libm65/ftninit.f90 +++ b/map65/libm65/ftninit.f90 @@ -10,6 +10,7 @@ subroutine ftninit(appd) addpfx=' ' call pfxdump(appd//'/prefixes.txt') + open(12,file=appd//'/wb_q65.txt',status='unknown') open(13,file=appd//'/map65.log',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') open(21,file=appd//'/map65_rx.log',status='unknown',access='append',err=950) diff --git a/map65/libm65/m65.f90 b/map65/libm65/m65.f90 index d878a3b49..4c6713ab0 100644 --- a/map65/libm65/m65.f90 +++ b/map65/libm65/m65.f90 @@ -7,9 +7,9 @@ program m65 ! ! 10 binary input data, *.tf2 files ! 11 prefixes.txt -! 12 +! 12 wb_w65.txt ! 13 map65.log -! 14 +! 14 ! 15 ! 16 tquick log ! 17 saved *.tf2 files diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 index b0f43be7c..7403d9cbb 100644 --- a/map65/libm65/map65a.f90 +++ b/map65/libm65/map65a.f90 @@ -41,6 +41,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ save + rewind 12 ndecodes=0 ! Clean start for Q65 at early decode @@ -520,6 +521,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ndecdone=2 900 close(23) + call flush(12) ndphi=0 mcall3b=mcall3a diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 15c0ea11b..7df236d8d 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -187,6 +187,10 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & nutc00=nutc msg00=msg0(1:28) freq1_00=freq1 + + f1=0.001*k0*df+nkhz_center-48.0+1.0 + write(12,1120) nutc,f1,xdt0,nsnr0,trim(msg0) +1120 format(i4.4,f9.3,f7.2,i5,2x,a) endif endif From 32411d1fd0d3fba939af3a6efd1458afe7ca19a8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 2 Dec 2022 10:20:43 -0500 Subject: [PATCH 005/251] Send current self-dop from MAP65 mainwindow to decoder. --- map65/astro.cpp | 1 + map65/libm65/decode0.f90 | 4 ++-- map65/libm65/m65.f90 | 2 +- map65/libm65/m65a.f90 | 2 +- map65/libm65/map65a.f90 | 8 ++++---- map65/libm65/q65b.f90 | 10 ++++++---- map65/mainwindow.cpp | 2 +- 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/map65/astro.cpp b/map65/astro.cpp index 427518382..2583a32a7 100644 --- a/map65/astro.cpp +++ b/map65/astro.cpp @@ -70,6 +70,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, &azmoondx, &elmoondx, &ntsky, &ndop, &ndop00,&ramoon, &decmoon, &dgrd, &poloffset, &xnr, 6, 6); + datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom sprintf(cc, "Az: %6.1f\n" "El: %6.1f\n" diff --git a/map65/libm65/decode0.f90 b/map65/libm65/decode0.f90 index ba167cddf..438079f1d 100644 --- a/map65/libm65/decode0.f90 +++ b/map65/libm65/decode0.f90 @@ -12,7 +12,7 @@ subroutine decode0(dd,ss,savg,nstandalone) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime common/early/nhsym1,nhsym2,ldecoded(32768) common/decodes/ndecodes data neme0/-99/,mcall3b/1/ @@ -56,7 +56,7 @@ subroutine decode0(dd,ss,savg,nstandalone) mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode) + ndiskdat,nxpol,nmode,ndop00) call timer('map65a ',1) call timer('decode0 ',1) diff --git a/map65/libm65/m65.f90 b/map65/libm65/m65.f90 index 4c6713ab0..c93357c7e 100644 --- a/map65/libm65/m65.f90 +++ b/map65/libm65/m65.f90 @@ -41,7 +41,7 @@ program m65 common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime common/early/nhsym1,nhsym2,ldecoded(32768) nargs=iargc() diff --git a/map65/libm65/m65a.f90 b/map65/libm65/m65a.f90 index 5e9adc464..ffeb176a3 100644 --- a/map65/libm65/m65a.f90 +++ b/map65/libm65/m65a.f90 @@ -82,7 +82,7 @@ subroutine m65c(dd,ss,savg,nparams0) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & datetime,junk1,junk2 common/early/nhsym1,nhsym2,ldecoded(32768) equivalence (nparams,fcenter) diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 index 7403d9cbb..1861467ad 100644 --- a/map65/libm65/map65a.f90 +++ b/map65/libm65/map65a.f90 @@ -2,7 +2,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode) + ndiskdat,nxpol,nmode,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 signals. @@ -366,7 +366,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & ntol,xpol,mycall,mygrid, hiscall,hisgrid,mode_q65,f0,fqso, & - newdat,nagain,max_drift,nhsym,idec) + newdat,nagain,max_drift,nhsym,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo @@ -377,7 +377,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & ntol,xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso, & - newdat,nagain,max_drift,nhsym,idec) + newdat,nagain,max_drift,nhsym,ndop00,idec) call timer('q65b ',1) endif endif @@ -421,7 +421,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,nhsym,idec) + nagain,max_drift,nhsym,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 7df236d8d..55bdd1771 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -1,6 +1,6 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & mycall0,mygrid,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & - max_drift,nhsym,idec) + max_drift,nhsym,ndop00,idec) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. @@ -188,9 +188,11 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & msg00=msg0(1:28) freq1_00=freq1 - f1=0.001*k0*df+nkhz_center-48.0+1.0 - write(12,1120) nutc,f1,xdt0,nsnr0,trim(msg0) -1120 format(i4.4,f9.3,f7.2,i5,2x,a) + ndop00=1575 !### TEMPORARY, for Nov 12 2022 at 0500 UTC ### + frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal + fsked=frx - 0.001*ndop00/2.0 - 1.5 + write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) +1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) endif endif diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index 4ab500f65..adddfeac2 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -1322,7 +1322,7 @@ void MainWindow::decode() //decode() datcom_.nxpol=0; if(m_xpol) datcom_.nxpol=1; datcom_.nmode=10*m_modeQ65 + m_modeJT65; - datcom_.nfast=1; //No longer used +// datcom_.nfast=1; //No longer used datcom_.nsave=m_nsave; datcom_.max_drift=ui->sbMaxDrift->value(); From 5daa5f301d48a286d4d3bb820d00d75da6ab6d65 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 2 Dec 2022 11:35:52 -0500 Subject: [PATCH 006/251] Let MAP65 compute self Doppler using *.iq filename values for date and time. --- map65/libm65/astrosub.f90 | 12 ++++++++++++ map65/mainwindow.cpp | 20 +++++++++++++++++++- map65/mainwindow.h | 3 +++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/map65/libm65/astrosub.f90 b/map65/libm65/astrosub.f90 index 64dddb00c..ce25a0d94 100644 --- a/map65/libm65/astrosub.f90 +++ b/map65/libm65/astrosub.f90 @@ -12,3 +12,15 @@ subroutine astrosub(nyear,month,nday,uth8,nfreq,mygrid,hisgrid, & return end subroutine astrosub + +subroutine astrosub00(nyear,month,nday,uth8,nfreq,mygrid,ndop00) + + implicit real*8 (a-h,o-z) + character*6 mygrid + + call astrosub(nyear,month,nday,uth8,nfreq,mygrid,mygrid, & + AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & + RAMoon8,DecMoon8,Dgrd8,poloffset8,xnr8) + + return +end subroutine astrosub00 diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index adddfeac2..98a34a164 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -1293,7 +1293,25 @@ void MainWindow::decode() //decode() datcom_.mousefqso=m_wide_graph_window->QSOfreq(); datcom_.ndepth=m_ndepth; datcom_.ndiskdat=0; - if(m_diskData) datcom_.ndiskdat=1; + if(m_diskData) { + datcom_.ndiskdat=1; + int i0=m_path.indexOf(".tf2"); + if(i0<0) i0=m_path.indexOf(".iq"); + if(i0>0) { + // Compute self Doppler using the filename for Date and Time + int nyear=m_path.mid(i0-11,2).toInt()+2000; + int month=m_path.mid(i0-9,2).toInt(); + int nday=m_path.mid(i0-7,2).toInt(); + int nhr=m_path.mid(i0-4,2).toInt(); + int nmin=m_path.mid(i0-2,2).toInt(); + double uth=nhr + nmin/60.0; + int nfreq=(int)datcom_.fcenter; + int ndop00; + + astrosub00_(&nyear, &month, &nday, &uth, &nfreq, m_myGrid.toLatin1(),&ndop00,6); + datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom + } + } datcom_.neme=0; if(ui->actionOnly_EME_calls->isChecked()) datcom_.neme=1; diff --git a/map65/mainwindow.h b/map65/mainwindow.h index ebee97403..efe58b866 100644 --- a/map65/mainwindow.h +++ b/map65/mainwindow.h @@ -322,6 +322,9 @@ extern "C" { int len1, int len2); int ptt_(int* nport, int* itx, int* iptt); + + void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, + const char* mygrid, int* ndop00, int len1); } #endif // MAINWINDOW_H From 4160256747c75788219d5e9e667f5495c898abc7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 2 Dec 2022 11:43:25 -0500 Subject: [PATCH 007/251] Remove a temporary hardwired Doppler value. --- map65/libm65/q65b.f90 | 2 -- 1 file changed, 2 deletions(-) diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 55bdd1771..7cf455edf 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -187,8 +187,6 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & nutc00=nutc msg00=msg0(1:28) freq1_00=freq1 - - ndop00=1575 !### TEMPORARY, for Nov 12 2022 at 0500 UTC ### frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal fsked=frx - 0.001*ndop00/2.0 - 1.5 write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) From 44729ebe00437c08e82c8c88121fb493af1012ee Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 2 Dec 2022 16:30:18 -0500 Subject: [PATCH 008/251] Work in progress on displaying wideband decodes from MAP65 in WSJT-X. --- widgets/mainwindow.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ widgets/mainwindow.h | 10 +++++++ 2 files changed, 75 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 11d82d18a..94b678065 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4781,6 +4781,14 @@ void MainWindow::guiUpdate() if(nsec != m_sec0) { // qDebug() << "AAA" << nsec << int(m_specOp) << ui->labDXped->text(); + if(m_mode=="Q65") { + QFileInfo fi(m_appDir+"/wb_q65.txt"); + QDateTime fileTime=fi.lastModified(); + QDateTime now = QDateTime::currentDateTimeUtc (); + int age=fileTime.msecsTo(now)/1000; + if(age==1) readWidebandDecodes(); + } + if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); if( SpecOp::HOUND == m_specOp ) { @@ -9152,6 +9160,63 @@ void MainWindow::write_transmit_entry (QString const& file_name) } } +void MainWindow::readWidebandDecodes() +{ +// Update "m_wEMECall" by reading wb_dec.txt + int nhr=0; + int nmin=0; + QFile f(m_appDir+"/wb_q65.txt"); + f.open(QIODevice::ReadOnly); + if(f.isOpen()) { + QTextStream in(&f); + QString line,callsign; + for(int i=0; i<99999; i++) { + line=in.readLine(); + if(line.length()<=0) break; + nhr=line.mid(0,2).toInt(); + nmin=line.mid(2,2).toInt(); + double fsked=line.mid(4,9).toDouble(); + QString msg=line.mid(27,-1); + int i1=msg.indexOf(" "); + int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); + QString call=msg.mid(i1+1,i2-i1); + QString w3=msg.mid(i2+1,-1); + m_EMECall[call].fsked=fsked; + m_EMECall[call].t=60*nhr + nmin; + m_EMECall[call].worked=false; + if(w3.contains(grid_regexp)) m_EMECall[call].grid4=w3; + } + f.close(); + + /* + if(m_ActiveStationsWidget != NULL) m_ActiveStationsWidget->erase(); + + if(m_ActiveStationsWidget!=NULL) m_ActiveStationsWidget->displayRecentStations(t); + QString t1; + if(!bReady) t1 = t1.asprintf(" %3d %+2.2d %4d %1d %2d %4d",az,snr,freq,itx,age,points); + */ + + QMap::iterator i; + QString t=""; + QString t1; + for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { + int age=60*nhr + nmin - (i->t); + if(age<0) age += 1440; + if(i->worked) { + t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,i.key().toLatin1().constData(),age); + } else { + t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,i.key().toLatin1().constData(),age); + } + t+=t1; + } + qDebug() << "bb" << t; + if(m_ActiveStationsWidget != NULL) { + m_ActiveStationsWidget->erase(); + m_ActiveStationsWidget->displayRecentStations(t); + } + } +} + // -------------------------- Code for FT8 DXpedition Mode --------------------------- void MainWindow::hound_reply () diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index a2558fe81..821e5f496 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -373,6 +373,7 @@ private: void setColorHighlighting(); void chkFT4(); bool elide_tx1_not_allowed () const; + void readWidebandDecodes(); QProcessEnvironment const& m_env; NetworkAccessManager m_network_manager; @@ -701,6 +702,15 @@ private: }; QMap m_activeCall; //Key = callsign, value = grid4, az, points for ARRL_DIGI + struct EMECall + { + QString grid4; + double fsked; + qint32 t; + bool worked; + }; + QMap m_EMECall; + struct RecentCall { qint64 dialFreq; From f216648c05330656e2d82c5f7ed0e9f61fcf1e36 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 09:21:57 -0500 Subject: [PATCH 009/251] Remove forced nfreq=144 in astro.cpp. --- map65/astro.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map65/astro.cpp b/map65/astro.cpp index 427518382..b2eedce1a 100644 --- a/map65/astro.cpp +++ b/map65/astro.cpp @@ -63,7 +63,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, int isec=sec; double uth=nhr + nmin/60.0 + sec/3600.0; int nfreq=(int)datcom_.fcenter; - if(nfreq<10 or nfreq > 50000) nfreq=144; +// if(nfreq<10 or nfreq > 50000) nfreq=144; astrosub_(&nyear, &month, &nday, &uth, &nfreq, mygrid.toLatin1(), hisgrid.toLatin1(), &azsun, &elsun, &azmoon, &elmoon, From f7421feb622b5f67ae16afcb307a34de5a2113e7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 10:17:02 -0500 Subject: [PATCH 010/251] Initial build of q65w, an experiment to make a stripped-down map65. --- CMakeLists.txt | 4 +- CMakeLists.txt.0 | 1788 ++++++ q65w/.gitignore | 1 + q65w/CMakeLists.txt | 74 + q65w/LICENSE_WHEATLEY.TXT | 30 + q65w/MAP65_Beta_Release.docx | Bin 0 -> 23951 bytes q65w/about.cpp | 23 + q65w/about.h | 23 + q65w/about.ui | 37 + q65w/afmhot.dat | 257 + q65w/astro.cpp | 194 + q65w/astro.h | 32 + q65w/astro.ui | 249 + q65w/bandmap.cpp | 100 + q65w/bandmap.h | 35 + q65w/bandmap.ui | 43 + q65w/blue.dat | 256 + q65w/commons.h | 48 + q65w/devsetup.cpp | 389 ++ q65w/devsetup.h | 91 + q65w/devsetup.ui | 1813 +++++++ q65w/displaytext.cpp | 15 + q65w/displaytext.h | 22 + q65w/ffft.f | 69 + q65w/ft2000_freq.sh | 1 + q65w/getdev.cpp | 259 + q65w/getfile.cpp | 107 + q65w/getfile.h | 12 + q65w/getsvn.cmake | 16 + q65w/in.dat | 16 + q65w/killbyname.cpp | 282 + q65w/libm65/CMakeLists.txt | 148 + q65w/libm65/Makefile | 130 + q65w/libm65/Makefile.0 | 114 + q65w/libm65/Makefile.MinGW | 105 + q65w/libm65/Makefile.jtsdk | 129 + q65w/libm65/Makefile.linux | 96 + q65w/libm65/afc65b.f90 | 70 + q65w/libm65/astro.f90 | 105 + q65w/libm65/astro0.f90 | 81 + q65w/libm65/astrosub.f90 | 26 + q65w/libm65/averms.f90 | 20 + q65w/libm65/badmsg.f90 | 46 + q65w/libm65/ccf2.f90 | 45 + q65w/libm65/ccf65.f90 | 128 + q65w/libm65/cgen65.f90 | 99 + q65w/libm65/chkhist.f90 | 23 + q65w/libm65/chkmsg.f90 | 31 + q65w/libm65/coord.f90 | 40 + q65w/libm65/cutil.c | 93 + q65w/libm65/dcoord.f90 | 40 + q65w/libm65/decode0.f90 | 71 + q65w/libm65/decode1a.f90 | 145 + q65w/libm65/decode65b.f90 | 48 + q65w/libm65/decode_rs.c | 268 + q65w/libm65/deep65.f90 | 170 + q65w/libm65/deg2grid.f90 | 30 + q65w/libm65/demod64a.f90 | 77 + q65w/libm65/display.f90 | 179 + q65w/libm65/dot.f90 | 11 + q65w/libm65/dpol.f90 | 41 + q65w/libm65/encode65.f90 | 14 + q65w/libm65/encode_rs.c | 47 + q65w/libm65/extract.f90 | 136 + q65w/libm65/f77_wisdom.f | 45 + q65w/libm65/fchisq.f90 | 77 + q65w/libm65/fchisq0.f90 | 23 + q65w/libm65/fftw3.f | 64 + q65w/libm65/fftw3.f90 | 64 + q65w/libm65/fil6521.f90 | 44 + q65w/libm65/filbig.f90 | 132 + q65w/libm65/fmtmsg.f90 | 21 + q65w/libm65/four2a.f90 | 115 + q65w/libm65/ftninit.f90 | 31 + q65w/libm65/ftnquit.f90 | 8 + q65w/libm65/ftrsd2.c | 213 + q65w/libm65/gen65.f90 | 99 + q65w/libm65/gen_q65_cwave.f90 | 52 + q65w/libm65/gen_q65_wave.f90 | 54 + q65w/libm65/geocentric.f90 | 17 + q65w/libm65/getdphi.f90 | 18 + q65w/libm65/getpfx1.f90 | 96 + q65w/libm65/getpfx2.f90 | 24 + q65w/libm65/gran.c | 28 + q65w/libm65/graycode.f90 | 10 + q65w/libm65/graycode65.f90 | 9 + q65w/libm65/grid2deg.f90 | 38 + q65w/libm65/grid2k.f90 | 12 + q65w/libm65/igray.c | 22 + q65w/libm65/indexx.f90 | 91 + q65w/libm65/init_rs.c | 120 + q65w/libm65/int.h | 54 + q65w/libm65/interleave63.f90 | 25 + q65w/libm65/ipcomm.cpp | 34 + q65w/libm65/iqcal.f90 | 30 + q65w/libm65/iqfix.f90 | 28 + q65w/libm65/jt65code.f90 | 47 + q65w/libm65/k2grid.f90 | 12 + q65w/libm65/lorentzian.f90 | 102 + q65w/libm65/m65.f90 | 195 + q65w/libm65/m65a.f90 | 107 + q65w/libm65/map65a.f90 | 529 ++ q65w/libm65/mapsim.f90 | 229 + q65w/libm65/moon2.f90 | 163 + q65w/libm65/moondop.f90 | 72 + q65w/libm65/msgs.txt | 60 + q65w/libm65/nchar.f90 | 23 + q65w/libm65/njunk.f90 | 1 + q65w/libm65/noisegen.f90 | 13 + q65w/libm65/packjt.f90 | 996 ++++ q65w/libm65/pfx.f90 | 50 + q65w/libm65/pfxdump.f90 | 13 + q65w/libm65/polfit.f90 | 87 + q65w/libm65/ptt.c | 43 + q65w/libm65/ptt_unix.c | 405 ++ q65w/libm65/q65b.f90 | 204 + q65w/libm65/recvpkt.f90 | 73 + q65w/libm65/rfile3a.f90 | 14 + q65w/libm65/rs.h | 35 + q65w/libm65/rs2.h | 16 + q65w/libm65/s3avg.f90 | 60 + q65w/libm65/sec_midn.f90 | 11 + q65w/libm65/set.f90 | 31 + q65w/libm65/setup65.f90 | 96 + q65w/libm65/shell.f90 | 27 + q65w/libm65/sleep.h | 32 + q65w/libm65/sleep_msec.f90 | 4 + q65w/libm65/smo.f90 | 19 + q65w/libm65/sort.f90 | 6 + q65w/libm65/ssort.f | 287 + q65w/libm65/sun.f90 | 88 + q65w/libm65/symspec.f90 | 224 + q65w/libm65/synctest.f90 | 57 + q65w/libm65/synctst.f90 | 84 + q65w/libm65/synctst2.f90 | 91 + q65w/libm65/tastro.f90 | 35 + q65w/libm65/timeval.h | 76 + q65w/libm65/timf2.f90 | 215 + q65w/libm65/tm2.f90 | 14 + q65w/libm65/tmoonsub.c | 514 ++ q65w/libm65/toxyz.f90 | 25 + q65w/libm65/trimlist.f90 | 28 + q65w/libm65/twkfreq.f90 | 26 + q65w/libm65/twkfreq_xy.f90 | 29 + q65w/libm65/txpol.f90 | 33 + q65w/libm65/usleep.c | 7 + q65w/libm65/wavhdr.f90 | 110 + q65w/libm65/wideband_sync.f90 | 281 + q65w/libm65/wrapkarn.c | 70 + q65w/libm65/zplot.f90 | 34 + q65w/main.cpp | 43 + q65w/mainwindow.cpp | 2409 +++++++++ q65w/mainwindow.h | 330 ++ q65w/mainwindow.ui | 1742 ++++++ q65w/map65.pro | 70 + q65w/map65_config.h.in | 4 + q65w/map65b.iss | 46 + q65w/messages.cpp | 113 + q65w/messages.h | 44 + q65w/messages.ui | 107 + q65w/meterwidget.cpp | 49 + q65w/meterwidget.h | 30 + q65w/paInputDevice.c | 56 + q65w/pa_get_device_info.c | 173 + q65w/plotter.cpp | 792 +++ q65w/plotter.h | 139 + q65w/q65w.rc | 1 + q65w/resources/CALL3.TXT | 5708 ++++++++++++++++++++ q65w/resources/README.qthid.txt | 22 + q65w/resources/qt.conf | 2 + q65w/resources/qthid/AUTHORS.qthid.4.1.txt | 16 + q65w/resources/qthid/AUTHORS.qthid4.0.txt | 16 + q65w/resources/qthid/LICENSE.txt | 674 +++ q65w/resources/qthid/NEWS.qhid-4.0.txt | 64 + q65w/resources/qthid/NEWS.qthid-4.1.txt | 64 + q65w/resources/qthid/README-qthid-4.1.txt | 72 + q65w/resources/qthid/README.qthid-4.0.txt | 85 + q65w/resources/wisdom1.bat | 7 + q65w/resources/wisdom2.bat | 7 + q65w/set570.cpp | 272 + q65w/signalmeter.cpp | 53 + q65w/signalmeter.h | 32 + q65w/sleep.h | 16 + q65w/soundin.cpp | 451 ++ q65w/soundin.h | 82 + q65w/soundout.cpp | 207 + q65w/soundout.h | 44 + q65w/ss.bat | 1 + q65w/sss.bat | 1 + q65w/txtune.cpp | 116 + q65w/txtune.h | 48 + q65w/txtune.ui | 302 ++ q65w/widegraph.cpp | 388 ++ q65w/widegraph.h | 92 + q65w/widegraph.ui | 340 ++ q65w/wsjt.ico | Bin 0 -> 1078 bytes 196 files changed, 32222 insertions(+), 1 deletion(-) create mode 100644 CMakeLists.txt.0 create mode 100644 q65w/.gitignore create mode 100644 q65w/CMakeLists.txt create mode 100644 q65w/LICENSE_WHEATLEY.TXT create mode 100644 q65w/MAP65_Beta_Release.docx create mode 100644 q65w/about.cpp create mode 100644 q65w/about.h create mode 100644 q65w/about.ui create mode 100644 q65w/afmhot.dat create mode 100644 q65w/astro.cpp create mode 100644 q65w/astro.h create mode 100644 q65w/astro.ui create mode 100644 q65w/bandmap.cpp create mode 100644 q65w/bandmap.h create mode 100644 q65w/bandmap.ui create mode 100644 q65w/blue.dat create mode 100644 q65w/commons.h create mode 100644 q65w/devsetup.cpp create mode 100644 q65w/devsetup.h create mode 100644 q65w/devsetup.ui create mode 100644 q65w/displaytext.cpp create mode 100644 q65w/displaytext.h create mode 100644 q65w/ffft.f create mode 100644 q65w/ft2000_freq.sh create mode 100644 q65w/getdev.cpp create mode 100644 q65w/getfile.cpp create mode 100644 q65w/getfile.h create mode 100644 q65w/getsvn.cmake create mode 100644 q65w/in.dat create mode 100644 q65w/killbyname.cpp create mode 100644 q65w/libm65/CMakeLists.txt create mode 100644 q65w/libm65/Makefile create mode 100644 q65w/libm65/Makefile.0 create mode 100644 q65w/libm65/Makefile.MinGW create mode 100644 q65w/libm65/Makefile.jtsdk create mode 100644 q65w/libm65/Makefile.linux create mode 100644 q65w/libm65/afc65b.f90 create mode 100644 q65w/libm65/astro.f90 create mode 100644 q65w/libm65/astro0.f90 create mode 100644 q65w/libm65/astrosub.f90 create mode 100644 q65w/libm65/averms.f90 create mode 100644 q65w/libm65/badmsg.f90 create mode 100644 q65w/libm65/ccf2.f90 create mode 100644 q65w/libm65/ccf65.f90 create mode 100644 q65w/libm65/cgen65.f90 create mode 100644 q65w/libm65/chkhist.f90 create mode 100644 q65w/libm65/chkmsg.f90 create mode 100644 q65w/libm65/coord.f90 create mode 100644 q65w/libm65/cutil.c create mode 100644 q65w/libm65/dcoord.f90 create mode 100644 q65w/libm65/decode0.f90 create mode 100644 q65w/libm65/decode1a.f90 create mode 100644 q65w/libm65/decode65b.f90 create mode 100644 q65w/libm65/decode_rs.c create mode 100644 q65w/libm65/deep65.f90 create mode 100644 q65w/libm65/deg2grid.f90 create mode 100644 q65w/libm65/demod64a.f90 create mode 100644 q65w/libm65/display.f90 create mode 100644 q65w/libm65/dot.f90 create mode 100644 q65w/libm65/dpol.f90 create mode 100644 q65w/libm65/encode65.f90 create mode 100644 q65w/libm65/encode_rs.c create mode 100644 q65w/libm65/extract.f90 create mode 100644 q65w/libm65/f77_wisdom.f create mode 100644 q65w/libm65/fchisq.f90 create mode 100644 q65w/libm65/fchisq0.f90 create mode 100644 q65w/libm65/fftw3.f create mode 100644 q65w/libm65/fftw3.f90 create mode 100644 q65w/libm65/fil6521.f90 create mode 100644 q65w/libm65/filbig.f90 create mode 100644 q65w/libm65/fmtmsg.f90 create mode 100644 q65w/libm65/four2a.f90 create mode 100644 q65w/libm65/ftninit.f90 create mode 100644 q65w/libm65/ftnquit.f90 create mode 100644 q65w/libm65/ftrsd2.c create mode 100644 q65w/libm65/gen65.f90 create mode 100644 q65w/libm65/gen_q65_cwave.f90 create mode 100644 q65w/libm65/gen_q65_wave.f90 create mode 100644 q65w/libm65/geocentric.f90 create mode 100644 q65w/libm65/getdphi.f90 create mode 100644 q65w/libm65/getpfx1.f90 create mode 100644 q65w/libm65/getpfx2.f90 create mode 100644 q65w/libm65/gran.c create mode 100644 q65w/libm65/graycode.f90 create mode 100644 q65w/libm65/graycode65.f90 create mode 100644 q65w/libm65/grid2deg.f90 create mode 100644 q65w/libm65/grid2k.f90 create mode 100644 q65w/libm65/igray.c create mode 100644 q65w/libm65/indexx.f90 create mode 100644 q65w/libm65/init_rs.c create mode 100644 q65w/libm65/int.h create mode 100644 q65w/libm65/interleave63.f90 create mode 100644 q65w/libm65/ipcomm.cpp create mode 100644 q65w/libm65/iqcal.f90 create mode 100644 q65w/libm65/iqfix.f90 create mode 100644 q65w/libm65/jt65code.f90 create mode 100644 q65w/libm65/k2grid.f90 create mode 100644 q65w/libm65/lorentzian.f90 create mode 100644 q65w/libm65/m65.f90 create mode 100644 q65w/libm65/m65a.f90 create mode 100644 q65w/libm65/map65a.f90 create mode 100644 q65w/libm65/mapsim.f90 create mode 100644 q65w/libm65/moon2.f90 create mode 100644 q65w/libm65/moondop.f90 create mode 100644 q65w/libm65/msgs.txt create mode 100644 q65w/libm65/nchar.f90 create mode 100644 q65w/libm65/njunk.f90 create mode 100644 q65w/libm65/noisegen.f90 create mode 100644 q65w/libm65/packjt.f90 create mode 100644 q65w/libm65/pfx.f90 create mode 100644 q65w/libm65/pfxdump.f90 create mode 100644 q65w/libm65/polfit.f90 create mode 100644 q65w/libm65/ptt.c create mode 100644 q65w/libm65/ptt_unix.c create mode 100644 q65w/libm65/q65b.f90 create mode 100644 q65w/libm65/recvpkt.f90 create mode 100644 q65w/libm65/rfile3a.f90 create mode 100644 q65w/libm65/rs.h create mode 100644 q65w/libm65/rs2.h create mode 100644 q65w/libm65/s3avg.f90 create mode 100644 q65w/libm65/sec_midn.f90 create mode 100644 q65w/libm65/set.f90 create mode 100644 q65w/libm65/setup65.f90 create mode 100644 q65w/libm65/shell.f90 create mode 100644 q65w/libm65/sleep.h create mode 100644 q65w/libm65/sleep_msec.f90 create mode 100644 q65w/libm65/smo.f90 create mode 100644 q65w/libm65/sort.f90 create mode 100644 q65w/libm65/ssort.f create mode 100644 q65w/libm65/sun.f90 create mode 100644 q65w/libm65/symspec.f90 create mode 100644 q65w/libm65/synctest.f90 create mode 100644 q65w/libm65/synctst.f90 create mode 100644 q65w/libm65/synctst2.f90 create mode 100644 q65w/libm65/tastro.f90 create mode 100644 q65w/libm65/timeval.h create mode 100644 q65w/libm65/timf2.f90 create mode 100644 q65w/libm65/tm2.f90 create mode 100644 q65w/libm65/tmoonsub.c create mode 100644 q65w/libm65/toxyz.f90 create mode 100644 q65w/libm65/trimlist.f90 create mode 100644 q65w/libm65/twkfreq.f90 create mode 100644 q65w/libm65/twkfreq_xy.f90 create mode 100644 q65w/libm65/txpol.f90 create mode 100644 q65w/libm65/usleep.c create mode 100644 q65w/libm65/wavhdr.f90 create mode 100644 q65w/libm65/wideband_sync.f90 create mode 100644 q65w/libm65/wrapkarn.c create mode 100644 q65w/libm65/zplot.f90 create mode 100644 q65w/main.cpp create mode 100644 q65w/mainwindow.cpp create mode 100644 q65w/mainwindow.h create mode 100644 q65w/mainwindow.ui create mode 100644 q65w/map65.pro create mode 100644 q65w/map65_config.h.in create mode 100644 q65w/map65b.iss create mode 100644 q65w/messages.cpp create mode 100644 q65w/messages.h create mode 100644 q65w/messages.ui create mode 100644 q65w/meterwidget.cpp create mode 100644 q65w/meterwidget.h create mode 100644 q65w/paInputDevice.c create mode 100644 q65w/pa_get_device_info.c create mode 100644 q65w/plotter.cpp create mode 100644 q65w/plotter.h create mode 100644 q65w/q65w.rc create mode 100644 q65w/resources/CALL3.TXT create mode 100644 q65w/resources/README.qthid.txt create mode 100644 q65w/resources/qt.conf create mode 100644 q65w/resources/qthid/AUTHORS.qthid.4.1.txt create mode 100644 q65w/resources/qthid/AUTHORS.qthid4.0.txt create mode 100644 q65w/resources/qthid/LICENSE.txt create mode 100644 q65w/resources/qthid/NEWS.qhid-4.0.txt create mode 100644 q65w/resources/qthid/NEWS.qthid-4.1.txt create mode 100644 q65w/resources/qthid/README-qthid-4.1.txt create mode 100644 q65w/resources/qthid/README.qthid-4.0.txt create mode 100644 q65w/resources/wisdom1.bat create mode 100644 q65w/resources/wisdom2.bat create mode 100644 q65w/set570.cpp create mode 100644 q65w/signalmeter.cpp create mode 100644 q65w/signalmeter.h create mode 100644 q65w/sleep.h create mode 100644 q65w/soundin.cpp create mode 100644 q65w/soundin.h create mode 100644 q65w/soundout.cpp create mode 100644 q65w/soundout.h create mode 100644 q65w/ss.bat create mode 100644 q65w/sss.bat create mode 100644 q65w/txtune.cpp create mode 100644 q65w/txtune.h create mode 100644 q65w/txtune.ui create mode 100644 q65w/widegraph.cpp create mode 100644 q65w/widegraph.h create mode 100644 q65w/widegraph.ui create mode 100644 q65w/wsjt.ico diff --git a/CMakeLists.txt b/CMakeLists.txt index c47d51eca..c6a14854e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1422,9 +1422,11 @@ endif (${OPENMP_FOUND} OR APPLE) if (WIN32) # build map65 find_package (Portaudio REQUIRED) - add_subdirectory (map65) +# add_subdirectory (map65) + add_subdirectory (q65w) endif () + # build the main application generate_version_info (wsjtx_VERSION_RESOURCES NAME wsjtx diff --git a/CMakeLists.txt.0 b/CMakeLists.txt.0 new file mode 100644 index 000000000..c47d51eca --- /dev/null +++ b/CMakeLists.txt.0 @@ -0,0 +1,1788 @@ +cmake_minimum_required (VERSION 3.7.2 FATAL_ERROR) + +if (APPLE) + # + # The following variables define the portability and compatability attributes of the Mac macOS build + # they are choosen with care and should not be changed without good cause. + # + # Among other things these options are chosen to match the portability and compatability options of the + # Qt framework dylibs which can be checked as follows: + # + # otool -l | grep -A3 LC_VERSION_MIN_MACOSX + # + set (CMAKE_OSX_DEPLOYMENT_TARGET 10.12 + CACHE STRING "Earliest version of macOS supported + +Earliest version we can support with Qt 5.12, C++11 & libc++ is 10.12. +Do not override this if you intend to build an official deployable installer.") +endif (APPLE) + +# +# CMake policies +# +if (POLICY CMP0020) + cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows +endif () + +if (POLICY CMP0043) + cmake_policy (SET CMP0043 NEW) # ignore COMPILE_DEFINITIONS_ +endif () + +if (POLICY CMP0048) + cmake_policy (SET CMP0048 NEW) # clear PROJECT_Version_* variables if not set in project() command +endif () + +if (POLICY CMP0063) + cmake_policy (SET CMP0063 NEW) # honour visibility properties for all library types +endif () + +if (POLICY CMP0071) + cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources +endif () + +if (POLICY CMP0075) + cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks +endif () + +project (wsjtx + VERSION 2.6.0.0 + LANGUAGES C CXX Fortran + ) +set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") +set (CMAKE_PROJECT_DESCRIPTION ${PROJECT_DESCRIPTION}) + +# +# Local CMake modules and support files +# +set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) + +set (PROJECT_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") +if (NOT PROJECT_ARCHITECTURE) + # This is supposed to happen already on Windows + if (CMAKE_SIZEOF_VOID_P MATCHES 8) + set (PROJECT_ARCHITECTURE "x64") + else () + set (PROJECT_ARCHITECTURE "$ENV{PROCESSOR_ARCHITECTURE}") + endif () +endif () +message (STATUS "******************************************************") +message (STATUS "Building for for: ${CMAKE_SYSTEM_NAME}-${PROJECT_ARCHITECTURE}") +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 5) +set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") + +# +# project information +# +set (PROJECT_BUNDLE_NAME "WSJT-X") +set (PROJECT_VENDOR "Joe Taylor, K1JT") +set (PROJECT_CONTACT "Joe Taylor ") +set (PROJECT_COPYRIGHT "Copyright (C) 2001-2022 by Joe Taylor, K1JT") +set (PROJECT_HOMEPAGE https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html) +set (PROJECT_MANUAL wsjtx-main) +set (PROJECT_MANUAL_DIRECTORY_URL https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/) +set (PROJECT_SAMPLES_URL http://downloads.sourceforge.net/project/wsjt/) +set (PROJECT_SAMPLES_UPLOAD_DEST frs.sourceforge.net:/home/frs/project/wsjt/) + +# make sure that the default configuration is a RELEASE +if (NOT CMAKE_BUILD_TYPE) + set (CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are: None Debug Release." + FORCE) +endif (NOT CMAKE_BUILD_TYPE) +if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") + set (is_debug_build 1) +endif () + + +# +# Options & features +# +# Some of these directly effect compilation by being defined in +# wsjtx_config.h.in which makes them available to the C/C++ +# pre-processor. +# +include (CMakeDependentOption) + +# Allow the developer to select if Dynamic or Static libraries are built +OPTION (BUILD_SHARED_LIBS "Build Shared Libraries" OFF) +# Set the LIB_TYPE variable to STATIC +SET (LIB_TYPE STATIC) +if (BUILD_SHARED_LIBS) + # User wants to build Dynamic Libraries, so change the LIB_TYPE variable to CMake keyword 'SHARED' + set (LIB_TYPE SHARED) +endif (BUILD_SHARED_LIBS) + +option (UPDATE_TRANSLATIONS "Update source translation translations/*.ts +files (WARNING: make clean will delete the source .ts files! Danger!)") +option (WSJT_SHARED_RUNTIME "Debugging option that allows running from a shared Cloud directory.") +option (WSJT_QDEBUG_TO_FILE "Redirect Qt debuging messages to a trace file.") +option (WSJT_SOFT_KEYING "Apply a ramp to CW keying envelope to reduce transients." ON) +option (WSJT_SKIP_MANPAGES "Skip *nix manpage generation.") +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 + "The wsjtx target is normally built as GUI executable with a WinMain entry point on Windows, +if you want a console application instead then set this option to OFF. + +If you just want to see the debug output from the application then the easiest way is to +attach a debugger which will then receive the console output inside its console." ON + "WIN32" OFF) + +# +# install locations +# + +if (APPLE) + set (CMAKE_INSTALL_BINDIR ${CMAKE_PROJECT_NAME}.app/Contents/MacOS) + set (CMAKE_INSTALL_DATAROOTDIR ${CMAKE_PROJECT_NAME}.app/Contents/Resources) +endif () + +include (GNUInstallDirs) + +set (PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins) +set (QT_CONF_DESTINATION ${CMAKE_INSTALL_BINDIR}) +if (WIN32) + set (PLUGIN_DESTINATION plugins) +elseif (APPLE) + set (PLUGIN_DESTINATION ${CMAKE_INSTALL_BINDIR}/../PlugIns) + set (QT_CONF_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}) +endif () + +set (WSJT_PLUGIN_DESTINATION ${PLUGIN_DESTINATION} CACHE PATH "Path for plugins") +set (WSJT_QT_CONF_DESTINATION ${QT_CONF_DESTINATION} CACHE PATH "Path for the qt.conf file") + + +# +# Project sources +# +set (fort_qt_CXXSRCS + lib/shmem.cpp + ) + +set (wsjt_qt_CXXSRCS + helper_functions.cpp + qt_helpers.cpp + widgets/MessageBox.cpp + MetaDataRegistry.cpp + Network/NetworkServerLookup.cpp + revision_utils.cpp + L10nLoader.cpp + WFPalette.cpp + Radio.cpp + RadioMetaType.cpp + NonInheritingProcess.cpp + models/IARURegions.cpp + models/Bands.cpp + models/Modes.cpp + models/FrequencyList.cpp + models/StationList.cpp + widgets/FrequencyLineEdit.cpp + widgets/FrequencyDeltaLineEdit.cpp + item_delegates/CandidateKeyFilter.cpp + item_delegates/ForeignKeyDelegate.cpp + item_delegates/MessageItemDelegate.cpp + validators/LiveFrequencyValidator.cpp + GetUserId.cpp + Audio/AudioDevice.cpp + Transceiver/Transceiver.cpp + Transceiver/TransceiverBase.cpp + Transceiver/EmulateSplitTransceiver.cpp + Transceiver/TransceiverFactory.cpp + Transceiver/PollingTransceiver.cpp + Transceiver/HamlibTransceiver.cpp + Transceiver/HRDTransceiver.cpp + Transceiver/DXLabSuiteCommanderTransceiver.cpp + Network/NetworkMessage.cpp + Network/MessageClient.cpp + widgets/LettersSpinBox.cpp + widgets/HintedSpinBox.cpp + widgets/RestrictedSpinBox.cpp + widgets/HelpTextWindow.cpp + SampleDownloader.cpp + SampleDownloader/DirectoryDelegate.cpp + SampleDownloader/Directory.cpp + SampleDownloader/FileNode.cpp + SampleDownloader/RemoteFile.cpp + DisplayManual.cpp + MultiSettings.cpp + validators/MaidenheadLocatorValidator.cpp + validators/CallsignValidator.cpp + widgets/SplashScreen.cpp + EqualizationToolsDialog.cpp + widgets/DoubleClickablePushButton.cpp + widgets/DoubleClickableRadioButton.cpp + Network/LotWUsers.cpp + models/DecodeHighlightingModel.cpp + widgets/DecodeHighlightingListView.cpp + models/FoxLog.cpp + widgets/AbstractLogWindow.cpp + widgets/FoxLogWindow.cpp + widgets/CabrilloLogWindow.cpp + item_delegates/CallsignDelegate.cpp + item_delegates/MaidenheadLocatorDelegate.cpp + item_delegates/FrequencyDelegate.cpp + item_delegates/FrequencyDeltaDelegate.cpp + item_delegates/SQLiteDateTimeDelegate.cpp + models/CabrilloLog.cpp + logbook/AD1CCty.cpp + logbook/WorkedBefore.cpp + logbook/Multiplier.cpp + Network/NetworkAccessManager.cpp + widgets/LazyFillComboBox.cpp + widgets/CheckableItemComboBox.cpp + widgets/BandComboBox.cpp + ) + +set (wsjt_qtmm_CXXSRCS + Audio/BWFFile.cpp + ) + +set (jt9_FSRCS + lib/jt9.f90 + lib/jt9a.f90 + ) + +set (wsjtx_CXXSRCS + WSJTXLogging.cpp + logbook/logbook.cpp + Network/PSKReporter.cpp + Modulator/Modulator.cpp + Detector/Detector.cpp + widgets/logqso.cpp + widgets/displaytext.cpp + Decoder/decodedtext.cpp + getfile.cpp + Audio/soundout.cpp + Audio/soundin.cpp + widgets/meterwidget.cpp + widgets/signalmeter.cpp + widgets/plotter.cpp + widgets/widegraph.cpp + widgets/echograph.cpp + widgets/echoplot.cpp + widgets/fastgraph.cpp + widgets/fastplot.cpp + widgets/about.cpp + widgets/astro.cpp + widgets/messageaveraging.cpp + widgets/activeStations.cpp + widgets/colorhighlighting.cpp + WSPR/WsprTxScheduler.cpp + widgets/mainwindow.cpp + Configuration.cpp + main.cpp + Network/wsprnet.cpp + WSPR/WSPRBandHopping.cpp + widgets/ExportCabrillo.cpp + ) + +set (wsjt_CXXSRCS + Logger.cpp + lib/crc10.cpp + lib/crc13.cpp + lib/crc14.cpp + ) +# deal with a GCC v6 UB error message +set_source_files_properties ( + lib/crc10.cpp + lib/crc13.cpp + lib/crc14.cpp + PROPERTIES COMPILE_FLAGS -fpermissive) + +if (WIN32) + set (wsjt_CXXSRCS + ${wsjt_CXXSRCS} + killbyname.cpp + ) + + set (wsjt_qt_CXXSRCS + ${wsjt_qt_CXXSRCS} + Transceiver/OmniRigTransceiver.cpp + ) +endif (WIN32) + +set (wsjt_FSRCS + # put module sources first in the hope that they get rebuilt before use + lib/types.f90 + lib/C_interface_module.f90 + lib/shmem.f90 + lib/crc.f90 + lib/fftw3mod.f90 + lib/hashing.f90 + lib/iso_c_utilities.f90 + lib/jt4.f90 + lib/jt4_decode.f90 + lib/jt65_decode.f90 + lib/jt65_mod.f90 + lib/ft8_decode.f90 + lib/ft4_decode.f90 + lib/fst4_decode.f90 + lib/jt9_decode.f90 + lib/options.f90 + lib/packjt.f90 + lib/77bit/packjt77.f90 + lib/qra/q65/q65.f90 + lib/q65_decode.f90 + lib/readwav.f90 + lib/timer_C_wrapper.f90 + lib/timer_impl.f90 + lib/timer_module.f90 + lib/wavhdr.f90 + lib/qra/q65/q65_encoding_modules.f90 + lib/ft8/ft8_a7.f90 + + # remaining non-module sources + lib/addit.f90 + lib/afc65b.f90 + lib/afc9.f90 + lib/ana64.f90 + lib/ana932.f90 + lib/analytic.f90 + lib/astro.f90 + lib/astrosub.f90 + lib/astro0.f90 + lib/avecho.f90 + lib/averms.f90 + lib/azdist.f90 + lib/ft8/baseline.f90 + lib/ft4/ft4_baseline.f90 + lib/blanker.f90 + lib/bpdecode40.f90 + lib/bpdecode128_90.f90 + lib/ft8/bpdecode174_91.f90 + lib/baddata.f90 + lib/calibrate.f90 + lib/ccf2.f90 + lib/ccf65.f90 + lib/ft8/chkcrc13a.f90 + lib/ft8/chkcrc14a.f90 + lib/chkcall.f90 + lib/chkhist.f90 + lib/chkmsg.f90 + lib/chkss2.f90 + lib/ft4/clockit.f90 + lib/ft8/compress.f90 + lib/coord.f90 + lib/db.f90 + lib/decode4.f90 + lib/decode65a.f90 + lib/decode65b.f90 + lib/decode9w.f90 + lib/ft8/decode174_91.f90 + lib/decoder.f90 + lib/deep4.f90 + lib/deg2grid.f90 + lib/degrade_snr.f90 + lib/demod64a.f90 + lib/determ.f90 + lib/downsam9.f90 + lib/echosim.f90 + lib/echo_snr.f90 + lib/encode232.f90 + lib/encode4.f90 + lib/encode_msk40.f90 + lib/encode_128_90.f90 + lib/ft8/encode174_91.f90 + lib/ft8/encode174_91_nocrc.f90 + lib/entail.f90 + lib/ephem.f90 + lib/extract.f90 + lib/extract4.f90 + lib/extractmessage77.f90 + lib/fano232.f90 + lib/fast9.f90 + lib/fast_decode.f90 + lib/fchisq.f90 + lib/fchisq0.f90 + lib/fchisq65.f90 + lib/fil3.f90 + lib/fil3c.f90 + lib/fil4.f90 + lib/fil6521.f90 + lib/filbig.f90 + lib/ft8/filt8.f90 + lib/fitcal.f90 + lib/flat1.f90 + lib/flat1a.f90 + lib/flat1b.f90 + lib/flat2.f90 + lib/flat4.f90 + lib/flat65.f90 + lib/fmtmsg.f90 + lib/foldspec9f.f90 + lib/four2a.f90 + lib/fspread_lorentz.f90 + lib/ft8/foxfilt.f90 + lib/ft8/foxgen.f90 + lib/ft8/foxgen_wrap.f90 + lib/freqcal.f90 + lib/ft8/ft8apset.f90 + lib/ft8/ft8b.f90 + lib/ft8/ft8code.f90 + lib/ft8/ft8_downsample.f90 + lib/ft8/ft8sim.f90 + lib/gen4.f90 + lib/gen65.f90 + lib/gen9.f90 + lib/genwave.f90 + lib/ft8/genft8.f90 + lib/qra/q65/genq65.f90 + lib/genmsk_128_90.f90 + lib/genmsk40.f90 + lib/ft4/ft4code.f90 + lib/ft4/genft4.f90 + lib/ft4/gen_ft4wave.f90 + lib/ft8/gen_ft8wave.f90 + lib/ft8/genft8refsig.f90 + lib/genwspr.f90 + lib/geodist.f90 + lib/ft8/get_crc14.f90 + lib/getlags.f90 + lib/getmet4.f90 + lib/ft8/get_spectrum_baseline.f90 + lib/ft2/gfsk_pulse.f90 + lib/graycode.f90 + lib/graycode65.f90 + lib/grayline.f90 + lib/grid2deg.f90 + lib/ft8/h1.f90 + lib/hash.f90 + lib/hint65.f90 + lib/hspec.f90 + lib/indexx.f90 + lib/init_random_seed.f90 + lib/interleave4.f90 + lib/interleave63.f90 + lib/interleave9.f90 + lib/inter_wspr.f90 + lib/jplsubs.f + lib/jt9fano.f90 + lib/libration.f90 + lib/lorentzian.f90 + lib/fst4/lorentzian_fading.f90 + lib/lpf1.f90 + lib/map65_mmdec.f90 + lib/mixlpf.f90 + lib/makepings.f90 + lib/moondopjpl.f90 + lib/morse.f90 + lib/move.f90 + lib/msk40decodeframe.f90 + lib/msk144decodeframe.f90 + lib/msk40spd.f90 + lib/msk144spd.f90 + lib/msk40sync.f90 + lib/msk144sync.f90 + lib/msk40_freq_search.f90 + lib/msk144_freq_search.f90 + lib/mskrtd.f90 + lib/msk144signalquality.f90 + lib/msk144sim.f90 + lib/mskrtd.f90 + lib/nuttal_window.f90 + lib/ft4/ft4sim.f90 + lib/ft4/ft4sim_mult.f90 + lib/ft4/ft4_downsample.f90 + lib/77bit/my_hash.f90 + lib/wsprd/osdwspr.f90 + lib/ft8/osd174_91.f90 + lib/osd128_90.f90 + lib/pctile.f90 + lib/peakdt9.f90 + lib/peakup.f90 + lib/plotsave.f90 + lib/platanh.f90 + lib/pltanh.f90 + lib/polyfit.f90 + lib/prog_args.f90 + lib/ps4.f90 + lib/qra/q65/q65_ap.f90 + lib/qra/q65/q65_loops.f90 + lib/qra/q65/q65_set_list.f90 + lib/refspectrum.f90 + lib/savec2.f90 + lib/save_dxbase.f90 + lib/save_echo_params.f90 + lib/sec0.f90 + lib/sec_midn.f90 + lib/setup65.f90 + lib/sh65.f90 + lib/sh65snr.f90 + lib/slasubs.f + lib/sleep_msec.f90 + lib/slope.f90 + lib/smo.f90 + lib/smo121.f90 + lib/softsym.f90 + lib/softsym9f.f90 + lib/softsym9w.f90 + lib/shell.f90 + lib/spec64.f90 + lib/spec9f.f90 + lib/stdmsg.f90 + lib/subtract65.f90 + lib/ft8/subtractft8.f90 + lib/ft4/subtractft4.f90 + lib/sun.f90 + lib/symspec.f90 + lib/symspec2.f90 + lib/symspec65.f90 + lib/sync4.f90 + lib/sync65.f90 + lib/ft4/getcandidates4.f90 + lib/ft4/get_ft4_bitmetrics.f90 + lib/ft8/sync8.f90 + lib/ft8/sync8d.f90 + lib/ft4/sync4d.f90 + lib/sync9.f90 + lib/sync9f.f90 + lib/sync9w.f90 + lib/test_snr.f90 + lib/timf2.f90 + lib/tweak1.f90 + lib/twkfreq.f90 + lib/ft8/twkfreq1.f90 + lib/twkfreq65.f90 + lib/update_recent_calls.f90 + lib/update_msk40_hasharray.f90 + lib/ft8/watterson.f90 + lib/wav11.f90 + lib/wav12.f90 + lib/xcor.f90 + lib/xcor4.f90 + lib/wqdecode.f90 + lib/wqencode.f90 + lib/wspr_downsample.f90 + lib/zplot9.f90 + lib/fst4/decode240_101.f90 + lib/fst4/decode240_74.f90 + lib/fst4/encode240_101.f90 + lib/fst4/encode240_74.f90 + lib/fst4/fst4sim.f90 + lib/fst4/gen_fst4wave.f90 + lib/fst4/genfst4.f90 + lib/fst4/get_fst4_bitmetrics.f90 + lib/fst4/get_fst4_bitmetrics2.f90 + lib/fst4/ldpcsim240_101.f90 + lib/fst4/ldpcsim240_74.f90 + lib/fst4/osd240_101.f90 + lib/fst4/osd240_74.f90 + lib/fst4/fastosd240_74.f90 + lib/fst4/get_crc24.f90 + lib/fst4/fst4_baseline.f90 + ) + +# temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit +set_source_files_properties (lib/slasubs.f PROPERTIES COMPILE_FLAGS -O2) + +set (ka9q_CSRCS + lib/ftrsd/decode_rs.c + lib/ftrsd/encode_rs.c + lib/ftrsd/init_rs.c + ) +set_source_files_properties (${ka9q_CSRCS} PROPERTIES COMPILE_FLAGS -Wno-sign-compare) + +set (qra_CSRCS + lib/qra/qracodes/qra12_63_64_irr_b.c + lib/qra/qracodes/qra13_64_64_irr_e.c + lib/qra/q65/npfwht.c + lib/qra/q65/pdmath.c + lib/qra/q65/qracodes.c + lib/qra/q65/normrnd.c + lib/qra/q65/qra15_65_64_irr_e23.c + lib/qra/q65/q65.c + lib/qra/q65/q65_subs.c + ) + +set (wsjt_CSRCS + ${ka9q_CSRCS} + lib/ftrsd/ftrsdap.c + lib/sgran.c + lib/golay24_table.c + lib/gran.c + lib/igray.c + lib/init_random_seed.c + lib/ldpc32_table.c + lib/wsprd/nhash.c + lib/tab.c + lib/tmoonsub.c + lib/usleep.c + lib/vit213.c + lib/wisdom.c + lib/wrapkarn.c + ${ldpc_CSRCS} + ${qra_CSRCS} + ) + +set (wsjt_qt_UISRCS + wf_palette_design_dialog.ui + widgets/FoxLogWindow.ui + widgets/CabrilloLogWindow.ui + ) + +set (wsprsim_CSRCS + lib/wsprd/wsprsim.c + lib/wsprd/wsprsim_utils.c + lib/wsprd/wsprd_utils.c + lib/wsprd/fano.c + lib/wsprd/tab.c + lib/wsprd/nhash.c + ) + +set (wsprd_CSRCS + lib/wsprd/wsprd.c + lib/wsprd/wsprsim_utils.c + lib/wsprd/wsprd_utils.c + lib/wsprd/fano.c + lib/wsprd/jelinek.c + lib/wsprd/tab.c + lib/wsprd/nhash.c + lib/init_random_seed.c + ) + +set (wsjtx_UISRCS + widgets/mainwindow.ui + widgets/about.ui + widgets/astro.ui + widgets/colorhighlighting.ui + widgets/echograph.ui + widgets/fastgraph.ui + widgets/messageaveraging.ui + widgets/activeStations.ui + widgets/widegraph.ui + widgets/logqso.ui + Configuration.ui + widgets/ExportCabrillo.ui + ) + +set (UDP_library_CXXSRCS + Radio.cpp + RadioMetaType.cpp + Network/NetworkMessage.cpp + UDPExamples/MessageServer.cpp + ) + +set (UDP_library_HEADERS + Radio.hpp + UDPExamples/MessageServer.hpp + ${PROJECT_BINARY_DIR}/udp_export.h + ) + +set (message_aggregator_CXXSRCS + UDPExamples/MessageAggregator.cpp + UDPExamples/MessageAggregatorMainWindow.cpp + UDPExamples/DecodesModel.cpp + UDPExamples/BeaconsModel.cpp + UDPExamples/ClientWidget.cpp + validators/MaidenheadLocatorValidator.cpp + ) + +set (message_aggregator_STYLESHEETS + UDPExamples/qss/default.qss + ) + +set (qcp_CXXSRCS + qcustomplot-source/qcustomplot.cpp + ) + +set (all_CXXSRCS + ${wsjt_CXXSRCS} + ${fort_qt_CXXSRCS} + ${wsjt_qt_CXXSRCS} + ${wsjt_qtmm_CXXSRCS} + ${wsjtx_CXXSRCS} + ${qcp_CXXSRCS} + ) + +set (all_C_and_CXXSRCS + ${wsjt_CSRCS} + ${wsprsim_CSRCS} + ${wsprd_CSRCS} + ${all_CXXSRCS} + ) + +set (TOP_LEVEL_RESOURCES + icons/Darwin/wsjtx.iconset/icon_128x128.png + contrib/gpl-v3-logo.svg + artwork/splash.png + ) + +set (PALETTE_FILES + Palettes/Banana.pal + Palettes/Blue1.pal + Palettes/Blue2.pal + Palettes/Blue3.pal + Palettes/Brown.pal + Palettes/Cyan1.pal + Palettes/Cyan2.pal + Palettes/Cyan3.pal + Palettes/Default.pal + Palettes/Digipan.pal + Palettes/Fldigi.pal + Palettes/Gray1.pal + Palettes/Gray2.pal + Palettes/Green1.pal + Palettes/Green2.pal + Palettes/Jungle.pal + Palettes/Linrad.pal + Palettes/Negative.pal + Palettes/Orange.pal + Palettes/Pink.pal + Palettes/Rainbow.pal + Palettes/Scope.pal + Palettes/Sunburst.pal + Palettes/VK4BDJ.pal + Palettes/YL2KF.pal + Palettes/Yellow1.pal + Palettes/Yellow2.pal + Palettes/ZL1FZ.pal +) + +if (APPLE) + set (WSJTX_ICON_FILE ${CMAKE_PROJECT_NAME}.icns) + set (ICONSRCS + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16@2x.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32@2x.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128@2x.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256@2x.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512.png + icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512@2x.png + ) + add_custom_command ( + OUTPUT ${WSJTX_ICON_FILE} + COMMAND iconutil -c icns --output "${CMAKE_BINARY_DIR}/${WSJTX_ICON_FILE}" "${CMAKE_SOURCE_DIR}/icons/Darwin/${CMAKE_PROJECT_NAME}.iconset" + DEPENDS ${ICONSRCS} + COMMENT "Building Icons" + ) +else () + set (WSJTX_ICON_FILE icons/windows-icons/wsjtx.ico) +endif (APPLE) + +set_source_files_properties (${WSJTX_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + +# suppress intransigent compiler diagnostics +set_source_files_properties (lib/decoder.f90 PROPERTIES COMPILE_FLAGS "-Wno-unused-dummy-argument") +set_source_files_properties (lib/filbig.f90 PROPERTIES COMPILE_FLAGS "-Wno-aliasing") + +## disable Qt trace and warning messages from release configurations +#set_property (DIRECTORY APPEND PROPERTY +# COMPILE_DEFINITIONS $<$>:QT_NO_DEBUG_OUTPUT;QT_NO_WARNING_OUTPUT> +# ) + +set_property (SOURCE ${all_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") +set_property (SOURCE ${all_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h) + +if (WIN32) + # generate the OmniRig COM interface source + find_program (DUMPCPP dumpcpp) + if (DUMPCPP-NOTFOUND) + message (FATAL_ERROR "dumpcpp tool not found") + endif (DUMPCPP-NOTFOUND) + execute_process ( + COMMAND ${DUMPCPP} -getfile {4FE359C5-A58F-459D-BE95-CA559FB4F270} + OUTPUT_VARIABLE AXSERVER + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string (STRIP "${AXSERVER}" AXSERVER) + if (NOT AXSERVER) + message (FATAL_ERROR "You need to install OmniRig on this computer") + endif (NOT AXSERVER) + string (REPLACE "\"" "" AXSERVER ${AXSERVER}) + file (TO_CMAKE_PATH ${AXSERVER} AXSERVERSRCS) +endif () + + +# +# decide on platform specifc packing and fixing up +# +if (APPLE) + set (WSJTX_BUNDLE_VERSION ${wsjtx_VERSION}) + + # make sure CMAKE_INSTALL_PREFIX ends in / + string (LENGTH "${CMAKE_INSTALL_PREFIX}" LEN) + math (EXPR LEN "${LEN} -1" ) + string (SUBSTRING "${CMAKE_INSTALL_PREFIX}" ${LEN} 1 ENDCH) + if (NOT "${ENDCH}" STREQUAL "/") + set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/") + endif () +endif (APPLE) + + +# +# find some useful tools +# +include (CheckTypeSize) +include (CheckCSourceCompiles) +include (CheckIncludeFiles) +include (CheckSymbolExists) +include (generate_version_info) + +find_program(CTAGS ctags) +find_program(ETAGS etags) + +# +# Platform checks +# +check_include_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) +check_include_files (stdio.h HAVE_STDIO_H) +check_include_files (stdlib.h HAVE_STDLIB_H) +check_include_files (unistd.h HAVE_UNISTD_H) +check_include_files (sys/ioctl.h HAVE_SYS_IOCTL_H) +check_include_files (sys/types.h HAVE_SYS_TYPES_H) +check_include_files (fcntl.h HAVE_FCNTL_H) +check_include_files (sys/stat.h HAVE_SYS_STAT_H) +check_include_files ("linux/ppdev.h;linux/parport.h" HAVE_LINUX_PPDEV_H) +check_include_files ("dev/ppbus/ppi.h;dev/ppbus/ppbconf.h" HAVE_DEV_PPBUS_PPI_H) + +# +# Standard C Math Library +# +set (LIBM_TEST_SOURCE "#include\nfloat f; int main(){sqrt(f);return 0;}") +check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_MATH) +if (HAVE_MATH) + set (LIBM_LIBRARIES) +else () + set (CMAKE_REQUIRED_LIBRARIES m) + check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_LIBM_MATH) + unset (CMAKE_REQUIRED_LIBRARIES) + if (NOT HAVE_LIBM_MATH) + message (FATAL_ERROR "Unable to use C math library functions") + endif () + set (LIBM_LIBRARIES m) +endif () + +# +# Boost +# +if (WIN32) + set (Boost_USE_STATIC_LIBS OFF) +endif () +find_package (Boost 1.62 REQUIRED COMPONENTS log_setup log) + +# +# OpenMP +# +find_package (OpenMP) + +# +# fftw3 single precision library +# +find_package (FFTW3 COMPONENTS single threads REQUIRED) + +# +# hamlib setup +# +find_package (Hamlib REQUIRED) +find_program (RIGCTL_EXE rigctl) +find_program (RIGCTLD_EXE rigctld) +find_program (RIGCTLCOM_EXE rigctlcom) + +check_type_size (CACHE_ALL HAMLIB_OLD_CACHING) +check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING) + +find_package (Usb REQUIRED) + +# +# Qt5 setup +# + +# Widgets finds its own dependencies. +find_package (Qt5 COMPONENTS Widgets SerialPort Multimedia PrintSupport Sql LinguistTools REQUIRED) + +if (WIN32) + add_definitions (-DQT_NEEDS_QTMAIN) + find_package (Qt5AxContainer REQUIRED) +endif (WIN32) + +# +# Library building setup +# +include (GenerateExportHeader) +set (CMAKE_CXX_VISIBILITY_PRESET hidden) +set (CMAKE_C_VISIBILITY_PRESET hidden) +set (CMAKE_Fortran_VISIBILITY_PRESET hidden) +set (CMAKE_VISIBILITY_INLINES_HIDDEN ON) +#set (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) + + +# +# C & C++ setup +# +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra -fexceptions -frtti") + +if (NOT APPLE) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pragmas") + if (${OPENMP_FOUND}) + if (OpenMP_C_FLAGS) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_C_FLAGS}") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + endif () + endif () + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fdata-sections -ffunction-sections") + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fdata-sections -ffunction-sections") + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") +endif (NOT APPLE) + +if (WIN32) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") +endif (WIN32) +if (APPLE AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") +else () + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=gnu++11 -pthread") +endif () + + +# +# Fortran setup +# +set (General_FFLAGS "-Wall -Wno-conversion -fno-second-underscore") + +# FFLAGS depend on the compiler +get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) + +if (Fortran_COMPILER_NAME MATCHES "gfortran.*") + # gfortran + + # CMake compiler test is supposed to do this but doesn't yet + if (CMAKE_OSX_DEPLOYMENT_TARGET) + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") + endif (CMAKE_OSX_DEPLOYMENT_TARGET) + if (CMAKE_OSX_SYSROOT) + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") + endif (CMAKE_OSX_SYSROOT) + + set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + +set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + + # FPE traps currently disabled in Debug configuration builds until + # we decide if they are meaningful, without these FP instructions + # run in nonstop mode and do not trap + #set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${CMAKE_Fortran_FLAGS_DEBUG} -ffpe-trap=invalid,zero,overflow") + +elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") + # ifort (untested) + set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -f77rtl ${General_FFLAGS}") + set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -f77rtl ${General_FFLAGS}") +elseif (Fortran_COMPILER_NAME MATCHES "g77") + # g77 + set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -funroll-all-loops -fno-f2c -m32 ${General_FFLAGS}") + set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check -fno-f2c -m32 ${General_FFLAGS}") +else (Fortran_COMPILER_NAME MATCHES "gfortran.*") + message ("CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER}) + message ("Fortran compiler: " ${Fortran_COMPILER_NAME}) + message ("No optimized Fortran compiler flags are known, we just try -O3...") + set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -O3 ${General_FFLAGS}") + set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check ${General_FFLAGS}") +endif (Fortran_COMPILER_NAME MATCHES "gfortran.*") + + +# +# Linker setup +# +if (NOT APPLE) + set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections") + set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -Wl,--gc-sections") +endif (NOT APPLE) + + +# +# setup and test Fortran C/C++ interaction +# + +include (FortranCInterface) +FortranCInterface_VERIFY (CXX) +FortranCInterface_HEADER (FC.h MACRO_NAMESPACE "FC_" SYMBOL_NAMESPACE "FC_" + SYMBOLS + grayline + ) + + +# +# sort out pre-requisites +# + +# +# Setup RPATH so that built executable targets will run in both the +# build tree and the install location without having to set a +# (DYLD|LD)_LIBRARY_PATH override. +# + +# use the full RPATH of the build tree +set (CMAKE_SKIP_BUILD_RPATH FALSE) + +# when building, don't use the install RPATH, it will still be used +# later on in the install phase +set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) + +# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + +# add the automaticaly determined parts of the RPATH which point to +# directories outside of the build tree to the install RPATH +set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + +# the RPATH to be used when installing, but only if it's not a system +# directory +# list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) +# if ("${isSystemDir}" STREQUAL "-1") +# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") +# endif ("${isSystemDir}" STREQUAL "-1") + +set (QT_NEED_RPATH FALSE) +if (NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib64" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib64") + set (QT_NEED_RPATH TRUE) +endif () + +# +# stuff only qmake can tell us +# +get_target_property (QMAKE_EXECUTABLE Qt5::qmake LOCATION) +get_target_property (LCONVERT_EXECUTABLE Qt5::lconvert LOCATION) +function (QUERY_QMAKE VAR RESULT) + exec_program (${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output) + if (NOT return_code) + file (TO_CMAKE_PATH "${output}" output) + set (${RESULT} ${output} PARENT_SCOPE) + endif (NOT return_code) + message (STATUS "Asking qmake for ${RESULT} and got ${output}") +endfunction (QUERY_QMAKE) + +query_qmake (QT_INSTALL_PLUGINS QT_PLUGINS_DIR) +query_qmake (QT_INSTALL_TRANSLATIONS QT_TRANSLATIONS_DIR) +query_qmake (QT_INSTALL_IMPORTS QT_IMPORTS_DIR) +query_qmake (QT_HOST_DATA QT_DATA_DIR) +set (QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) + +# project definitions +add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1 -DBOOST_ALL_DYN_LINK) +if (CMAKE_HOST_UNIX) + add_definitions (-DUNIX) +elseif (CMAKE_HOST_WIN32) + add_definitions (-DWIN32) +endif () + +# +# sub-directories +# +if (EXISTS ${CMAKE_SOURCE_DIR}/samples AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/samples) + add_subdirectory (samples) +endif () +if (WSJT_GENERATE_DOCS) + add_subdirectory (doc) +endif (WSJT_GENERATE_DOCS) +if (EXISTS ${CMAKE_SOURCE_DIR}/tests AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) + add_subdirectory (tests) +endif () + +# build a library of package functionality (without and optionally with OpenMP support) +add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) +target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES} Boost::log_setup ${LIBM_LIBRARIES}) + +# build an OpenMP variant of the Fortran library routines +add_library (wsjt_fort STATIC ${wsjt_FSRCS}) +target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES}) +if (${OPENMP_FOUND} OR APPLE) + add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS}) + target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES}) + if (OpenMP_C_FLAGS AND NOT APPLE) + set_target_properties (wsjt_fort_omp + PROPERTIES + COMPILE_FLAGS "${OpenMP_C_FLAGS}" + ) + endif () + set_target_properties (wsjt_fort_omp + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp + ) + file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp) + if (APPLE) + # On Mac we don't have working OpenMP support in the C/C++ + # compilers so we have to manually set the correct flags to get + # OpenMP support in jt9. + target_compile_options (wsjt_fort_omp + PRIVATE + $<$:-fopenmp> # assumes GNU style Fortran compiler + ) + endif (APPLE) +endif (${OPENMP_FOUND} OR APPLE) + +if(WSJT_BUILD_UTILS) + +add_executable (jt4sim lib/jt4sim.f90) +target_link_libraries (jt4sim wsjt_fort wsjt_cxx) + +add_executable (jt65sim lib/jt65sim.f90) +target_link_libraries (jt65sim wsjt_fort wsjt_cxx) + +add_executable (sumsim lib/sumsim.f90) +target_link_libraries (sumsim wsjt_fort wsjt_cxx) + +add_executable (test_snr lib/test_snr.f90) +target_link_libraries (test_snr wsjt_fort) + +add_executable (q65sim lib/qra/q65/q65sim.f90) +target_link_libraries (q65sim wsjt_fort wsjt_cxx) + +add_executable (q65code lib/qra/q65/q65code.f90) +target_link_libraries (q65code wsjt_fort wsjt_cxx) + +add_executable (test_q65 lib/test_q65.f90) +target_link_libraries (test_q65 wsjt_fort wsjt_cxx) + +add_executable (q65_ftn_test lib/qra/q65/q65_ftn_test.f90) +target_link_libraries (q65_ftn_test wsjt_fort wsjt_cxx) + +add_executable (jt49sim lib/jt49sim.f90) +target_link_libraries (jt49sim wsjt_fort wsjt_cxx) + +#add_executable (allsim lib/allsim.f90) +#target_link_libraries (allsim wsjt_fort wsjt_cxx) + +add_executable (rtty_spec lib/rtty_spec.f90) +target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) + +add_executable (jt65code lib/jt65code.f90) +target_link_libraries (jt65code wsjt_fort wsjt_cxx) + +add_executable (jt9code lib/jt9code.f90) +target_link_libraries (jt9code wsjt_fort wsjt_cxx) + +add_executable (wsprcode lib/wsprcode/wsprcode.f90 lib/wsprcode/nhash.c) +target_link_libraries (wsprcode wsjt_fort wsjt_cxx) + +add_executable (encode77 lib/77bit/encode77.f90) +target_link_libraries (encode77 wsjt_fort wsjt_cxx) + +add_executable (wsprsim ${wsprsim_CSRCS}) +target_link_libraries (wsprsim ${LIBM_LIBRARIES}) + +add_executable (jt4code lib/jt4code.f90) +target_link_libraries (jt4code wsjt_fort wsjt_cxx) + +add_executable (msk144code lib/msk144code.f90) +target_link_libraries (msk144code wsjt_fort wsjt_cxx) + +add_executable (ft8code lib/ft8/ft8code.f90) +target_link_libraries (ft8code wsjt_fort wsjt_cxx) + +add_executable (ft4code lib/ft4/ft4code.f90) +target_link_libraries (ft4code wsjt_fort wsjt_cxx) + +add_executable (echosim lib/echosim.f90) +target_link_libraries (echosim wsjt_fort wsjt_cxx) + +add_executable (ft8sim lib/ft8/ft8sim.f90) +target_link_libraries (ft8sim wsjt_fort wsjt_cxx) + +add_executable (msk144sim lib/msk144sim.f90) +target_link_libraries (msk144sim wsjt_fort wsjt_cxx) + +add_executable (ft4sim lib/ft4/ft4sim.f90) +target_link_libraries (ft4sim wsjt_fort wsjt_cxx) + +add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90) +target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) + +add_executable (fst4sim lib/fst4/fst4sim.f90) +target_link_libraries (fst4sim wsjt_fort wsjt_cxx) +if (WIN32) + set_target_properties (fst4sim PROPERTIES + LINK_FLAGS -Wl,--stack,0x4000000,--heap,0x6000000 + ) +endif () + +add_executable (ldpcsim240_101 lib/fst4/ldpcsim240_101.f90) +target_link_libraries (ldpcsim240_101 wsjt_fort wsjt_cxx) + +add_executable (ldpcsim240_74 lib/fst4/ldpcsim240_74.f90) +target_link_libraries (ldpcsim240_74 wsjt_fort wsjt_cxx) + +endif(WSJT_BUILD_UTILS) + +add_executable (fmtave lib/fmtave.f90) + +add_executable (fcal lib/fcal.f90) + +add_executable (fmeasure lib/fmeasure.f90) + +# build the wsprd WSPR mode decoder driver +generate_version_info (wsprd_VERSION_RESOURCES + NAME wsprd + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "WSPR mode decoder" + ) +add_executable (wsprd ${wsprd_CSRCS} lib/indexx.f90 lib/wsprd/osdwspr.f90 ${wsprd_VERSION_RESOURCES}) +target_include_directories (wsprd PRIVATE ${FFTW3_INCLUDE_DIRS}) +target_link_libraries (wsprd ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) + +# Tell CMake to run moc when necessary +set (CMAKE_AUTOMOC ON) +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +# don't use Qt "keywords" signal, slot, emit in generated files to +# avoid compatability issue with other libraries +# ADD_DEFINITIONS (-DQT_NO_KEYWORDS) +# ADD_DEFINITIONS (-DUNICODE) #as per qmake + +# As moc files are generated in the binary dir, tell CMake to always +# look for includes there: +set (CMAKE_INCLUDE_CURRENT_DIR ON) + +# +# source navigation +# +set (sources + ${CMAKE_SOURCE_DIR}/* + ${CMAKE_SOURCE_DIR}/logbook/* + ${CMAKE_SOURCE_DIR}/lib/* + ) +add_custom_target (ctags COMMAND ${CTAGS} -o ${CMAKE_SOURCE_DIR}/tags -R ${sources}) +add_custom_target (etags COMMAND ${ETAGS} -o ${CMAKE_SOURCE_DIR}/TAGS -R ${sources}) + + +# Qt i18n - always include the country generic if any regional variant is included +set (LANGUAGES + ca # Catalan + da # Danish + en # English (we need this to stop + # translation loaders loading the + # second preference UI languge, it + # doesn't need to be populated) + en_GB # English UK + es # Spanish + it # Italian + ja # Japanese + #no # Norwegian + #pt # Portuguese + ru # Russian + #sv # Swedish + zh # Chinese + zh_HK # Chinese per Hong Kong + zh_TW # Chinese traditional + it # Italian + ) +foreach (lang_ ${LANGUAGES}) + file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/translations/wsjtx_${lang_}.ts ts_) + list (APPEND TS_FILES ${ts_}) + set (qt_translations_ "${QT_TRANSLATIONS_DIR}/qtbase_${lang_}.qm") + if (EXISTS "${qt_translations_}") + add_custom_command ( + OUTPUT "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" + COMMAND ${LCONVERT_EXECUTABLE} -o "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" ${qt_translations_} + COMMENT "Building required Qt translations for language ${lang_}" + ) + list (APPEND QM_FILES "${CMAKE_BINARY_DIR}/qt_${lang_}.qm") + endif () +endforeach () +if (UPDATE_TRANSLATIONS) + message (STATUS "UPDATE_TRANSLATIONS option is set.") + qt5_create_translation ( + QM_FILES ${wsjt_qt_UISRCS} ${wsjtx_UISRCS} ${wsjt_qt_CXXSRCS} ${wsjtx_CXXSRCS} + ${TS_FILES} + OPTIONS -I${CMAKE_CURRENT_SOURCE_DIR} + ) +else () + qt5_add_translation (QM_FILES ${TS_FILES}) +endif () +add_custom_target (translations DEPENDS ${QM_FILES}) +set_property (DIRECTORY PROPERTY CLEAN_NO_CUSTOM TRUE) + +# embedded resources +function (add_resources resources path) + foreach (resource_file_ ${ARGN}) + get_filename_component (name_ ${resource_file_} NAME) + if (IS_ABSOLUTE "${resource_file_}") + file (TO_NATIVE_PATH ${resource_file_} source_) + else () + file (TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${resource_file_} source_) + endif () + file (TO_NATIVE_PATH ${path}/${name_} dest_) + set (resources_ "${resources_}\n ${source_}") + set (${resources} ${${resources}}${resources_} PARENT_SCOPE) + endforeach (resource_file_ ${ARGN}) +endfunction (add_resources resources path) + +add_resources (wsjtx_RESOURCES "" ${TOP_LEVEL_RESOURCES}) +add_resources (wsjtx_RESOURCES /Palettes ${PALETTE_FILES}) +add_resources (wsjtx_RESOURCES /Translations ${QM_FILES}) + +configure_file (wsjtx.qrc.in wsjtx.qrc @ONLY) + +# UI generation +qt5_wrap_ui (wsjt_qt_GENUISRCS ${wsjt_qt_UISRCS}) +qt5_wrap_ui (wsjtx_GENUISRCS ${wsjtx_UISRCS}) + +# Resource generation +qt5_add_resources (wsjtx_RESOURCES_RCC + ${CMAKE_BINARY_DIR}/wsjtx.qrc + contrib/QDarkStyleSheet/qdarkstyle/style.qrc + ) + +# AX COM servers +if (WIN32) + include (QtAxMacros) + wrap_ax_server (GENAXSRCS ${AXSERVERSRCS}) +endif (WIN32) + +# +# targets dependent on Qt +# + +# build a library for the QCustomPlot widget +add_library (qcp STATIC ${qcp_CXXSRCS}) +target_include_directories (qcp PUBLIC $) +target_link_libraries (qcp Qt5::Widgets Qt5::PrintSupport) + +# build a library of package Qt functionality +add_library (wsjt_qt STATIC ${wsjt_qt_CXXSRCS} ${wsjt_qt_GENUISRCS} ${GENAXSRCS}) +# set wsjtx_udp exports to static variants +target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE) +target_link_libraries (wsjt_qt Hamlib::Hamlib Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql) +if (WIN32) + target_link_libraries (wsjt_qt Qt5::AxContainer Qt5::AxBase) +endif (WIN32) + +# build a library of package Qt functionality used in Fortran utilities +add_library (fort_qt STATIC ${fort_qt_CXXSRCS}) +target_link_libraries (fort_qt Qt5::Core) + +# build a library of WSJT Qt multimedia components +add_library (wsjt_qtmm STATIC ${wsjt_qtmm_CXXSRCS} ${wsjt_qtmm_GENUISRCS}) +target_link_libraries (wsjt_qtmm Qt5::Multimedia) + +# build the jt9 slow mode decoder driver +generate_version_info (jt9_VERSION_RESOURCES + NAME jt9 + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "jt9 - WSJT-X slow mode decoder" + ) + +add_executable (record_time_signal Audio/tools/record_time_signal.cpp) +target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) + +add_executable (jt9 ${jt9_FSRCS} ${jt9_VERSION_RESOURCES}) +if (${OPENMP_FOUND} OR APPLE) + if (APPLE) + # On Mac we don't have working OpenMP support in the C/C++ + # compilers so we have to manually set the correct linking flags + # and libraries to get OpenMP support in jt9. + set_target_properties (jt9 + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp + LINK_LIBRARIES "gomp;gcc_s.1" # assume GNU libgcc OpenMP + ) + target_compile_options (jt9 + PRIVATE + $<$:-fopenmp> # assumes GNU style Fortran compiler + ) + else (APPLE) + if (OpenMP_C_FLAGS) + set_target_properties (jt9 + PROPERTIES + COMPILE_FLAGS "${OpenMP_C_FLAGS}" + LINK_FLAGS "${OpenMP_C_FLAGS}" + ) + endif () + set_target_properties (jt9 + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp + ) + endif (APPLE) + if (WIN32) + set_target_properties (jt9 PROPERTIES + LINK_FLAGS -Wl,--stack,16777216 + ) + endif () + target_link_libraries (jt9 wsjt_fort_omp wsjt_cxx fort_qt) +else (${OPENMP_FOUND} OR APPLE) + target_link_libraries (jt9 wsjt_fort wsjt_cxx fort_qt) +endif (${OPENMP_FOUND} OR APPLE) + +if (WIN32) + # build map65 + find_package (Portaudio REQUIRED) + add_subdirectory (map65) +endif () + +# build the main application +generate_version_info (wsjtx_VERSION_RESOURCES + NAME wsjtx + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + ) + +add_executable (wsjtx MACOSX_BUNDLE + ${wsjtx_CXXSRCS} + ${wsjtx_GENUISRCS} + ${WSJTX_ICON_FILE} + ${wsjtx_RESOURCES_RCC} + ${wsjtx_VERSION_RESOURCES} + ) + +if (WSJT_CREATE_WINMAIN) + set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON) +endif (WSJT_CREATE_WINMAIN) + +set_target_properties (wsjtx PROPERTIES + MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" + MACOSX_BUNDLE_INFO_STRING "${PROJECT_DESCRIPTION}" + MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} + MACOSX_BUNDLE_SHORT_VERSION_STRING "v${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" + MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${SCS_VERSION_STR}" + MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_BUNDLE_NAME}" + MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" + MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" + MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx" + ) + +target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) +if ((NOT ${OPENMP_FOUND}) OR APPLE) + target_link_libraries (wsjtx wsjt_fort) +else () + target_link_libraries (wsjtx wsjt_fort_omp) + if (OpenMP_C_FLAGS) + set_target_properties (wsjtx PROPERTIES + COMPILE_FLAGS "${OpenMP_C_FLAGS}" + LINK_FLAGS "${OpenMP_C_FLAGS}" + ) + endif () + set_target_properties (wsjtx PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp + ) + if (WIN32) + set_target_properties (wsjtx PROPERTIES + LINK_FLAGS -Wl,--stack,0x1000000,--heap,0x20000000 + ) + endif () +endif () +target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) + +# make a library for WSJT-X UDP servers +# add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) +add_library (wsjtx_udp-static STATIC ${UDP_library_CXXSRCS}) +#target_include_directories (wsjtx_udp +# INTERFACE +# $ +# ) +target_include_directories (wsjtx_udp-static + INTERFACE + $ + ) +#set_target_properties (wsjtx_udp PROPERTIES +# PUBLIC_HEADER "${UDP_library_HEADERS}" +# ) +set_target_properties (wsjtx_udp-static PROPERTIES + OUTPUT_NAME wsjtx_udp + ) +target_compile_definitions (wsjtx_udp-static PUBLIC UDP_STATIC_DEFINE) +target_link_libraries (wsjtx_udp-static Qt5::Network Qt5::Gui) +generate_export_header (wsjtx_udp-static BASE_NAME udp) + +generate_version_info (udp_daemon_VERSION_RESOURCES + NAME udp_daemon + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol daemon" + ) +add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) +target_link_libraries (udp_daemon wsjtx_udp-static) + +generate_version_info (wsjtx_app_version_VERSION_RESOURCES + NAME wsjtx_app_version + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Display WSJT-X Application Version on console" + ) +add_executable (wsjtx_app_version AppVersion/AppVersion.cpp ${wsjtx_app_version_VERSION_RESOURCES}) +target_link_libraries (wsjtx_app_version wsjt_qt) + +generate_version_info (message_aggregator_VERSION_RESOURCES + NAME message_aggregator + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol application" + ) +add_resources (message_aggregator_RESOURCES /qss ${message_aggregator_STYLESHEETS}) +configure_file (UDPExamples/message_aggregator.qrc.in message_aggregator.qrc @ONLY) +qt5_add_resources (message_aggregator_RESOURCES_RCC + ${CMAKE_CURRENT_BINARY_DIR}/message_aggregator.qrc + contrib/QDarkStyleSheet/qdarkstyle/style.qrc + ) +add_executable (message_aggregator + ${message_aggregator_CXXSRCS} + ${message_aggregator_RESOURCES_RCC} + ${message_aggregator_VERSION_RESOURCES} + ) +target_link_libraries (message_aggregator wsjt_qt Qt5::Widgets wsjtx_udp-static) + +if (WSJT_CREATE_WINMAIN) + set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON) +endif (WSJT_CREATE_WINMAIN) + +if (UNIX) + if (NOT WSJT_SKIP_MANPAGES) + add_subdirectory (manpages) + add_dependencies (wsjtx manpages) + endif (NOT WSJT_SKIP_MANPAGES) + if (NOT APPLE) + add_subdirectory (debian) + add_dependencies (wsjtx debian) + endif (NOT APPLE) +endif (UNIX) + +# +# installation +# +install (TARGETS wsjtx + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION . COMPONENT runtime + ) + +# install (TARGETS wsjtx_udp EXPORT udp +# RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +# LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +# ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +# PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wsjtx +# ) +# install (TARGETS wsjtx_udp-static EXPORT udp-static +# DESTINATION ${CMAKE_INSTALL_LIBDIR} +# ) + +# install (EXPORT udp NAMESPACE wsjtx:: +# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx +# ) +# install (EXPORT udp-static NAMESPACE wsjtx:: +# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx +# ) + +install (TARGETS udp_daemon message_aggregator wsjtx_app_version + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + ) + +install (TARGETS jt9 wsprd fmtave fcal fmeasure + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + ) + +if(WSJT_BUILD_UTILS) +install (TARGETS ft8code jt65code jt9code jt4code msk144code + q65code fst4sim q65sim echosim + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + ) +endif(WSJT_BUILD_UTILS) + +install (PROGRAMS + ${RIGCTL_EXE} + DESTINATION ${CMAKE_INSTALL_BINDIR} + #COMPONENT runtime + RENAME rigctl-wsjtx${CMAKE_EXECUTABLE_SUFFIX} + ) + +install (PROGRAMS + ${RIGCTLD_EXE} + DESTINATION ${CMAKE_INSTALL_BINDIR} + #COMPONENT runtime + RENAME rigctld-wsjtx${CMAKE_EXECUTABLE_SUFFIX} + ) + +install (PROGRAMS + ${RIGCTLCOM_EXE} + DESTINATION ${CMAKE_INSTALL_BINDIR} + #COMPONENT runtime + RENAME rigctlcom-wsjtx${CMAKE_EXECUTABLE_SUFFIX} + ) + +install (FILES + README + COPYING + AUTHORS + THANKS + NEWS + BUGS + DESTINATION ${CMAKE_INSTALL_DOCDIR} + #COMPONENT runtime + ) + +install (FILES + cty.dat + cty.dat_copyright.txt + contrib/Ephemeris/JPLEPH + DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} + #COMPONENT runtime + ) + +install (DIRECTORY + example_log_configurations + DESTINATION ${CMAKE_INSTALL_DOCDIR} + FILES_MATCHING REGEX "^.*[^~]$" + #COMPONENT runtime + ) + +# +# Mac installer files +# +if (APPLE) + install (FILES + Darwin/ReadMe.txt + Darwin/com.wsjtx.sysctl.plist + DESTINATION . + #COMPONENT runtime + ) +endif (APPLE) + + +# +# uninstall support +# +configure_file ( + "${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + @ONLY) +add_custom_target (uninstall + "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") + + +# creates or updates ${PROJECT_BINARY_DIR}/scs_version.h using cmake script +add_custom_target (revisiontag + COMMAND ${CMAKE_COMMAND} + -D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} + -D BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} + -D OUTPUT_DIR=${PROJECT_BINARY_DIR} + -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake + VERBATIM + BYPRODUCTS scs_version.h + COMMENT "Getting source control system revision information" + ) +# explicitly say that the wsjt_qt depends on custom target, this is +# done indirectly so that the revisiontag target gets built exactly +# once per build +add_dependencies (wsjt_qt revisiontag) +add_dependencies (jt9 revisiontag) +add_dependencies (wsprd revisiontag) + + +# +# versioning and configuration +# +configure_file ( + "${CMAKE_CURRENT_SOURCE_DIR}/wsjtx_config.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h" + ) + + +if (NOT WIN32 AND NOT APPLE) + # install a desktop file so wsjtx appears in the application start + # menu with an icon + install ( + FILES wsjtx.desktop message_aggregator.desktop + DESTINATION share/applications + #COMPONENT runtime + ) + install ( + FILES icons/Unix/wsjtx_icon.png + DESTINATION share/pixmaps + #COMPONENT runtime + ) +endif (NOT WIN32 AND NOT APPLE) + +if (APPLE) + set (CMAKE_POSTFLIGHT_SCRIPT + "${wsjtx_BINARY_DIR}/postflight.sh") + set (CMAKE_POSTUPGRADE_SCRIPT + "${wsjtx_BINARY_DIR}/postupgrade.sh") + configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postflight.sh.in" + "${CMAKE_POSTFLIGHT_SCRIPT}") + configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postupgrade.sh.in" + "${CMAKE_POSTUPGRADE_SCRIPT}") +endif () + + +# +# bundle fixup only done in non-Debug configurations +# +if (NOT is_debug_build) + # add this sub-sirectory after all install steps and other + # sub-directories to ensure that all executables are in-place before + # any fixup is done + add_subdirectory (bundle_fixup) +endif () + + +# +# packaging +# +set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/package_description.txt") +set (CPACK_MONOLITHIC_INSTALL 1) +set (CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") +set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set (CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") + +if (WIN32) + set (CPACK_GENERATOR "NSIS") +elseif (APPLE) + set (CPACK_GENERATOR "DragNDrop") +else () + find_program (DPKG_BUILDER dpkg-buildpackage DOC "Debian package builder") + if (DPKG_BUILDER) + # + # Derive the correct filename for a Debian package because the DEB + # generator doesn't do this correctly at present. + # + find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") + if (DPKG_PROGRAM) + execute_process ( + COMMAND ${DPKG_PROGRAM} --print-architecture + OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + else (DPKG_PROGRAM) + set (CPACK_DEBIAN_PACKAGE_ARCHITECTURE noarch) + endif (DPKG_PROGRAM) + + list (APPEND CPACK_GENERATOR "DEB") + endif (DPKG_BUILDER) + + find_program (RPMBUILDER rpmbuild DOC "RPM package builder") + if (RPMBUILDER) + list (APPEND CPACK_GENERATOR "RPM") + endif (RPMBUILDER) +endif () + +set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") +set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8.3) | libgfortran4 (>=7.3) | libgfortran3 (>=6.3), libfftw3-single3 (>=3.3), libgomp1 (>=6), libqt5serialport5 (>=5.7), libqt5multimedia5-plugins (>=5.7), libqt5widgets5 (>=5.7), libqt5network5 (>=5.7), libqt5printsupport5 (>=5.7), libqt5sql5-sqlite (>=5.7), libusb-1.0-0 (>=1.0.21), libboost-log1.62.0 (>=1.62.0) | libboost-log1.65.1 (>=1.65.1) | libboost-log1.67.0 (>=1.67.0) | libboost-log1.71.0 (>=1.71.0) | libboost-log1.74.0 (>=1.74.0)") +set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + +set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) +set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 7, libgomp >= 7, fftw-libs-single >= 3.3, boost-log >= 1.62") +set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) + +configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" + "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) +set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake") + +include (CPack) diff --git a/q65w/.gitignore b/q65w/.gitignore new file mode 100644 index 000000000..74b59e474 --- /dev/null +++ b/q65w/.gitignore @@ -0,0 +1 @@ +~* diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt new file mode 100644 index 000000000..84cbff690 --- /dev/null +++ b/q65w/CMakeLists.txt @@ -0,0 +1,74 @@ +set (q65w_CXXSRCS + about.cpp + astro.cpp + bandmap.cpp + devsetup.cpp + displaytext.cpp + getdev.cpp + getfile.cpp + main.cpp + mainwindow.cpp + messages.cpp + meterwidget.cpp + plotter.cpp + set570.cpp + signalmeter.cpp + soundin.cpp + soundout.cpp + txtune.cpp + widegraph.cpp + ) + +if (WIN32) + set (q65w_CXXSRCS ${q65w_CXXSRCS} killbyname.cpp) +endif (WIN32) + +set (q65w_UISRCS + about.ui + astro.ui + bandmap.ui + devsetup.ui + mainwindow.ui + messages.ui + txtune.ui + widegraph.ui +) + +set (q65w_C_and_CXXSRCS + ${q65w_CSRCS} + ${q65w_CXXSRCS} + ) +set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") +set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) + +# build the subdirectories +add_subdirectory (libm65) + +# UI generation +qt5_wrap_ui (q65w_GENUISRCS ${q65w_UISRCS}) + +add_executable (q65w ${q65w_CXXSRCS} ${q65w_CSRCS} ${q65w_GENUISRCS} q65w.rc) +target_include_directories (q65w PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) +target_link_libraries (q65w wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Portaudio::Portaudio Usb::Usb) + +if (WSJT_CREATE_WINMAIN) + set_target_properties (q65w PROPERTIES WIN32_EXECUTABLE ON) +endif (WSJT_CREATE_WINMAIN) + +if (WIN32) + install ( + CODE "get_filename_component (_path \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/wsjtx_dir.txt\" REALPATH) + if (WIN32) + set (_separator \"\\\\\") + else () + set (_separator \"/\") + endif () + file (WRITE \"\${_path}\" \".\${_separator}\\n\")" + ) + + install ( + TARGETS q65w + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime + BUNDLE DESTINATION . COMPONENT runtime + ) +endif () diff --git a/q65w/LICENSE_WHEATLEY.TXT b/q65w/LICENSE_WHEATLEY.TXT new file mode 100644 index 000000000..8adb5204b --- /dev/null +++ b/q65w/LICENSE_WHEATLEY.TXT @@ -0,0 +1,30 @@ ++ + + This Software is released under the "Simplified BSD License" + + + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation +are those of the authors and should not be interpreted as representing +official policies, either expressed or implied, of Moe Wheatley. diff --git a/q65w/MAP65_Beta_Release.docx b/q65w/MAP65_Beta_Release.docx new file mode 100644 index 0000000000000000000000000000000000000000..acdc027735b80ce5530632bc1abc9b12e2a51c59 GIT binary patch literal 23951 zcmeFYV{~lav-caDJGRxaZ96-*Z9CbqlN~!dHg;^=wr$(F`TY;>bM86g-uwP}))>7; zjkRWfyJq#QS)Vn!T0t5V3>63h2nq-YhzRJK=-ej;7zhXj;`;>z1)?QvXX|WY>#V2j zVQ=E3L+5T|O_&D;LYV^u@;(0l9RC|fpgvJnzE=P#eARKdQ z%oPTwjbKHi^Rr_P9h*hq=k;vChR@d1%F5(D1htL`>~%?nqz3y*HB?l68q-{2$M5Vt zFLVPWa+F}!*jiRXocq6jJ@*(#--Bis}vN$h!0>BJ|x1~p`oeD zc{!92?4SZ~I-n0mcl@F+lce@kAZ8?fn48$HC%f+LuR85l3S%37A`WfJl`7&XZE;@<3NjZzK6oTZfL@>9333`T4?h~;Sr$BX zeXqc;FHj(b|B}Y|aoA0F-*@D`vlR9_jrAN&texoT{yG1j^!?vBXaAR}N5!v6feONf zT!C*H4EwOJ!4S``Y)a(15ubqurJV!2A&eKSc6Q_wwkoXY9^M~~$uDLEX3TRJ^FaJH z&{)V>&d?X%vU0a+iiA|q7}iP;FoPGLthTVVTcqcSOU&hoVl2V|ukb7LGOy zX<)ZPX9%#C9CVDfqdh=ur(BW3Qqi`+6v zR#QEd>{EEZW^}CBkT=0b>s7N~ciXk~LC=?+)uo=mD;&0J(BsIbkCo$CIM}MsZ>E+l zuYoRUNEIzixePpN{ssz6c>HV3R*$IC$qk zm8;m#sPre*8BTl+`qWxQht)G75wNhPsDMWpW_0Qk#JD@YBMprJ$M8nKewoVAUk>IE zmCipu=hQft0;@L#f295G<2%#fUID3}bX`e%O2fx+ML3ySQ&*^#ErB&$r|9p}jdhU^ z^?rWpzOqkhs3y3ef7I6TV{seZ%2Q6eA+-(c3%pq263-huxLVhPw$wvnhbx zvC4)@5>6j!S*bNdu_WrB%wX~W|DP5*77<5j5FrqdDF`qS^7s1v*Fyham-xBPneCps z<0k>(l|3P$1p6X}M&m(a&0%lyh3%A_Tbs?492*ovj)>H5I&n+8`o-X9s+)x0yQCkF z^ey=v>C0)RaD>~>Mv0mle7IF~**KR|U6-=c_fJGUGjgwaovG@|xyenrraosYW2+EW z&Wm^FUkx8seLQ*%EDQCtAN6+yURnH?mN8G-oYodxy*4`Nz9t+l;x0Yhw*(sSRsNC?u#fRg zxH`jLVXs}vJapi#Wt~qdKM~nC-Z+atMCTe{f1>=^xCs4SBhT$`l_lZVNaA-)O#wpq zLh>Gxp&>fyHNZ|!3h|8Nrn3PC*LWZcZ&nj^#0M{(8A8aLOuOq~8uB!e)e$)UmPe+R z+Y?+qDHt&T%KUpwFoe95g&7<_tP{4ZD7$%yRx7FiikCPb7Y1s?EhKhaxi13$j%U6< z4mR8!`d63RMR$0&LsSay#j0o6AJKpo5aSKLl=kP@_9XmRDd0Jcixj7!VW2`UZ;Elj;}f#AsKq)f3mLSICb1d^z_Mh`gl>-3P=eNUxazSf2`r zBKcn@*$)s`ukQ|%(bDpFxGrF>1E3*X^B}sdOTiGZ{C~hZY3+LSj$64NUD`!A2lxwZ zR|}6mO@h1#RPO4T0|MqY5V}qyQd-p-54@TU_Foj7+)u{4^Y}A0{t(&TcLwWiU4^Pa z+{1rLIM`sg=N#=6Ys2aNJaB{Klu+4Z;fL;3OGsyR0ip8#cn>$dw zV*k&SoZHpMw+=f|9=3&Lio(mN|{{A~ZVeS8~5e;mxT&V3BCqM1?sh|mw( zVFzn~wj^Xh1SdgQ#GV*L^w4D@3s~eIr zH{*!?&A^3!2QpM+5IFn_b=NSVysWsva#D<5a@c5;QD)`6x5<9@het2l1NtPaGFHK- zeQSe%Q%|F&}Fh;`VFqO+mg#eR}@BE_62%-ci)_%W3RROCD0j{168e+^PGy0*6FjZPKTzD@tl zmh9e2X(L`COQlt_0xkgJ41D#Rj2i8A;Hk8~U8R&%jR1(1m6M0sJl%^id%MsNb_#ZX z@fm^)oKMuz-EbDJJW@*3xq7OG?ji*gr-g+UK<+xym!I?abhXImKB@n$XS*DADzx|{ z1A*)@9)6l+=#O7*i@jD}q^o{JuR=PEW~&slDpUM-a1ZrPcH@K$+4r1n4Q2o)>?EP7 z1N<>3+@jaq0Qh0EtL!T}a4oWBQ2dwI3UQKhuQUsd-7c2e0Pol8V1B}=&*cU)85790 z{8CGe))sq|AE?@)enUK5SUIA%uYm2ul94f6mR{=7hmlZRV}akSpA5+ z`L*5*>$FWm->0ZF|Bc>xq1C?vx2!wmFQxRnayW-tuo!Grv?wnVx}Yx;`(ktOh4FNc z2vd*rd-&IeWQh{#lbq7D7X->1|X732%aw!{R1LGiF35#ebrHoOGK|`_KduTICs)s{qVQ|VG5=CqHdw*w|j*&q6W)*o7^0Pdrs9`(rr~^ zmA;tgP3*tkZ~B_DP`MB3t#+{LeSf|@s?IAi$Y-6vtzC5Dgte+`q$R3_^^a_EUv~ZY z;}z)8`-JfH2APLh?|~z_2(;gh)6#0oXlI#Ug!6Ta4gNE5agB;b%A%6yu#Q%UJ7f@k z-Yb_sc<0xwc&w(F3ua7o0B7_v3t6AiykSd`0WZT-|Fj(UWkX13`pd}twfCA&Ui>R@ ze26mo;PJ70SC<=&ZSp~#+b0T{yoks>k#`(TJ`C)6#z^<*WcZ7B=blV9kJ0`GN0mXe z^H!s)Gwreq$ehxKPFc&wLFNrChtW_CIkY!XITjI3V6y5VDU5qC02qZjlGeHhy4_|k z3573j;5a24Ub?P_cZ*k?Qj)ndS>$6C=5t9|IY!jMNH|hUi}s6QMKR&{PfH`uGc?I2 zb}Efcq({4S$76tLzCCNOiqc8hou|2`$6etQZ_-@wun$5x&yZ{I6*cLhe97*^ITo>c zSpiElWY)*y*)Mpx&*+T8E#D72z)8`B73!kqtvq`bufqaX8f~`1B?P#7@2tZI{5f=LPjQ$ z8Ja@m>QsT+AS(#NSB!%_Cj^%=9~w;M&@iHzWDz*c4^X+}MS3;C@8C(Ef5l4jkY8z7 zF;+PhZfR$!Yhg)utjA|+LSt$uxV!1lTVF!B(nSYbrCXrH$o5FG447BpX}rbw;=CB! zjm(X;jEsKdsNreA6X1AmU1yb-dx_bYhL9=MxL1$i-v7nP2jcdP3JJ=AohS?`>6ve& zGNW*=*zx4^$`6+WwY#zPxo4>F64NhD|6BsE9i$kL@9-pUR6QAYL=1KFV5zIUXLscIOKYd2P znj>eJ7unJ|oo!BJ{{_3Sf@A`_F5_hr34>+m6-r~y=b4XggI`A3 z1{{p#Wl-3+l~tP;dYO2O$ouLr&tLr**$*_oNJHl zyx5{QY1tg$;fuTq4By1u=|uPcimInXgqyefjfGsO*aNM@{%*1FU@#Wg>%=gF-Y*Yx z*(vo)7_s9NSB%Ppb?07pkv^=7D4TCi%Cp`FXe=L5PFBEuN;i5Np$$r+gD&J>FbiOW zS+`*hV>(st%xt!6a^Q$m`|3lR`maf~DAWZ0o|qn>M0Rgj>g_1f?^X_Nh31o~h2Y>k-$xM%LLLOW98Z1HZZImQEX{4gyY6ja$&ln1Rg|&5;mic8`+i*->~ps&|{Z zGcKTDXt{-k>Fa67M1rX@D^#fxDNj)#E&BSS7D7PI$0iI8(2pov_6SKs;;+>a=|nIT z+u60-+ikRLw#HQqQocv)EdO<&WY(CPI9tsFV*mu`MZ(OXG=R+TZf5{)ZGWPBN1f#t zouo|CVdj&OF>GF-l?}ye6|C^SJUs$y(ikL0nPdD9XmFKF(NL3B~t2mUq8!f4o3ijWPglnTZp{qN}d}T8my3a^4jA4|anW(r3 zqkH9Rit$Q9euDv{NgGQufJ7!qrP_Qb=pCuV>B0DbC)mzoJTmjO+reF41eE{BYRHCFtA9ZpcPSKIDd7TFjQv z;$}g359u|JOVCzuvY@;QM}m9Y+3)#byRJ{jImRor6Pj&JgzZ!n*$JJ%Py4^1gn=Zn-_+LBx zV#k^Z%q$mKWHf#CI*@aPTo0aYm_?P{e^lE{Druh_Lq;sUf5+8hy#o|07m`k?)URdUJi zAO+=iw|JzrzR1so9$$)a?r?KiU2TkQ4IZ6f?r7@}8126AV#nNS>Sstwtw^^Lv#Oda z%eAYld^hM|Is#@yBP^QU;;?Tc1Ek@9V$ zT9BzIJ-pmA?m%%CpM+^ej8Z*=tjnkXQxJ4^3reU(4n#m>y%UlCBGI#_@Dl)E-+{~p zQ4$pm@R??<&IyDP7NeBGPzhp*9S|@@E(ojPwA?La?lww1>lI*N-t}qEHjg$1#%%!F zl^(0jVWxl76Pu|QR|OTktAUzJHf@qvU@3^+d@gc{pcEO82|d9@Cux>Te(tq zgY=haY8$er5}9e=w>vfO&=Yvd(|rkjHCY+OmzTX) z`CS?^0YWaKKoVGoUU>{YwZsagLko&)y`Yb97lBJ}!K^jHmX4+Bgo%8o{00z|UFtft zJZMXU?E%k!L@`A*AM;ZktKjT!d<9uZI%%Q)M4H(YuPBgGN^#5=))bs9Fs;M z{)9M`NhWJw23Gsh4^H6C(>y_kWe#G^@ncCKNK`Xso)+1Sfl$S84H=i;vD)5Cp+&w33H5Wl&!}j9mXz&~*16^79jfYh z7O}$Xd&&v7B}y^C5%%S)xD>C0{iQk`yL#+VHc6xbzES>bn1F!9;%k2@1HhhKL31Dc z32i#)8J2JY*Ku{A*oHQXrCej>9-%y6i@&Br>FWvHi^|LtnVkeTd>mPBg&;KyhVoLO zCF=3}c)=Rfa_fOo%VFCmiy3%+2qU7fEB!4ri=!&SXMmxkKzJt0?bPYC?>zPJVO!74 z_I7nbxkYazBMF(L5ZCb)tu1uTPxhKS6D0`donaE>>4NitTl=C?R!aUNfk=^HGf*4} z#{OR1fol7EJ(wJCZQ9vpq9QgRJ3dg-S960TssyUXmTFYK{Rr0$=A(QvBt5-3W#Dn| zZjgxP+!n)y#CAW!l|$D$o_NHrqSsU+a)2R~EUA>BF`UT9ZtZJKhVaikm<5~|Fq8%x zyOGPnRJ(kU9{T`Pj+a^_`N00dTt0G74Mu87%joKG@37Qrh$kpe=eTf!Cv#8ROxbGW z_dC=%a0aLepC6!ZJ@3l8vQ@|ovVAu*y?){fZ>|2xI$- zD;Jf0kah11qmCu{FTix}+YAZS8)jig-q(otvgPe0v_Irn^IA>%4P>Ty3yV(nFxRf- z;uHFpBkr4#w`TxX0c8_I>Wb~ER$FuI1}S$-DAUnO#cV1hxwG&E|CT(#>m-XNY6u={ zquY;N$R^n#<5z^^{E=R0ANF&vNR-n0Jp)fpBp63V*_HvYp>JoeAnPG%h{GeJ$nwO2 z7)$^QPE1!qakSP=+ieQ_7d9*cD*uuESPeS~=?$F;l&WZg!|jB)t~rx+d>)2z*#*r{ z3pe$`*FWR%MED2JEm+}&L?wWT+C(yCaJDV6mt;>B!o2T2_HUGERbZV|MI!pe(0bfD z%kuyiber<|BlVJ4283e^D6onm#QvwQo1Mbg2>1(2N^pH4Lqh;(IIZx&`_vzrHyaf4 zy$MM)&9 zqsvnmiNoWMFq1`@wP6oU#Y|ZQ*Iib|t%dyB;@x5_(Zc0u?P&(|H@EAfa}Mv^qi%DO zi9&br4apr2K?a|1PU+{LImut&OxgoIZoLH<3LQ$Lg>}i<5j0p(1B}pfBKHuVWFzx*BY6MhoswxhPj6YGWSuU(3p8xxaD9(kSDWNa#-AD@QUl6y>(0$ZZ1N9>1>80|Qo31Y8ukE( zz36g#pxwTCked{m?Z6kr`QR#gt>!8YS-R`N``JIQl)|^tUUUKP61=5Vrva_gt2PgI;VNCbKpvmLpy34oUK00u=f2S zg?NU*Bq;H4}*u@`gI0ko^%y3Mq@> z4qw@T@8-O_i9V?VOQ2~?l|}ffvuFKGgKDaMJkkhi=zNDOL^!=N3#Ky=T{;mgkRRuU zw+bq#rV%=frxVY(s*dNRt%tl{hf!F@#W|oTkPNHi!vv1OX7@QEU zt;TF~e75;ymCl8Yo+ z`ie1H_0yuK#-|nY!6Hg10C*#sH&x(aJv-m_0T7RaoQ0jxdpt)zeCkuNU}F}$amXSA z3t6B?XRkQek^E094u=;kOXX4OC%|ZGJ39vtxAnEmbayVajtLSg-pRCW92DDFj-`5M zqIn=*Xi1rAsbM9efs}=XeIMlrdoa}FRJC2e$$bBHJ2Y&D4OdKP%EQti9M-2O9{yHL z{@j)qdCp&S#2yq8qjLAR`6uYGOo1fSElARajz?gjYF}{ z3xd3+u$wxqJjTm*)^?Em$4A7fDog){=Nz`%jPyZd%^GqgRKLWTO0@UJrZznoe4YEG0HAs1ou`wURM}cGwj&R|MUqR*0fqSYm zx!W@Nq{WoO<}|>7y7H4UNVK}Z=($NCP;5quOxIy5D z^dVvQUY0B1ttiDus5j2E0teQjVXEEA;9~g#w6Z}ou%>f8}+n5fypMrgeg_~RT-D`>z=i-S0&d~LTYm)0E4#?Q5q&7vY@~g$}N9? z71qaqe^ouGmkTWo))pz3No&+FRY}4EVv-Ba3ZkNjop((51 zak-d9JaQC~5X7{8vg`B77%?iBvz*PbtV(@Uz1k;c7Y>)s4qJOBxi~CBUP5!SC#f&N8qp?`kVgh+_=5{A^Xe6bjbp6$DfEJv3SQ>-j5{fmF^JeN8 z&T{vlQZ1MkqR>_4Q>(Jj4Y&~!?<{b#93d%1H;Bzqi?A4_eBdFUFiS5yD6#?}rNFnx z-IoT0fRc(^1&|&hALJWrAXSU0*Q%FpzjlS4!6c8Ht?nXam}>kOK~JkmN)uTr4Uk3I zDJOq8#4Pgxsi{rjM(~Y6^!b!bNd%@Sbi9gHVWQ zWN;`&M{%k@!HXE1 zF?pUBIeFCe#@wWg>nK(G@i<}Vr}(-y zcE7u7DtHrW-));FxU1AK4Tu@?Yn2Bi7HF+wP{|d&HU*Ol;t(WjjX1K3Lx9(;Jy2FPCH0roPF3q!*UJ5DvmZ@xc-Cy&4^r7Ag+_5p5|NX z-=oE3*UbO+e=%fc!3rAFUFbnM|mx`2_>SUK(hB?vsQU8x8Gr zf*>hlnck1ZLSz@#d+p`?F{92w`k6!DB86+Hz9=HXEMybU7LjO<^+4bHaW^*R^6JBA z0Jv&f@xx_iV&YKmn>}hhntQ?cOiWRk6I~PGh3-lfQZHi3bA}PF98;VYF`1Q9ofQvu zJ6(Nzo-Hf`VnmASOXYXURfW1kqihncb)-X`_kjavsb8IfG8V>f$p{P8gA|s-_*jvP+J4#^{TagY`naFKS(?ZX&5VLL z>Y-&mTq)l^B2QlYiD+tqRwRigrr#|dN|CTPvSxnLYQOE&z1OpuRBuct_b*Uo-X0@U zHW{RByjz_wXXFdm%QP**qk}O5If=;wp>&#oKK-FRG?l+t;bUDiv^$?;Gld#(kpj6W zQj;%0bw2qQlR}#w@Omqh=EeDWt;IbNvC$|kx3iN40^-A^I}(gAg~CE{)`zd)-V}2= zicngw{2#XB>>x#F*=Kf1f}(v~?3Q_M?{E>l$%MQkj)XS5=QG?pEiXshOVloc&OUQ( zzQ%<#ZxJu9ciFX`2T(@Fledb#!Zw>o`Fn#Y$UJwy*c?IHtYG_J+PzS zGvY5?skB^>X)whMsL7qZxzpz}UQ2{BbJd$Tpp_TMRsKKx;Ww#Rzkj~|gzfw>&Dl8m z1^eBQ@ZWoL7&e5dO1}GY3UGjc(Eg)k!P(rz#)SS~XU2azbIvv7?bg^(yAYS%2%YVW zC|t22T_ToiGH7LS`fWq;Ey9zR74igTC4F#K_xynSS`9+cmTf`}wEWSR3*T5)xUBJ} z|5l4D#t*3L#0l^YKvG>5itzV_aR<#Sc^=QT1rVSKc;viJKvR7YeD;JYxf9y zWroTpoJwjfa34^8OZ=s?ht>{H!6~5XtH2`FWTpwRUzM997RdsS4u4#m7Ash_y~968 zGsi3Cis!6NYSr@~j0td@o*Pyzjht3`aAF78kFKL9O`FwXDCm$#d+WNM6Q1)WsbpDzmBs83l<$Ct4rW+-<}JX(C5Yx-|I5p9tLh z2`bYxH(XAx{)TNl;DdY^cOS8F;_0$W%4>i$pXxE4 zD4qmqMY?HZqXnFAn(7JMr>k|H7o-bE`K)IoZmYyF%s3#3;KyO=4c8w^T(vmd z-P9y_U(oUrso@^wXA^CCz_qgkrg(>+ghs<*GLVn7+*Xf54Pc{ltf(duH3DCGrrn>D zo}}qnkiFMIGZ=506kx<33yGA6dEuY}zI9+5a_n{uDu>?shCmk6CjS?r$>KPS1r~{y z85ym!U9K6WE07Au$WRI%)umW1S%MdFxZ*uu9w?3VrA2~=1yYN>D?M> zmD(d=0k(hpDyo9Hn44OWCs0L0wQ_6OYB&=EM_?E9tE$HQg7$?M7JATG|vz}9LCAOJ~L!+6*nus`XuiNes3sUQv>E}51+>r^R=h(2z z2b*3f^asd1cRv)k(_(0-C@7?-f38`vrexsXI;=hp+RKFuae)7o-VirL?=?yI8wCHR zl(1s_GM-VX&BzXYYX4wx!BZh38;G|8&#BP(^GcU~B#NDnf0P5AQAwl7{;j=TVwwp(gMj^4Jd zoYtC5%K)cz>uq#u&x*tNER@-SYO(pB5p-J^MWR3t>Tt+bl~LP7?k)iN0lh?$Bj(qX z^2{6bI$s6YDkz^eJZzM6Q9Uo6a(^yNA@ai;2sWe=H=*XXFGdkj$#%f%JI21kR}-h1 zMQVMBaKUOZ(GS!|5;SO`#~hlpWA0#e-nBLw$z)_EWR)LkMXKk>oTSzzR@-HpYrLp} zB^j3SNx*^JSidg4k_Gb>*f|fpod6m&Ppi1k#oPoL<2i|1p|ZjWYh6e+=7^?kWjc1r zM_zUs$h?eJb=V%NKy|aK)1$MWtfCx8s#esCnS)~!+8o!r?Sl;JEFx6vL_{BukNf~{ z(=OLzc$eX)+(zPO_uO#7WdUWq+GxmG@L7bI9EaLKwp11>tJMmZS=BN2GuTUK*iMS5 zN;2-qt|^Q2JWi(-&KCE$!AY9)<<%Hk7FPF1nth#<6KB`M8X$Z@jB-{`v0-Cee@T@nt%ZTA%0iB|Ln$dGI4gcur+h~r>teF zZhe~7In?~M9^k9Lv5~E;HGGQp}B1`heCHP4`>R6D#YN;-1pk`PrTb-9#Rl} z05ys^}YuO zryd*B4Nsi5FKT}nugx@!t^w7KpE+}oG_t{87TxEVW7dVG z*wcgRCq*UymZS8A^A_vP6)ib0jsb2(7}5}<5RhrzX+Q@rBb~yEz|RNW<8=Yik3LSF zdy7a>@KCUW{nOkj=dKVW$Z8aQULm>JjvKbJ}%mGM#S z1Wy9GkNOFyu)fx7q+E(XKKlcJ^J~f{C32(;9L#@$_hvGaxicfrztdMaQtAP(;I-pK zXuMf;g9=}OevwM}j5*r7T#IG+p!sc^JtURXt@woClWmfeGD#w>!9@M(bcRoc;D_Ec z%i0ysgMgga;Dl>JTsI68LV%=doZ2Ir>M!f$!&k2v2YhO?H)e0dp7pW%=OakFYz z@f=ufodVo0l~0@2jpo@HPOJgsZ>J+FK-tx`I&>)isip zPuBRT<@zZaPgIY-$Qh@>T3nm5>8H^58tdMes^IsP;CQyqG3HcIn(Jp+;BFa3h3>0A z*mlT5u%f#}5p+2H)zm-S6=5wq+#%1LDd+!OV)lDPZj zlx*}}AKa(QrZ2D^rV%l`f3Kor^Oq!2*zK|GJFEV=jDh*Ibni~hzTN+wYRB+Am--@@ z6a!a36s(GwoWn|Is=+W4paHSxF%4^`!7`GkfiBPFF7R;j0&Yq%K1gx=I;S}HyWPV5 z_t_T3&Y%YccDz3MGHrQ!)t~|>>)(CaxdgXV(c36ZxS=Wv>T%FN*gYJU2fOjT&TAaa z7tX-la*7me20d9CJcr(v(=adajMlGfN~MWazcoSfqAq9&YQf73JgIEdzmA=1}p z9z8rDsRgunNt|G;f0XAf(W zf9**1T5FEqJCe_p%$I-PlL-4#1g{EL3<~=nNvE336J`-1bewnvNkGiogAR>E7%{lR zlJTt}GT7reycrSr+ZzFY{PG)J9gpHkZ+1KG+aDQFG_jMu-Y?Hzce_bf2f-4;$mPm( z?-XfozuG^)`|t?p?{=w@TOdJZ-U>yx#iWlNq|NO<5-Q}X zj2u@Ej)z?kQ^5dt>Lo)Aj27Q-%_4!5QyXG|X|esJSjaa)J}h488INb1Zj)yjF|@x)<*N z%7f(8?Gp@kozcZ%o)#GB`9(b(?uz98h&d_-(=ov_|3!+V*>MKXvVgt-FVI4xWA-7M z`G9ew^$WS1!^em5iXLRR;V(KlyQPLCqGc{fg7-sas!pbaMn_(fXco1mNh^Kh&5bO^@Mc2Rna9sGmMiK%37doQ~#g`=F<}5BIz7 zot!QzzoBZ-xs?YL0cKC`MjSPa0Y1m~!}HdGW=^+l#%;(RVB$##OY&Z=pSlFR?fi9= z=RvO%-_O?MZqRSIkpi~LxTE83Df}`bSZDkIyB0KHTA94{pEhO|CyPIr9+>~S|21x7*1~XK;EC|fCGCw|!X@#w zJKSwJS6gYA>S}EIr!H*;Rxw z1{jU_g8fj*WGQa`vP&I;u{;P^WC)QR$TY*gED&}`JG8*ZNE?nZ$1S;jO-qlXW!Co< zj^I0$Es%wg450o)h(6Z?J292-XZ+%>bp(M;FjQB+)qPn31MwlzO)#3w-jN`P$>K&f6{*XL}I+XN$I<5kb$@<8#khY7`riD$oj z&HldnpQ^=zC6BRE-G-1Q{w5$(_U_5C@w7Dn6gx-X<7A@;xR4ho*S(pEwjj!YWhPfgol4%jLNLr_0Ih(CYtu z`7{g2)&E2niQM$x#La+q=yroFzQdvZ|LJmIry1;%=*W^1MGR@qCUc1`Yb7aM*Iry_axE!%Lj@RFe=KA5Xg|lO6>j$n^ z^5MwzdiLoi6QTGoH7tmy<(cL8E~^de5Cle}hDN%3{k5YWh)jIH0}5~5&G)91n(NJ9 z%pft3K+4uz8H%N9jnLtx*=keM#X1_~}LO#YBLp#R&+*nT> zQHMX(Rh4i=f^6IaR3U!vf#u>@m$bGJ#k@w8+0GX>3?q`0L)!N++V`X9)DxlZ>6*`H z$-(5x9X^=nj?0G98!M|7f-mTeHP(eHoa1-dW002;1j>>b7oMRS0k)+f;%gsgMu0_X z^9+O?Pg**|g+-_p1*etXY+*!HDX1I^xYj6FV!E~veblG{ODUFD5%bZBHAex~7(lbP zt|hQIaLKJE_sgSBl6c|c8#_UUUGFbKqf3^Xbbz06z!>0eRCb+*hUVQ0S-d>TU4kRE z>aDwcq0kGb0%Qow`zJSDVhs-m-8LrWsvz@F!c{a-`cEp?->lF@-e#I(3JDNfizxDQ zE(c5L(^eb>nAEFjlC%V}tu3k1W*E#Q3ohst*bgBXeq9y_?@s*uX*dTYD%|FE;(`;BRArp*C#&h?QKo(*NYAN z)NQeXDFRej-3#3f`X%{P!i#yL2M$*FxhSf8>F7Myuboo!g2l7$g#0Y2j~QnktUWu) zGM+ROKUb<<@wk@Y<`ODdGA4+M1}Ty_GkRrD{s@uRYS~EvPvTpBv>?Gxu-YMvLd*vH zCJP>VRIWOh6I!Qyg`52KIJOFo04rBrDm$DJ4)Ok<0O4uDffaIzM^hd(?9^r|6;B?M zek0W6GuM%Q6VR!2neZMJfGbi&M|Vgw$>jA!5haW7^v#BN1DyjCpNR}IGHvgvz|S3| zx_Qzcg4P2(Q>-dSLcI4QSNw_%vK3sC)AFmb@A@VuwZ`Ubo!z75>B%)xaLjbgLB$icKT`n$?jV1xK&fBVeP3u0MIfA*r7B@A|LHt!JnP!u=bWHR>PwU{w z)ngbfPPQtfgz;@Hs2ZPiu>CVB8Ey`)-WiaO3x&}v#+18WNN<$A!PI+oc4NXwZ{}#v zgc=2AV{UZTxVhj5QxRn04PzB$Y4Bjc&NVFc&~kBS@}pj{pG=_`uoxv61io!A=@0;L zI<02AO;p4bCKx`5PI^}96xco4?XfO)rq5)_UtjNkt@ek7@`@WBI_--wnBhcIUkEzA zm}a!W-D|>tUL!YwL_i93djx|UdvtN`azY{yzi5dlRt2|Lj3{xaob?;vfevb&d9UbqO@1N&eU0?{v%G{+_es3XGNT5YfRj{F0LiNMN3zpWF0+d>uGUkW zB$CUGCBDc>oJ9QFP|W)_K)(%;&6a%Rtx3FS`#MP>%WUGY1J|TEWl=64J`K7%Z#Z)EI?U|eyME(cb^x4@eQkzbed;V(CTd?~a=SIgr^ag!8$d^xBU&4i z&n&0~!XNO*bw(O5&lK5BGZ$2Vv8Nuk6Pogy=Pc;FU$_QQKV+#ri@XCqiyU~B_zs6o zo@>(%VLI3BB@S4PmM#lnR9ZJfOyHeo`=WGu&;v|C+QKTme@Komqj?KtPjXKMcCAx- zjK&Q75yzrDx5q@KVQZy5&zU#3>#YvM%fVhu^k4XGg(YA;+mZC!|C2m<4KB9uLZhxO zb4rT`h&IeQsyS;C`JNpOkDr14? z;|VUz@YhgI2tP7NKqF^G^?CNrr@$A4* zDfXZ9O#&+4^z)5;)jBs>KUbaj*U&%D-n@p`e ztN-2a9ZC-)#!u&eJO!O6{pSO?ScMvR#Q!13kbjZm%j`Gy2{iAw2;lys8zB0hVERCD zWgELQoZ&Zc2r*XruQ;6afT;Y7cSG{`qgikNof{MW#f|e&3*S-u=Ena!5WW59vfoqH zzJ(*KAeKx0Px=2I>@ZnG^pbyth5gv8(Oxgno7ZJF9&FwV;-C_OX}g|GLb{hP#tl-U4f+;cHLyPf{xG=n!V?9aSP&gRq=#cf)vjJ zxCyo?K%dreagkXEeDfmcn7n&q^OoIT?VXFy)@-d1AcdL_FsV{qM!0HzrgRrbHN_p| z*+ZJtb~pS8d_pX%%xtAm5g7pK5zGxcs#Bhb~wW zm`%M=hIbkU1IMI#diVn__HUxIerEkiopc1S+{)hdai8B$1+uqN!Mgj2Gjn<6j#Fu@ zxn5;gDX>Ag;c4293B<>aP>%|-YE-1iyHT|!h@i#y3^g7nbil`gy4od}qzVE7^MAE- z)o)GqZySY4r^G110ZKar=A=U;MyG^QQqltiq!dQ?U`UNdLP{hYkD`DAiV~ws7>#rZ zqQE^vy#>2ujA3lLMrWCa{vhDS?8gbWX> zoJphI^Ml@o5QVm=iCVN(8v)DFyZiP-JXnjZ6R8OIJ3!`hHfl%ud;ohYF1>a8UgW?u7bS&fn^ zsZL^Ecw*GsWyl}g0^pH1r)TDosbSY_eWWU}hRBL#b51vvQ#Fb`^VqyKab_o zvyh$QRQNObK~-%`!^}@k|osm{5Tz6k^w)Yt_yef@VaE};qg5+j@K^v zuM7kJm&-Qja>L6oJZD*wCu{0Rt1!&9N8uB48c#&7 z$f8PuJbj_kb62Y4-`=GwxO+E^mQ*F@fl(Fqu6UQp{BW#}KeOJL2AhL*+Q#{XD>JjC z&1Bum3e;kS%#iMFk%HXI%!ABqtfZ+8sbx1Ed6Ddp_k;Du9*YAoV&>6O{wm;e&sMmm*M4%;^XOp$6^648J+sX z-G_YHBc`GE$l3M_rYknK-NzWxy67FyD$}78B+HG6sD;lK&4$=l*=lt467*1Mz=3RM z-E{Z>Nydgp6LGlcZM~C6Oo`j8C2>imS@Y7Yb#-ctk7~P}TxWUC=-rVR$bzG%GLLGT zD=&ts6`Eb{rZlK&Q;7ERUPBz*=pWzYvWg6<5s9F=L%N8&>*<3zM;)`rqJTL*b!N$K zW3!>UGfng(r)r&qUe3IGxGqY*8o#zniJw*Te{;_q3+x>R~;djo@2Ld^%JqxD0zLD$~*|{IRmbz_Q ztoVxJd>u-#^A7zLlpSrQij8?g{_fhaXI8IW@@H(Oc*j)S&6~mAuAgbTg$f;_m`UvN z!jm+tT9`KHJ{X%1SB9ziBGr)Pq3h`;etsufAcE zT8~v*x)CT=HGBTtB!#)?tuGWF>YW1X+#YX#<{?WF!{49^j6kjxE|Wh1UGW)mEfyCBciUy8vVRgvU1 zAwvO7W~GZJvHi=n!kybv-I&0rCzwczM1@2OQW>Dh6g%x*^dysMTVtgsIeW}exA}UT zj9gFbY5x~T5ho9q$2p!qK8|+2r-y6XnYMry6L&W8*1dl#anVk>hxMv0LZ&3)c;-}0 zbib(Y6GeMZX_v;X{OthvP9a7mU`kzEU0G)Yu^vc_x)9r#(CQ{X77{OpE6PvRdI=;| zL@S*fDX+-m|BL@yiU_i=>2Ss`-*J5O%z(G}Ay#6K7ojt>wsHBfh6hlv#4#{q_&(~8 z3$zglJuf2(&crHydK61zG~5n-UCx!fmV}$ymm*ITP*g7OQv)crJ_+)WLk9$%Y=Ts3 zY}?_L_WYl$8Nn)h5s%lXjx0nr+WBh|N~!Vfv8-d_vF8?Y6P%*& zfJr4S_1WoC)CWH|TDN%-w_-@vgyXx4aEG*l&nbw zTa7xf(LSkH63X2g71VvTxI{HhyE12S|AyyVmrXRPCGpN;aO>1Hn>_IAAnxQ>7bE^D zLX!n^fpluN4m>e3^rrVOvt86H%#PAzD@Lj9ebZa>l1>g6rE+K&clw}8g;|;<_t+eb zdZ5n2rthBaM5*@9a%AB$r-|vVeCV4?{Mu8gE<({Q=dDVd14PY)!Wp%P`%hw(OzB#N zBN{`awrXQS6R(}d-QT!NR|&9zxw&3s&}mkFy$C?w-+TrYL{r?>XBt}r)Ph*+VuZMx z6-qYA0;|=IIT2VlJBo&}#fncaCPDDh_?>e%e232hq438vfiJwQEcUX-TZE$!2n(Ls z0EZ86_OWjC%faOb&7Q3E*>%_ETp9YZ=$#T+r15%ce_5JnL-7wG_`9nX{#(ZXEKOfK z8-w49_o)VYI;~*3;4545!aj5P7AKwr`+gEG)CvxV>xakcdx0z)?X=e z9y&(cQ*MX83MrT{^+ZMNyL)0}WI4t>wkH5xcY8pe2cI}g>+*5X|0I9mJ zkKpldBn@uxd6RZ5%SKDBKHWP1Rgk4C1nX5(GD40ZI@CGGo@wZ|fBgUloRCt?n_3`w zNlhg@yHpT=mH(C96Qlc8)II~FcJH@MR3CayKG}hl)=eroH&Mpw`8LF!VlPTF7bCvn z+3SZJ1AvS3{QZMpQHCZ4htB-9ta;i$`K>r95mB?&Z}$>6A6FYYIKJ89M+>3Fq+8*2 z#^&k)-*XMX+)%Sp&wHRv8#sdX zsUp*r6=AUaR7P92d$ZT7@5al6k5-GXquI}RsbkWLADkV*jZx<;Vl5LF2CuR4mN8X` zT%yXx?9T9Fzh>oz+-uAQn1{^2-kc^nBtwqM)h=Q$Xcdlnq>r$7G$Ng+>Sw{^xmaiE z-AG)2inDZE5U@Iu$257%QjcRy8>t`<6B;p%_Fn3~w9kB9o5)r+{E2(36!gh7RXM>`0%=Mf_o#PN1~%W+(ha1%aHgs*HoR0@Hh7Y z$mAA-@~=E?c|Ru>ypxd67ca&CqA3?*Jf}uHl_M)dYVA@fliqi$?@T98G5d%}g%Pqn z4IMmj7?yG(Td|0Y<05D9rQW}rMrv|9NHFWrkgcHocnCI0+ugl&&JuJnz<#GTW^!+1 zDJOD0*}*`5yB0sh8&u|0Xb$ff&u146%%jKkNNiiBBun}WcGX5N5(V7Mw*SC{rGZHG z_gt#t9N(*Kv+5l#+~Iq<9}7p*?q#8UX0Pf9U^tHGd7y6hJqo(K-U4xDE)~855O3ZCTz)Pr*DfI0P${$E%CZGYiQ>7JNl)|UCDg4 zn}{2LOI4DU$d>f8E1xFeNZMs6YRGoeRDOL|N=w9rx;~pGO2^68xn-G(?cAgO<(eLd zuT{^W_0Q{OgMwZDeDI)8?HILIb0~v(A9j8Y6Kw5Xg+q6{=^r02= z-sptQ;-nj0%T4S!OsjPXPoMzD5WGoS)eq{Cvt2_`;ta&87V|u>1xu<(UgU-BoWoJS z$)3pE4?=X*k{KmC;wO<+4~XMed1SE28ZuwOFtkt8g2RDaD_3?^;^uSh;cwp!!URJ; zQ&p#dzNrlxsTdm?BRV`^D&<&aQkvfCKwun?sN0yVWpAAo9 zQaqIDn|(@pspzBS4M0^%zXMS4l}%*!`q{vof`LQ(Y8jg- z7Y3v`*Xpq{Pt#o?I;35WODjT|J%-gqQMOffsCT!hj8PDaKHOFEj-hNTzQCC&C2nsw z=&^!qh+sQYW(e)pFSQ*UQ1#tMgkp3+`*XvtYdl*2_ucn$BY&POlSds<UB2wjR4bLjLXY;CsqVpBsPopX z*JMm}F^WXImN-St7x0GguXaZA629gU0&SE){UjNqOgO8X?Qk?H7y2k!Hr7NX{#_Rq zc>U;jEtfLgD5=OObI+Z>QPD2pZL*$Db#!LxL-Gc9eKF8M#D#ggtja9IB$wuVb$?dZ zl?zO~b?%P(w}vK~)B)-{?0D0RM!c!b@psdc@21~QbW&DVXd z`bQnx+?%oLjTQ|PRF7iP9tOWkgq^ze(!j^o#b&Reyf=gIe7VBd;9JKGm;g7*j;}ii z$;i-H;v?|B`rWQN7BgTN!!j_n#2{KN(QYv*r#=?w1Mm?#{Isp1@qVzFA@)(XaH&8a zZu_0A=CdGV9Y$O^do86%fwtFN?4br#2?+2p2?ykhu$?Hct(v+-rkoE03P;#3`NI6m z<4zi>N-ES`V=#O-NbK8pPHR?E&Z&+t%sHP~>|c2QqMq`NZEG6$e0pfw(rG(}1`>gB zy1HvD8r=vH#W_1gnD+xma`VvaHh@SUfaZb=IYTx6D4Y#q4budB(c>-OjYEa?F8Fh2 z5g8#u`e-+kHWs;p3QtZQDN$E-wqE6Pq|pH}z_D@HZ10G_Ul7bp?p1M(cnQ<(tJqam zs!n-rdA`)~Iz;7@BXq^MFK(54z+TFxoasa73SQI(oJl`b1nEkU@H^F6I_Ep=cKokT zbn3JS-v9Z#V)W1W>fe{Y=tt|q{v`NQtM*?c{-6VY%HNc034wnKc>WGt!H*972ps+& zIZr|+LWRU%Tm$&7s2@zf>m?Gx38xi)!6OBK!U<;=2q_4=LVr=%i2bDay+@P~PT0Wp z3;tR1Kk$Fsxd_38#mZk`ReX&0setupUi(this); + ui->labelTxt->setText("

" + QString {"MAP65 v" + + QCoreApplication::applicationVersion () + + " " + revision ()}.simplified () + "


" + "MAP65 implements a wideband polarization-matching receiver
" + "for the JT65 protocol, with a matching transmitting facility.
" + "It is primarily intended for amateur radio EME communication.

" + "Copyright 2001-2021 by Joe Taylor, K1JT. Additional
" + "acknowledgments are contained in the source code."); +} + +CAboutDlg::~CAboutDlg() +{ + delete ui; +} diff --git a/q65w/about.h b/q65w/about.h new file mode 100644 index 000000000..a5206661a --- /dev/null +++ b/q65w/about.h @@ -0,0 +1,23 @@ +#ifndef ABOUTDLG_H +#define ABOUTDLG_H + +#include + +namespace Ui { + class CAboutDlg; +} + +class CAboutDlg : public QDialog +{ + Q_OBJECT + +public: + explicit CAboutDlg(QWidget *parent = nullptr); + ~CAboutDlg(); + +private: + Ui::CAboutDlg *ui; + QString m_Str; +}; + +#endif // ABOUTDLG_H diff --git a/q65w/about.ui b/q65w/about.ui new file mode 100644 index 000000000..fb20f48db --- /dev/null +++ b/q65w/about.ui @@ -0,0 +1,37 @@ + + + CAboutDlg + + + Qt::NonModal + + + + 0 + 0 + 374 + 164 + + + + + 0 + 0 + + + + About MAP65 + + + + + + + + + + + + + + diff --git a/q65w/afmhot.dat b/q65w/afmhot.dat new file mode 100644 index 000000000..7599d4aa8 --- /dev/null +++ b/q65w/afmhot.dat @@ -0,0 +1,257 @@ + 0 0.0000 0.0000 0.0000 + 1 0.0000 0.0000 0.0000 + 2 0.0078 0.0000 0.0000 + 3 0.0157 0.0000 0.0000 + 4 0.0235 0.0000 0.0000 + 5 0.0314 0.0000 0.0000 + 6 0.0392 0.0000 0.0000 + 7 0.0471 0.0000 0.0000 + 8 0.0549 0.0000 0.0000 + 9 0.0627 0.0000 0.0000 + 10 0.0706 0.0000 0.0000 + 11 0.0784 0.0000 0.0000 + 12 0.0863 0.0000 0.0000 + 13 0.0941 0.0000 0.0000 + 14 0.1020 0.0000 0.0000 + 15 0.1098 0.0000 0.0000 + 16 0.1176 0.0000 0.0000 + 17 0.1255 0.0000 0.0000 + 18 0.1333 0.0000 0.0000 + 19 0.1412 0.0000 0.0000 + 20 0.1490 0.0000 0.0000 + 21 0.1569 0.0000 0.0000 + 22 0.1647 0.0000 0.0000 + 23 0.1725 0.0000 0.0000 + 24 0.1804 0.0000 0.0000 + 25 0.1882 0.0000 0.0000 + 26 0.1961 0.0000 0.0000 + 27 0.2039 0.0000 0.0000 + 28 0.2118 0.0000 0.0000 + 29 0.2196 0.0000 0.0000 + 30 0.2275 0.0000 0.0000 + 31 0.2353 0.0000 0.0000 + 32 0.2431 0.0000 0.0000 + 33 0.2510 0.0000 0.0000 + 34 0.2588 0.0000 0.0000 + 35 0.2667 0.0000 0.0000 + 36 0.2745 0.0000 0.0000 + 37 0.2824 0.0000 0.0000 + 38 0.2902 0.0000 0.0000 + 39 0.2980 0.0000 0.0000 + 40 0.3059 0.0000 0.0000 + 41 0.3137 0.0000 0.0000 + 42 0.3216 0.0000 0.0000 + 43 0.3294 0.0000 0.0000 + 44 0.3373 0.0000 0.0000 + 45 0.3451 0.0000 0.0000 + 46 0.3529 0.0000 0.0000 + 47 0.3608 0.0000 0.0000 + 48 0.3686 0.0000 0.0000 + 49 0.3765 0.0000 0.0000 + 50 0.3843 0.0000 0.0000 + 51 0.3922 0.0000 0.0000 + 52 0.4000 0.0000 0.0000 + 53 0.4078 0.0000 0.0000 + 54 0.4157 0.0000 0.0000 + 55 0.4235 0.0000 0.0000 + 56 0.4314 0.0000 0.0000 + 57 0.4392 0.0000 0.0000 + 58 0.4471 0.0000 0.0000 + 59 0.4549 0.0000 0.0000 + 60 0.4627 0.0000 0.0000 + 61 0.4706 0.0000 0.0000 + 62 0.4784 0.0000 0.0000 + 63 0.4863 0.0000 0.0000 + 64 0.4941 0.0000 0.0000 + 65 0.5020 0.0000 0.0000 + 66 0.5098 0.0098 0.0000 + 67 0.5176 0.0176 0.0000 + 68 0.5255 0.0255 0.0000 + 69 0.5333 0.0333 0.0000 + 70 0.5412 0.0412 0.0000 + 71 0.5490 0.0490 0.0000 + 72 0.5569 0.0569 0.0000 + 73 0.5647 0.0647 0.0000 + 74 0.5725 0.0725 0.0000 + 75 0.5804 0.0804 0.0000 + 76 0.5882 0.0882 0.0000 + 77 0.5961 0.0961 0.0000 + 78 0.6039 0.1039 0.0000 + 79 0.6118 0.1118 0.0000 + 80 0.6196 0.1196 0.0000 + 81 0.6275 0.1275 0.0000 + 82 0.6353 0.1353 0.0000 + 83 0.6431 0.1431 0.0000 + 84 0.6510 0.1510 0.0000 + 85 0.6588 0.1588 0.0000 + 86 0.6667 0.1667 0.0000 + 87 0.6745 0.1745 0.0000 + 88 0.6824 0.1824 0.0000 + 89 0.6902 0.1902 0.0000 + 90 0.6980 0.1980 0.0000 + 91 0.7059 0.2059 0.0000 + 92 0.7137 0.2137 0.0000 + 93 0.7216 0.2216 0.0000 + 94 0.7294 0.2294 0.0000 + 95 0.7373 0.2373 0.0000 + 96 0.7451 0.2451 0.0000 + 97 0.7529 0.2529 0.0000 + 98 0.7608 0.2608 0.0000 + 99 0.7686 0.2686 0.0000 + 100 0.7765 0.2765 0.0000 + 101 0.7843 0.2843 0.0000 + 102 0.7922 0.2922 0.0000 + 103 0.8000 0.3000 0.0000 + 104 0.8078 0.3078 0.0000 + 105 0.8157 0.3157 0.0000 + 106 0.8235 0.3235 0.0000 + 107 0.8314 0.3314 0.0000 + 108 0.8392 0.3392 0.0000 + 109 0.8471 0.3471 0.0000 + 110 0.8549 0.3549 0.0000 + 111 0.8627 0.3627 0.0000 + 112 0.8706 0.3706 0.0000 + 113 0.8784 0.3784 0.0000 + 114 0.8863 0.3863 0.0000 + 115 0.8941 0.3941 0.0000 + 116 0.9020 0.4020 0.0000 + 117 0.9098 0.4098 0.0000 + 118 0.9176 0.4176 0.0000 + 119 0.9255 0.4255 0.0000 + 120 0.9333 0.4333 0.0000 + 121 0.9412 0.4412 0.0000 + 122 0.9490 0.4490 0.0000 + 123 0.9569 0.4569 0.0000 + 124 0.9647 0.4647 0.0000 + 125 0.9725 0.4725 0.0000 + 126 0.9804 0.4804 0.0000 + 127 0.9882 0.4882 0.0000 + 128 0.9961 0.4961 0.0000 + 129 1.0000 0.5039 0.0000 + 130 1.0000 0.5118 0.0118 + 131 1.0000 0.5196 0.0196 + 132 1.0000 0.5275 0.0275 + 133 1.0000 0.5353 0.0353 + 134 1.0000 0.5431 0.0431 + 135 1.0000 0.5510 0.0510 + 136 1.0000 0.5588 0.0588 + 137 1.0000 0.5667 0.0667 + 138 1.0000 0.5745 0.0745 + 139 1.0000 0.5824 0.0824 + 140 1.0000 0.5902 0.0902 + 141 1.0000 0.5980 0.0980 + 142 1.0000 0.6059 0.1059 + 143 1.0000 0.6137 0.1137 + 144 1.0000 0.6216 0.1216 + 145 1.0000 0.6294 0.1294 + 146 1.0000 0.6373 0.1373 + 147 1.0000 0.6451 0.1451 + 148 1.0000 0.6529 0.1529 + 149 1.0000 0.6608 0.1608 + 150 1.0000 0.6686 0.1686 + 151 1.0000 0.6765 0.1765 + 152 1.0000 0.6843 0.1843 + 153 1.0000 0.6922 0.1922 + 154 1.0000 0.7000 0.2000 + 155 1.0000 0.7078 0.2078 + 156 1.0000 0.7157 0.2157 + 157 1.0000 0.7235 0.2235 + 158 1.0000 0.7314 0.2314 + 159 1.0000 0.7392 0.2392 + 160 1.0000 0.7471 0.2471 + 161 1.0000 0.7549 0.2549 + 162 1.0000 0.7627 0.2627 + 163 1.0000 0.7706 0.2706 + 164 1.0000 0.7784 0.2784 + 165 1.0000 0.7863 0.2863 + 166 1.0000 0.7941 0.2941 + 167 1.0000 0.8020 0.3020 + 168 1.0000 0.8098 0.3098 + 169 1.0000 0.8176 0.3176 + 170 1.0000 0.8255 0.3255 + 171 1.0000 0.8333 0.3333 + 172 1.0000 0.8412 0.3412 + 173 1.0000 0.8490 0.3490 + 174 1.0000 0.8569 0.3569 + 175 1.0000 0.8647 0.3647 + 176 1.0000 0.8725 0.3725 + 177 1.0000 0.8804 0.3804 + 178 1.0000 0.8882 0.3882 + 179 1.0000 0.8961 0.3961 + 180 1.0000 0.9039 0.4039 + 181 1.0000 0.9118 0.4118 + 182 1.0000 0.9196 0.4196 + 183 1.0000 0.9275 0.4275 + 184 1.0000 0.9353 0.4353 + 185 1.0000 0.9431 0.4431 + 186 1.0000 0.9510 0.4510 + 187 1.0000 0.9588 0.4588 + 188 1.0000 0.9667 0.4667 + 189 1.0000 0.9745 0.4745 + 190 1.0000 0.9824 0.4824 + 191 1.0000 0.9902 0.4902 + 192 1.0000 0.9980 0.4980 + 193 1.0000 1.0000 0.5059 + 194 1.0000 1.0000 0.5137 + 195 1.0000 1.0000 0.5216 + 196 1.0000 1.0000 0.5294 + 197 1.0000 1.0000 0.5373 + 198 1.0000 1.0000 0.5451 + 199 1.0000 1.0000 0.5529 + 200 1.0000 1.0000 0.5608 + 201 1.0000 1.0000 0.5686 + 202 1.0000 1.0000 0.5765 + 203 1.0000 1.0000 0.5843 + 204 1.0000 1.0000 0.5922 + 205 1.0000 1.0000 0.6000 + 206 1.0000 1.0000 0.6078 + 207 1.0000 1.0000 0.6157 + 208 1.0000 1.0000 0.6235 + 209 1.0000 1.0000 0.6314 + 210 1.0000 1.0000 0.6392 + 211 1.0000 1.0000 0.6471 + 212 1.0000 1.0000 0.6549 + 213 1.0000 1.0000 0.6627 + 214 1.0000 1.0000 0.6706 + 215 1.0000 1.0000 0.6784 + 216 1.0000 1.0000 0.6863 + 217 1.0000 1.0000 0.6941 + 218 1.0000 1.0000 0.7020 + 219 1.0000 1.0000 0.7098 + 220 1.0000 1.0000 0.7176 + 221 1.0000 1.0000 0.7255 + 222 1.0000 1.0000 0.7333 + 223 1.0000 1.0000 0.7412 + 224 1.0000 1.0000 0.7490 + 225 1.0000 1.0000 0.7569 + 226 1.0000 1.0000 0.7647 + 227 1.0000 1.0000 0.7725 + 228 1.0000 1.0000 0.7804 + 229 1.0000 1.0000 0.7882 + 230 1.0000 1.0000 0.7961 + 231 1.0000 1.0000 0.8039 + 232 1.0000 1.0000 0.8118 + 233 1.0000 1.0000 0.8196 + 234 1.0000 1.0000 0.8275 + 235 1.0000 1.0000 0.8353 + 236 1.0000 1.0000 0.8431 + 237 1.0000 1.0000 0.8510 + 238 1.0000 1.0000 0.8588 + 239 1.0000 1.0000 0.8667 + 240 1.0000 1.0000 0.8745 + 241 1.0000 1.0000 0.8824 + 242 1.0000 1.0000 0.8902 + 243 1.0000 1.0000 0.8980 + 244 1.0000 1.0000 0.9059 + 245 1.0000 1.0000 0.9137 + 246 1.0000 1.0000 0.9216 + 247 1.0000 1.0000 0.9294 + 248 1.0000 1.0000 0.9373 + 249 1.0000 1.0000 0.9451 + 250 1.0000 1.0000 0.9529 + 251 1.0000 1.0000 0.9608 + 252 1.0000 1.0000 0.9686 + 253 1.0000 1.0000 0.9765 + 254 1.0 0.0 0.0 + 255 1.0 1.0 0.0 + 256 0.0 1.000 0.0 diff --git a/q65w/astro.cpp b/q65w/astro.cpp new file mode 100644 index 000000000..a6b0460a8 --- /dev/null +++ b/q65w/astro.cpp @@ -0,0 +1,194 @@ +#include "astro.h" +#include +#include "ui_astro.h" +#include +#include +#include +#include +#include "SettingsGroup.hpp" +#include "commons.h" +#include + +extern "C" { + void astrosub_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, + const char* mygrid, const char* hisgrid, double* azsun, + double* elsun, double* azmoon, double* elmoon, double* azmoondx, + double* elmoondx, int* ntsky, int* ndop, int* ndop00, + double* ramoon, double* decmoon, double* dgrd, double* poloffset, + double* xnr, int len1, int len2); +} + +Astro::Astro (QString const& settings_filename, QWidget *parent) : + QWidget(parent), + ui(new Ui::Astro), + m_settings_filename {settings_filename} +{ + ui->setupUi (this); + setWindowTitle ("Astronomical Data"); + setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("AstroGeom", QRect {71, 390, 227, 403}).toRect ()); + ui->astroTextBrowser->setStyleSheet( + "QTextBrowser { background-color : cyan; color : black; }"); + ui->astroTextBrowser->clear(); + m_AzElDir0=""; +} + +Astro::~Astro() +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("AstroGeom", geometry ()); + delete ui; +} + +void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, + int fQSO, int nsetftx, int ntxFreq, QString azelDir, double xavg) +{ + static int ntxFreq0=-99; + char cc[300]; + double azsun,elsun,azmoon,elmoon,azmoondx,elmoondx; + double ramoon,decmoon,dgrd,poloffset,xnr; + int ntsky,ndop,ndop00; + QString date = t.date().toString("yyyy MMM dd"); + QString utc = t.time().toString(); + int nyear=t.date().year(); + int month=t.date().month(); + int nday=t.date().day(); + int nhr=t.time().hour(); + int nmin=t.time().minute(); + double sec=t.time().second() + 0.001*t.time().msec(); + int isec=sec; + double uth=nhr + nmin/60.0 + sec/3600.0; + int nfreq=(int)datcom_.fcenter; +// if(nfreq<10 or nfreq > 50000) nfreq=144; + + astrosub_(&nyear, &month, &nday, &uth, &nfreq, mygrid.toLatin1(), + hisgrid.toLatin1(), &azsun, &elsun, &azmoon, &elmoon, + &azmoondx, &elmoondx, &ntsky, &ndop, &ndop00,&ramoon, &decmoon, + &dgrd, &poloffset, &xnr, 6, 6); + + datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom + sprintf(cc, + "Az: %6.1f\n" + "El: %6.1f\n" + "MyDop: %6d\n" + "DxAz: %6.1f\n" + "DxEl: %6.1f\n" + "DxDop: %6d\n" + "Dec: %6.1f\n" + "SunAz: %6.1f\n" + "SunEl: %6.1f\n" + "Tsky: %6d\n" + "MNR: %6.1f\n" + "Dgrd: %6.1f", + azmoon,elmoon,ndop00,azmoondx,elmoondx,ndop,decmoon,azsun,elsun, + ntsky,xnr,dgrd); + ui->astroTextBrowser->setText(" "+ date + "\nUTC: " + utc + "\n" + cc); + + double azOffset=0.0; + double elOffset=0.0; + double rad=57.2957795131; + int iCycle=2; +// Are we doing pointing tests? + bool bPointing=ui->cbPointingTests->isChecked(); + ui->gbPointing->setVisible(bPointing); + if(bPointing) { + int nDwell=int(ui->sbDwell->value()); + if(ui->cbAutoCycle->isChecked()) { + iCycle=(t.currentSecsSinceEpoch()%(6*nDwell))/nDwell + 1; + if(iCycle==1) { + azOffset = -ui->sbOffset->value()/cos(elsun/rad); + ui->rb1->setChecked(true); + } + if(iCycle==2 or iCycle==5) { + ui->rb2->setChecked(true); + } + if(iCycle==3) { + azOffset = +ui->sbOffset->value()/cos(elsun/rad); + ui->rb3->setChecked(true); + } + if(iCycle==4) { + elOffset = -ui->sbOffset->value(); + ui->rb4->setChecked(true); + } + if(iCycle==6) { + elOffset = +ui->sbOffset->value(); + ui->rb6->setChecked(true); + } + } + if(ui->cbOnOff->isChecked()) { + iCycle=(t.currentSecsSinceEpoch()%(2*nDwell))/nDwell + 1; + if(iCycle==1) { + azOffset = -ui->sbOffset->value()/cos(elsun/rad); + ui->rb1->setChecked(true); + } + if(iCycle==2) { + ui->rb2->setChecked(true); + } + } + if(ui->cbAutoCycle->isChecked() or ui->cbOnOff->isChecked()) { + QFile f("pointing.out"); + if(f.open(QIODevice::WriteOnly | QIODevice::Append)) { + QTextStream out(&f); + out << t.toString("yyyy-MMM-dd hh:mm:ss"); + sprintf(cc,"%7.1f %7.1f %d %7.1f %7.1f %10.1f %7.2f\n", + azsun,elsun,iCycle,azOffset,elOffset,xavg,10.0*log10(xavg)); + out << cc; + f.close(); + } + } + } else { + ui->rb2->setChecked(true); + ui->cbAutoCycle->setChecked(false); + ui->cbOnOff->setChecked(false); + } + +// Write pointing data to azel.dat + QString fname=azelDir+"/azel.dat"; + QFile f(fname); + if(!f.open(QIODevice::WriteOnly | QIODevice::Text)) { + if(azelDir==m_AzElDir0) return; + m_AzElDir0=azelDir; + QMessageBox mb; + mb.setText("Cannot open " + fname + "\nCorrect the setting of AzEl Directory in Setup?"); + mb.exec(); + return; + } + int ndiff=0; + if(ntxFreq != ntxFreq0) ndiff=1; + ntxFreq0=ntxFreq; + QTextStream out(&f); + sprintf(cc,"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Moon\n" + "%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Sun\n" + "%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Source\n" + "%4d,%6d,%6d,Doppler\n" + "%3d,%1d,fQSO\n" + "%3d,%1d,fQSO2\n", + nhr,nmin,isec,azmoon,elmoon, + nhr,nmin,isec,azsun+azOffset,elsun+elOffset, + nhr,nmin,isec,0.0,0.0, + nfreq,ndop,ndop00, + fQSO,nsetftx, + ntxFreq,ndiff); + out << cc; + f.close(); +} + +void Astro::setFontSize(int n) +{ + ui->astroTextBrowser->setFontPointSize(n); +} + +void Astro::on_cbAutoCycle_clicked(bool checked) +{ + if(checked) ui->cbOnOff->setChecked(false); +} + +void Astro::on_cbOnOff_clicked(bool checked) +{ + if(checked) ui->cbAutoCycle->setChecked(false); +} + diff --git a/q65w/astro.h b/q65w/astro.h new file mode 100644 index 000000000..6b574237f --- /dev/null +++ b/q65w/astro.h @@ -0,0 +1,32 @@ +#ifndef ASTRO_H +#define ASTRO_H + +#include +#include + +namespace Ui { + class Astro; +} + +class Astro : public QWidget +{ + Q_OBJECT + +public: + explicit Astro (QString const& settings_filename, QWidget *parent = 0); + void astroUpdate(QDateTime t, QString mygrid, QString hisgrid, + int fQSO, int nsetftx, int ntxFreq, QString azelDir, double xavg); + void setFontSize(int n); + ~Astro (); + +private slots: + void on_cbOnOff_clicked(bool checked); + void on_cbAutoCycle_clicked(bool checked); + +private: + Ui::Astro *ui; + QString m_settings_filename; + QString m_AzElDir0; +}; + +#endif diff --git a/q65w/astro.ui b/q65w/astro.ui new file mode 100644 index 000000000..991a002f4 --- /dev/null +++ b/q65w/astro.ui @@ -0,0 +1,249 @@ + + + Astro + + + + 0 + 0 + 441 + 483 + + + + Form + + + + + 269 + 19 + 151 + 431 + + + + + + + + + 10 + 100 + 30 + 17 + + + + 1 + + + + + + 60 + 100 + 40 + 17 + + + + 2, 5 + + + true + + + + + + 110 + 100 + 30 + 17 + + + + 3 + + + + + + 60 + 150 + 30 + 17 + + + + 4 + + + + + + 60 + 50 + 30 + 17 + + + + 6 + + + + + + 10 + 230 + 130 + 22 + + + + Qt::AlignCenter + + + Offset + + + deg + + + 1 + + + 0.500000000000000 + + + 20.000000000000000 + + + 0.500000000000000 + + + 2.500000000000000 + + + + + + 30 + 330 + 91 + 17 + + + + Auto Cycle + + + + + + 30 + 380 + 70 + 17 + + + + On Off + + + + + + 10 + 280 + 130 + 22 + + + + Qt::AlignCenter + + + s + + + Dwell + + + 10 + + + 300 + + + 10 + + + + + + + 0 + 10 + 258 + 471 + + + + + + + + Courier New + 20 + 75 + true + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Pointing Tests + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + diff --git a/q65w/bandmap.cpp b/q65w/bandmap.cpp new file mode 100644 index 000000000..3c4daecb3 --- /dev/null +++ b/q65w/bandmap.cpp @@ -0,0 +1,100 @@ +#include "bandmap.h" +#include +#include "ui_bandmap.h" +#include "qt_helpers.hpp" +#include "SettingsGroup.hpp" +#include + +BandMap::BandMap (QString const& settings_filename, QWidget * parent) + : QWidget {parent}, + ui {new Ui::BandMap}, + m_settings_filename {settings_filename} +{ + ui->setupUi (this); + setWindowTitle ("Band Map"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("BandMapGeom", QRect {280, 400, 142, 400}).toRect ()); + ui->bmTextBrowser->setStyleSheet( + "QTextBrowser { background-color : #000066; color : red; }"); +} + +BandMap::~BandMap () +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("BandMapGeom", geometry ()); + delete ui; +} + +void BandMap::setText(QString t) +{ + m_bandMapText=t; + int w=ui->bmTextBrowser->size().width(); + int ncols=1; + if(w>220) ncols=2; + QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; + ui->bmTextBrowser->setStyleSheet(s); + QString t0="" + "
\n"; + QString tfreq,tspace,tcall; + QString s0,s1,s2,s3,bg; + bg="."; + s0=""; + s1=""; + s2=""; + s3=""; + + ui->bmTextBrowser->clear(); + QStringList lines = t.split( "\n", SkipEmptyParts ); + int nrows=(lines.length()+ncols-1)/ncols; + + for(int i=0; i=3) t0 += s3; + t0 += (tfreq + tspace + tcall + "
\n"); + } + + if(ncols==2) { //2-column display + t0 += "

\n"; + for(int i=nrows; i=3) t0 += s3; + t0 += (tfreq + tspace + tcall + "
\n"); + } + if(2*nrows>lines.length()) t0 += (s0 + "
\n"); + } + ui->bmTextBrowser->setHtml(t0); +} + +void BandMap::resizeEvent(QResizeEvent* ) +{ + setText(m_bandMapText); +} + +void BandMap::setColors(QString t) +{ + m_colorBackground = "#"+t.mid(0,6); + m_color0 = "#"+t.mid(6,6); + m_color1 = "#"+t.mid(12,6); + m_color2 = "#"+t.mid(18,6); + m_color3 = "#"+t.mid(24,6); + setText(m_bandMapText); +} diff --git a/q65w/bandmap.h b/q65w/bandmap.h new file mode 100644 index 000000000..857925800 --- /dev/null +++ b/q65w/bandmap.h @@ -0,0 +1,35 @@ +#ifndef BANDMAP_H +#define BANDMAP_H + +#include + +namespace Ui { + class BandMap; +} + +class BandMap : public QWidget +{ + Q_OBJECT + +public: + explicit BandMap (QString const& settings_filename, QWidget *parent = 0); + void setText(QString t); + void setColors(QString t); + + ~BandMap(); + +protected: + void resizeEvent(QResizeEvent* event); + +private: + Ui::BandMap *ui; + QString m_settings_filename; + QString m_bandMapText; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; +}; + +#endif diff --git a/q65w/bandmap.ui b/q65w/bandmap.ui new file mode 100644 index 000000000..cd87a41dd --- /dev/null +++ b/q65w/bandmap.ui @@ -0,0 +1,43 @@ + + + BandMap + + + + 0 + 0 + 329 + 379 + + + + + 0 + 0 + + + + Form + + + + + + + 107 + 0 + + + + + Courier New + 9 + + + + + + + + + diff --git a/q65w/blue.dat b/q65w/blue.dat new file mode 100644 index 000000000..852295114 --- /dev/null +++ b/q65w/blue.dat @@ -0,0 +1,256 @@ + 0 0.0000 0.0000 0.0000 + 1 0.0902 0.0902 0.2558 + 2 0.1176 0.1176 0.2694 + 3 0.1412 0.1412 0.2820 + 4 0.1569 0.1569 0.2938 + 5 0.1725 0.1725 0.3049 + 6 0.1843 0.1843 0.3154 + 7 0.1961 0.1961 0.3254 + 8 0.2039 0.2039 0.3349 + 9 0.2157 0.2157 0.3440 + 10 0.2235 0.2235 0.3528 + 11 0.2314 0.2314 0.3612 + 12 0.2392 0.2392 0.3693 + 13 0.2471 0.2471 0.3772 + 14 0.2549 0.2549 0.3848 + 15 0.2588 0.2588 0.3921 + 16 0.2667 0.2667 0.3992 + 17 0.2706 0.2706 0.4061 + 18 0.2784 0.2784 0.4129 + 19 0.2824 0.2824 0.4194 + 20 0.2902 0.2902 0.4258 + 21 0.2941 0.2941 0.4319 + 22 0.2980 0.2980 0.4380 + 23 0.3059 0.3059 0.4439 + 24 0.3098 0.3098 0.4496 + 25 0.3137 0.3137 0.4553 + 26 0.3176 0.3176 0.4608 + 27 0.3216 0.3216 0.4661 + 28 0.3294 0.3294 0.4714 + 29 0.3333 0.3333 0.4765 + 30 0.3373 0.3373 0.4815 + 31 0.3412 0.3412 0.4865 + 32 0.3451 0.3451 0.4913 + 33 0.3490 0.3490 0.4960 + 34 0.3529 0.3529 0.5006 + 35 0.3569 0.3569 0.5052 + 36 0.3608 0.3608 0.5096 + 37 0.3647 0.3647 0.5140 + 38 0.3686 0.3686 0.5183 + 39 0.3725 0.3725 0.5225 + 40 0.3765 0.3765 0.5266 + 41 0.3804 0.3804 0.5306 + 42 0.3843 0.3843 0.5346 + 43 0.3843 0.3843 0.5385 + 44 0.3882 0.3882 0.5423 + 45 0.3922 0.3922 0.5460 + 46 0.3961 0.3961 0.5497 + 47 0.4000 0.4000 0.5533 + 48 0.4039 0.4039 0.5569 + 49 0.4078 0.4078 0.5603 + 50 0.4118 0.4118 0.5638 + 51 0.4118 0.4118 0.5671 + 52 0.4157 0.4157 0.5704 + 53 0.4196 0.4196 0.5736 + 54 0.4235 0.4235 0.5768 + 55 0.4275 0.4275 0.5799 + 56 0.4314 0.4314 0.5829 + 57 0.4314 0.4314 0.5859 + 58 0.4353 0.4353 0.5889 + 59 0.4392 0.4392 0.5917 + 60 0.4431 0.4431 0.5946 + 61 0.4471 0.4471 0.5973 + 62 0.4471 0.4471 0.6001 + 63 0.4510 0.4510 0.6027 + 64 0.4549 0.4549 0.6053 + 65 0.4588 0.4588 0.6079 + 66 0.4627 0.4627 0.6104 + 67 0.4627 0.4627 0.6129 + 68 0.4667 0.4667 0.6153 + 69 0.4706 0.4706 0.6176 + 70 0.4745 0.4745 0.6199 + 71 0.4745 0.4745 0.6222 + 72 0.4784 0.4784 0.6244 + 73 0.4824 0.4824 0.6266 + 74 0.4863 0.4863 0.6287 + 75 0.4863 0.4863 0.6308 + 76 0.4902 0.4902 0.6328 + 77 0.4941 0.4941 0.6348 + 78 0.4980 0.4980 0.6367 + 79 0.5020 0.5020 0.6386 + 80 0.5020 0.5020 0.6404 + 81 0.5059 0.5059 0.6422 + 82 0.5098 0.5098 0.6440 + 83 0.5098 0.5098 0.6457 + 84 0.5137 0.5137 0.6474 + 85 0.5176 0.5176 0.6490 + 86 0.5216 0.5216 0.6506 + 87 0.5216 0.5216 0.6521 + 88 0.5255 0.5255 0.6536 + 89 0.5294 0.5294 0.6551 + 90 0.5333 0.5333 0.6565 + 91 0.5333 0.5333 0.6578 + 92 0.5373 0.5373 0.6591 + 93 0.5412 0.5412 0.6604 + 94 0.5451 0.5451 0.6617 + 95 0.5451 0.5451 0.6629 + 96 0.5490 0.5490 0.6640 + 97 0.5529 0.5529 0.6651 + 98 0.5569 0.5569 0.6662 + 99 0.5569 0.5569 0.6672 + 100 0.5608 0.5608 0.6682 + 101 0.5647 0.5647 0.6692 + 102 0.5647 0.5647 0.6701 + 103 0.5686 0.5686 0.6710 + 104 0.5725 0.5725 0.6718 + 105 0.5765 0.5765 0.6726 + 106 0.5765 0.5765 0.6733 + 107 0.5804 0.5804 0.6740 + 108 0.5843 0.5843 0.6747 + 109 0.5843 0.5843 0.6753 + 110 0.5882 0.5882 0.6759 + 111 0.5922 0.5922 0.6765 + 112 0.5961 0.5961 0.6770 + 113 0.5961 0.5961 0.6774 + 114 0.6000 0.6000 0.6779 + 115 0.6039 0.6039 0.6783 + 116 0.6039 0.6039 0.6786 + 117 0.6078 0.6078 0.6789 + 118 0.6118 0.6118 0.6792 + 119 0.6157 0.6157 0.6794 + 120 0.6157 0.6157 0.6796 + 121 0.6196 0.6196 0.6798 + 122 0.6235 0.6235 0.6799 + 123 0.6235 0.6235 0.6800 + 124 0.6275 0.6275 0.6800 + 125 0.6314 0.6314 0.6800 + 126 0.6353 0.6353 0.6799 + 127 0.6353 0.6353 0.6799 + 128 0.6392 0.6392 0.6797 + 129 0.6431 0.6431 0.6796 + 130 0.6431 0.6431 0.6794 + 131 0.6471 0.6471 0.6791 + 132 0.6510 0.6510 0.6789 + 133 0.6549 0.6549 0.6785 + 134 0.6549 0.6549 0.6782 + 135 0.6588 0.6588 0.6778 + 136 0.6627 0.6627 0.6773 + 137 0.6627 0.6627 0.6769 + 138 0.6667 0.6667 0.6763 + 139 0.6706 0.6706 0.6758 + 140 0.6745 0.6745 0.6752 + 141 0.6745 0.6745 0.6746 + 142 0.6784 0.6784 0.6739 + 143 0.6824 0.6824 0.6732 + 144 0.6824 0.6824 0.6724 + 145 0.6863 0.6863 0.6716 + 146 0.6902 0.6902 0.6708 + 147 0.6941 0.6941 0.6699 + 148 0.6941 0.6941 0.6690 + 149 0.6980 0.6980 0.6680 + 150 0.7020 0.7020 0.6670 + 151 0.7020 0.7020 0.6660 + 152 0.7059 0.7059 0.6649 + 153 0.7098 0.7098 0.6638 + 154 0.7098 0.7098 0.6626 + 155 0.7137 0.7137 0.6614 + 156 0.7176 0.7176 0.6601 + 157 0.7216 0.7216 0.6589 + 158 0.7216 0.7216 0.6575 + 159 0.7255 0.7255 0.6561 + 160 0.7294 0.7294 0.6547 + 161 0.7294 0.7294 0.6533 + 162 0.7333 0.7333 0.6518 + 163 0.7373 0.7373 0.6502 + 164 0.7412 0.7412 0.6486 + 165 0.7412 0.7412 0.6470 + 166 0.7451 0.7451 0.6453 + 167 0.7490 0.7490 0.6436 + 168 0.7490 0.7490 0.6418 + 169 0.7529 0.7529 0.6400 + 170 0.7569 0.7569 0.6382 + 171 0.7608 0.7608 0.6363 + 172 0.7608 0.7608 0.6343 + 173 0.7647 0.7647 0.6324 + 174 0.7686 0.7686 0.6303 + 175 0.7686 0.7686 0.6282 + 176 0.7725 0.7725 0.6261 + 177 0.7765 0.7765 0.6239 + 178 0.7804 0.7804 0.6217 + 179 0.7804 0.7804 0.6194 + 180 0.7843 0.7843 0.6171 + 181 0.7882 0.7882 0.6147 + 182 0.7882 0.7882 0.6123 + 183 0.7922 0.7922 0.6098 + 184 0.7961 0.7961 0.6073 + 185 0.8000 0.8000 0.6047 + 186 0.8000 0.8000 0.6021 + 187 0.8039 0.8039 0.5994 + 188 0.8078 0.8078 0.5967 + 189 0.8078 0.8078 0.5939 + 190 0.8118 0.8118 0.5911 + 191 0.8157 0.8157 0.5882 + 192 0.8196 0.8196 0.5853 + 193 0.8196 0.8196 0.5823 + 194 0.8235 0.8235 0.5792 + 195 0.8275 0.8275 0.5761 + 196 0.8275 0.8275 0.5729 + 197 0.8314 0.8314 0.5697 + 198 0.8353 0.8353 0.5664 + 199 0.8392 0.8392 0.5630 + 200 0.8392 0.8392 0.5596 + 201 0.8431 0.8431 0.5561 + 202 0.8471 0.8471 0.5525 + 203 0.8471 0.8471 0.5489 + 204 0.8510 0.8510 0.5452 + 205 0.8549 0.8549 0.5414 + 206 0.8588 0.8588 0.5376 + 207 0.8588 0.8588 0.5337 + 208 0.8627 0.8627 0.5297 + 209 0.8667 0.8667 0.5257 + 210 0.8667 0.8667 0.5215 + 211 0.8706 0.8706 0.5173 + 212 0.8745 0.8745 0.5130 + 213 0.8784 0.8784 0.5086 + 214 0.8784 0.8784 0.5042 + 215 0.8824 0.8824 0.4996 + 216 0.8863 0.8863 0.4950 + 217 0.8863 0.8863 0.4902 + 218 0.8902 0.8902 0.4854 + 219 0.8941 0.8941 0.4804 + 220 0.8980 0.8980 0.4754 + 221 0.8980 0.8980 0.4702 + 222 0.9020 0.9020 0.4649 + 223 0.9059 0.9059 0.4595 + 224 0.9098 0.9098 0.4540 + 225 0.9098 0.9098 0.4484 + 226 0.9137 0.9137 0.4426 + 227 0.9176 0.9176 0.4366 + 228 0.9176 0.9176 0.4306 + 229 0.9216 0.9216 0.4243 + 230 0.9255 0.9255 0.4179 + 231 0.9294 0.9294 0.4114 + 232 0.9294 0.9294 0.4046 + 233 0.9333 0.9333 0.3977 + 234 0.9373 0.9373 0.3905 + 235 0.9373 0.9373 0.3831 + 236 0.9412 0.9412 0.3754 + 237 0.9451 0.9451 0.3675 + 238 0.9490 0.9490 0.3594 + 239 0.9490 0.9490 0.3509 + 240 0.9529 0.9529 0.3420 + 241 0.9569 0.9569 0.3328 + 242 0.9608 0.9608 0.3232 + 243 0.9608 0.9608 0.3131 + 244 0.9647 0.9647 0.3024 + 245 0.9686 0.9686 0.2912 + 246 0.9686 0.9686 0.2792 + 247 0.9725 0.9725 0.2664 + 248 0.9765 0.9765 0.2526 + 249 0.9804 0.9804 0.2375 + 250 0.9804 0.9804 0.2208 + 251 0.9843 0.9843 0.2020 + 252 0.9882 0.9882 0.1800 + 253 1.0 0.0 0.0 + 254 1.0 1.0 0.0 + 255 0.0 1.000 0.0 diff --git a/q65w/commons.h b/q65w/commons.h new file mode 100644 index 000000000..f7ea43d9e --- /dev/null +++ b/q65w/commons.h @@ -0,0 +1,48 @@ +#ifndef COMMONS_H +#define COMMONS_H + +#define NFFT 32768 + +extern "C" { + +extern struct { //This is "common/datcom/..." in Fortran + float d4[4*5760000]; //Raw I/Q data from Linrad + float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol + float savg[4*NFFT]; //Avg spectra at 0,45,90,135 deg pol + double fcenter; //Center freq from Linrad (MHz) + int nutc; //UTC as integer, HHMM + int idphi; //Phase correction for Y pol'n, degrees + int mousedf; //User-selected DF + int mousefqso; //User-selected QSO freq (kHz) + int nagain; //1 ==> decode only at fQSO +/- Tol + int ndepth; //How much hinted decoding to do? + int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int neme; //Hinted decoding tries only for EME calls + int newdat; //1 ==> new data, must do long FFT + int nfa; //Low decode limit (kHz) + int nfb; //High decode limit (kHz) + int nfcal; //Frequency correction, for calibration (Hz) + int nfshift; //Shift of displayed center freq (kHz) + int mcall3; //1 ==> CALL3.TXT has been modified + int ntimeout; //Max for timeouts in Messages and BandMap + int ntol; //+/- decoding range around fQSO (Hz) + int nxant; //1 ==> add 45 deg to measured pol angle + int map65RxLog; //Flags to control log files + int nfsample; //Input sample rate + int nxpol; //1 if using xpol antennas, 0 otherwise + int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 + int nfast; //No longer used + int nsave; //Number of s3(64,63) spectra saved + int max_drift; //Maximum Q65 drift: units symbol_rate/TxT + int nhsym; //Number of available JT65 half-symbols + char mycall[12]; + char mygrid[6]; + char hiscall[12]; + char hisgrid[6]; + char datetime[20]; + int junk1; //Used to test extent of copy to shared memory + int junk2; +} datcom_; +} + +#endif // COMMONS_H diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp new file mode 100644 index 000000000..fe9d14a95 --- /dev/null +++ b/q65w/devsetup.cpp @@ -0,0 +1,389 @@ +#include "devsetup.h" +#include "mainwindow.h" +#include +#include +#include +#include + +#define MAXDEVICES 200 + +//----------------------------------------------------------- DevSetup() +DevSetup::DevSetup(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); //setup the dialog form + m_restartSoundIn=false; + m_restartSoundOut=false; +} + +DevSetup::~DevSetup() +{ +} + +void DevSetup::initDlg() +{ + int k,id; + int valid_devices=0; + int minChan[MAXDEVICES]; + int maxChan[MAXDEVICES]; + int minSpeed[MAXDEVICES]; + int maxSpeed[MAXDEVICES]; + char hostAPI_DeviceName[MAXDEVICES][50]; + char s[256]; + int numDevices=Pa_GetDeviceCount(); + getDev(&numDevices,hostAPI_DeviceName,minChan,maxChan,minSpeed,maxSpeed); + k=0; + for(id=0; id= minSpeed[id] && 96000 <= maxSpeed[id]) { + m_inDevList[k]=id; + k++; + sprintf(s,"%2d %d %-49s",id,maxChan[id],hostAPI_DeviceName[id]); + QString t(s); + ui.comboBoxSndIn->addItem(t); + valid_devices++; + } + } + + const PaDeviceInfo *pdi; + int nchout; + char *p,*p1; + char p2[256]; + char pa_device_name[128]; + char pa_device_hostapi[128]; + + k=0; + for(id=0; idmaxOutputChannels; + if(nchout>=2) { + m_outDevList[k]=id; + k++; + sprintf((char*)(pa_device_name),"%s",pdi->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo(pdi->hostApi)->name); + + p1=(char*)""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1=(char*)"MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1=(char*)"DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1=(char*)"WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1=(char*)"ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1=(char*)"WDM-KS"; + + sprintf(p2,"%2d %-8s %-39s",id,p1,pa_device_name); + QString t(p2); + ui.comboBoxSndOut->addItem(t); + } + } + + ui.myCallEntry->setText(m_myCall); + ui.myGridEntry->setText(m_myGrid); + ui.idIntSpinBox->setValue(m_idInt); + ui.pttComboBox->setCurrentIndex(m_pttPort); + ui.astroFont->setValue(m_astroFont); + ui.cbXpol->setChecked(m_xpol); + ui.rbAntennaX->setChecked(m_xpolx); + ui.saveDirEntry->setText(m_saveDir); + ui.azelDirEntry->setText(m_azelDir); + ui.editorEntry->setText(m_editorCommand); + ui.dxccEntry->setText(m_dxccPfx); + ui.timeoutSpinBox->setValue(m_timeout); + ui.dPhiSpinBox->setValue(m_dPhi); + ui.fCalSpinBox->setValue(m_fCal); + ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); + ui.networkRadioButton->setChecked(m_network); + ui.soundCardRadioButton->setChecked(!m_network); + ui.rb96000->setChecked(m_fs96000); + ui.rb95238->setChecked(!m_fs96000); + ui.rbIQXT->setChecked(m_bIQxt); + ui.rbSi570->setChecked(!m_bIQxt); + ui.mult570TxSpinBox->setEnabled(m_bIQxt); + ui.comboBoxSndIn->setEnabled(!m_network); + ui.comboBoxSndIn->setCurrentIndex(m_nDevIn); + ui.comboBoxSndOut->setCurrentIndex(m_nDevOut); + ui.sbPort->setValue(m_udpPort); + ui.cbIQswap->setChecked(m_IQswap); + ui.cbInitIQplus->setChecked(m_initIQplus); + ui.sb_dB->setValue(m_dB); + ui.mult570SpinBox->setValue(m_mult570); + ui.mult570TxSpinBox->setValue(m_mult570Tx); + ui.cal570SpinBox->setValue(m_cal570); + ui.sbTxOffset->setValue(m_TxOffset); + ::sscanf (m_colors.toLatin1(),"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", + &r,&g,&b,&r0,&g0,&b0,&r1,&g1,&b1,&r2,&g2,&b2,&r3,&g3,&b3); + updateColorLabels(); + ui.sbBackgroundRed->setValue(r); + ui.sbBackgroundGreen->setValue(g); + ui.sbBackgroundBlue->setValue(b); + ui.sbRed0->setValue(r0); + ui.sbRed1->setValue(r1); + ui.sbRed2->setValue(r2); + ui.sbRed3->setValue(r3); + ui.sbGreen0->setValue(g0); + ui.sbGreen1->setValue(g1); + ui.sbGreen2->setValue(g2); + ui.sbGreen3->setValue(g3); + ui.sbBlue0->setValue(b0); + ui.sbBlue1->setValue(b1); + ui.sbBlue2->setValue(b2); + ui.sbBlue3->setValue(b3); + + m_paInDevice=m_inDevList[m_nDevIn]; + m_paOutDevice=m_outDevList[m_nDevOut]; + +} + +//------------------------------------------------------- accept() +void DevSetup::accept() +{ + // Called when OK button is clicked. + // Check to see whether SoundInThread must be restarted, + // and save user parameters. + + if(m_network!=ui.networkRadioButton->isChecked() or + m_nDevIn!=ui.comboBoxSndIn->currentIndex() or + m_paInDevice!=m_inDevList[m_nDevIn] or + m_xpol!=ui.cbXpol->isChecked() or + m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true; + + if(m_nDevOut!=ui.comboBoxSndOut->currentIndex() or + m_paOutDevice!=m_outDevList[m_nDevOut]) m_restartSoundOut=true; + + m_myCall=ui.myCallEntry->text(); + m_myGrid=ui.myGridEntry->text(); + m_idInt=ui.idIntSpinBox->value(); + m_pttPort=ui.pttComboBox->currentIndex(); + m_astroFont=ui.astroFont->value(); + m_xpol=ui.cbXpol->isChecked(); + m_xpolx=ui.rbAntennaX->isChecked(); + m_saveDir=ui.saveDirEntry->text(); + m_azelDir=ui.azelDirEntry->text(); + m_editorCommand=ui.editorEntry->text(); + m_dxccPfx=ui.dxccEntry->text(); + m_timeout=ui.timeoutSpinBox->value(); + m_dPhi=ui.dPhiSpinBox->value(); + m_fCal=ui.fCalSpinBox->value(); + m_fAdd=ui.faddEntry->text().toDouble(); + m_network=ui.networkRadioButton->isChecked(); + m_fs96000=ui.rb96000->isChecked(); + m_bIQxt=ui.rbIQXT->isChecked(); + m_nDevIn=ui.comboBoxSndIn->currentIndex(); + m_paInDevice=m_inDevList[m_nDevIn]; + m_nDevOut=ui.comboBoxSndOut->currentIndex(); + m_paOutDevice=m_outDevList[m_nDevOut]; + m_udpPort=ui.sbPort->value(); + m_IQswap=ui.cbIQswap->isChecked(); + m_initIQplus=ui.cbInitIQplus->isChecked(); + m_dB=ui.sb_dB->value(); + m_mult570=ui.mult570SpinBox->value(); + m_mult570Tx=ui.mult570TxSpinBox->value(); + m_cal570=ui.cal570SpinBox->value(); + m_TxOffset=ui.sbTxOffset->value(); + + QDialog::accept(); +} + +void DevSetup::on_soundCardRadioButton_toggled(bool checked) +{ + ui.comboBoxSndIn->setEnabled(ui.soundCardRadioButton->isChecked()); + ui.rb96000->setChecked(checked); + ui.rb95238->setEnabled(!checked); + ui.label_InputDev->setEnabled(checked); + ui.label_Port->setEnabled(!checked); + ui.sbPort->setEnabled(!checked); + ui.cbIQswap->setEnabled(checked); + ui.sb_dB->setEnabled(checked); +} + +void DevSetup::on_cbXpol_stateChanged(int n) +{ + m_xpol = (n!=0); + ui.rbAntenna->setEnabled(m_xpol); + ui.rbAntennaX->setEnabled(m_xpol); + ui.dPhiSpinBox->setEnabled(m_xpol); + ui.labelDphi->setEnabled(m_xpol); +} + +void DevSetup::on_cal570SpinBox_valueChanged(double ppm) +{ + m_cal570=ppm; +} + +void DevSetup::on_mult570SpinBox_valueChanged(int mult) +{ + m_mult570=mult; +} + +void DevSetup::on_sb_dB_valueChanged(int n) +{ + m_dB=n; +} + +void DevSetup::updateColorLabels() +{ + QString t; + int r=ui.sbBackgroundRed->value(); + int g=ui.sbBackgroundGreen->value(); + int b=ui.sbBackgroundBlue->value(); + int r0=ui.sbRed0->value(); + int r1=ui.sbRed1->value(); + int r2=ui.sbRed2->value(); + int r3=ui.sbRed3->value(); + int g0=ui.sbGreen0->value(); + int g1=ui.sbGreen1->value(); + int g2=ui.sbGreen2->value(); + int g3=ui.sbGreen3->value(); + int b0=ui.sbBlue0->value(); + int b1=ui.sbBlue1->value(); + int b2=ui.sbBlue2->value(); + int b3=ui.sbBlue3->value(); + + ui.lab0->setStyleSheet ( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r0, 2, 16, QLatin1Char {'0'}) + .arg (g0, 2, 16, QLatin1Char {'0'}) + .arg (b0, 2, 16, QLatin1Char {'0'}) + ); + ui.lab1->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r1, 2, 16, QLatin1Char {'0'}) + .arg (g1, 2, 16, QLatin1Char {'0'}) + .arg (b1, 2, 16, QLatin1Char {'0'}) + ); + ui.lab2->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r2, 2, 16, QLatin1Char {'0'}) + .arg (g2, 2, 16, QLatin1Char {'0'}) + .arg (b2, 2, 16, QLatin1Char {'0'}) + ); + ui.lab3->setStyleSheet( + QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} + .arg (r, 2, 16, QLatin1Char {'0'}) + .arg (g, 2, 16, QLatin1Char {'0'}) + .arg (b, 2, 16, QLatin1Char {'0'}) + .arg (r3, 2, 16, QLatin1Char {'0'}) + .arg (g3, 2, 16, QLatin1Char {'0'}) + .arg (b3, 2, 16, QLatin1Char {'0'}) + ); + + m_colors.clear (); + QTextStream ots {&m_colors, QIODevice::WriteOnly}; + ots.setIntegerBase (16); + ots.setFieldWidth (2); + ots.setPadChar ('0'); + ots << r << g << b << r0 << g0 << b0 << r1 << g1 << b1 << r2 << g2 << b2 << r3 << g3 << b3; +} + +void DevSetup::on_sbBackgroundRed_valueChanged(int /*r*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBackgroundGreen_valueChanged(int /*g*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBackgroundBlue_valueChanged(int /*b*/) +{ + updateColorLabels(); +} + + +void DevSetup::on_sbRed0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue0_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue1_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue2_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbRed3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbGreen3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_sbBlue3_valueChanged(int /*arg1*/) +{ + updateColorLabels(); +} + +void DevSetup::on_pushButton_5_clicked() +{ + QColor color = QColorDialog::getColor(Qt::green, this); + if (color.isValid()) { + } +} + +void DevSetup::on_mult570TxSpinBox_valueChanged(int n) +{ + m_mult570Tx=n; +} + +void DevSetup::on_rbIQXT_toggled(bool checked) +{ + m_bIQxt=checked; + ui.mult570TxSpinBox->setEnabled(m_bIQxt); + ui.label_25->setEnabled(m_bIQxt); + ui.sbTxOffset->setEnabled(m_bIQxt); + ui.label_26->setEnabled(m_bIQxt); +} + +void DevSetup::on_sbTxOffset_valueChanged(double f) +{ + m_TxOffset=f; +} diff --git a/q65w/devsetup.h b/q65w/devsetup.h new file mode 100644 index 000000000..c32a83e96 --- /dev/null +++ b/q65w/devsetup.h @@ -0,0 +1,91 @@ +#ifndef DEVSETUP_H +#define DEVSETUP_H + +#include +#include "ui_devsetup.h" + +class DevSetup : public QDialog +{ + Q_OBJECT +public: + DevSetup(QWidget *parent=0); + ~DevSetup(); + + void initDlg(); + qint32 m_idInt; + qint32 m_pttPort; + qint32 m_nDevIn; + qint32 m_nDevOut; + qint32 m_inDevList[100]; + qint32 m_outDevList[100]; + qint32 m_paInDevice; + qint32 m_paOutDevice; + qint32 m_timeout; + qint32 m_dPhi; + qint32 m_fCal; + qint32 m_udpPort; + qint32 m_astroFont; + qint32 m_mult570; + qint32 m_mult570Tx; + qint32 m_dB; + + double m_fAdd; + double m_cal570; + double m_TxOffset; + + bool m_xpolx; + bool m_network; + bool m_fs96000; + bool m_xpol; + bool m_IQswap; + bool m_restartSoundIn; + bool m_restartSoundOut; + bool m_initIQplus; + bool m_bIQxt; + + QString m_myCall; + QString m_myGrid; + QString m_saveDir; + QString m_azelDir; + QString m_dxccPfx; + QString m_colors; + QString m_editorCommand; + + QColor m_colorBackground; + +public slots: + void accept(); + +private slots: + void on_soundCardRadioButton_toggled(bool checked); + void on_cbXpol_stateChanged(int arg1); + void on_cal570SpinBox_valueChanged(double ppm); + void on_mult570SpinBox_valueChanged(int mult); + void on_sbBackgroundRed_valueChanged(int arg1); + void on_sbBackgroundGreen_valueChanged(int arg1); + void on_sbBackgroundBlue_valueChanged(int arg1); + void updateColorLabels(void); + void on_sbRed0_valueChanged(int arg1); + void on_sbGreen0_valueChanged(int arg1); + void on_sbBlue0_valueChanged(int arg1); + void on_sbRed1_valueChanged(int arg1); + void on_sbGreen1_valueChanged(int arg1); + void on_sbBlue1_valueChanged(int arg1); + void on_sbRed2_valueChanged(int arg1); + void on_sbGreen2_valueChanged(int arg1); + void on_sbBlue2_valueChanged(int arg1); + void on_sbRed3_valueChanged(int arg1); + void on_sbGreen3_valueChanged(int arg1); + void on_sbBlue3_valueChanged(int arg1); + void on_pushButton_5_clicked(); + void on_mult570TxSpinBox_valueChanged(int arg1); + void on_rbIQXT_toggled(bool checked); + void on_sbTxOffset_valueChanged(double f); + void on_sb_dB_valueChanged(int n); + +private: + int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3; + Ui::DialogSndCard ui; +}; + +#endif // DEVSETUP_H diff --git a/q65w/devsetup.ui b/q65w/devsetup.ui new file mode 100644 index 000000000..48f2a0b2c --- /dev/null +++ b/q65w/devsetup.ui @@ -0,0 +1,1813 @@ + + + DialogSndCard + + + + 0 + 0 + 463 + 390 + + + + Setup / Options + + + + + + 0 + + + + Station + + + + + 10 + 34 + 421 + 275 + + + + + + + + + + + + 0 + 20 + + + + My Call: + + + + + + + + 0 + 20 + + + + My Grid: + + + + + + + + 0 + 20 + + + + ID Interval (min): + + + + + + + + 0 + 20 + + + + PTT Port: + + + + + + + Astro Font Size: + + + + + + + + + + + + 60 + 16777215 + + + + K1JT + + + + + + + + 60 + 16777215 + + + + FN20qi + + + + + + + -20 + + + 10 + + + + + + + + 60 + 16777215 + + + + false + + + + None + + + + + COM1 + + + + + COM2 + + + + + COM3 + + + + + COM4 + + + + + COM5 + + + + + COM6 + + + + + COM7 + + + + + COM8 + + + + + COM9 + + + + + COM10 + + + + + COM11 + + + + + COM12 + + + + + COM13 + + + + + + + + 12 + + + 32 + + + 20 + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + + 0 + 20 + + + + DXCC: + + + + + + + + 0 + 20 + + + + Timeout (min): + + + + + + + + 0 + 20 + + + + Fcal (Hz): + + + + + + + + 0 + 20 + + + + Fadd (MHz) + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + + + + 16777215 + 16777215 + + + + PJ9 + + + + + + + 40 + + + + + + + -20000 + + + 20000 + + + + + + + 0.0 + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + + + + 0 + 0 + + + + + 0 + 55 + + + + Antennas: + + + + + 10 + 23 + 321 + 22 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Xpol + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + + + + true + + + + + + + x + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 40 + 20 + + + + + + + + + 0 + 20 + + + + Dphi: + + + + + + + + 0 + 20 + + + + -180 + + + 180 + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 80 + 20 + + + + Save Directory: + + + + + + + C:\Users\joe\wsjt\map65\save + + + + + + + + + + + + 80 + 20 + + + + AzEl Directory: + + + + + + + C:\Users\joe\wsjt\map65 + + + + + + + + + + + + 80 + 20 + + + + Editor command: + + + + + + + + 328 + 16777215 + + + + notepad + + + + + + + + + + + I/O Devices + + + + + 0 + 10 + 361 + 291 + + + + + + + Input Source (Rx, Baseband) + + + + + 13 + 14 + 341 + 211 + + + + + + + + + true + + + SoundCard + + + false + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Network + + + true + + + + + + + + + + + false + + + + 0 + 20 + + + + Swap I/Q + + + + + + + <html><head/><body><p>Adjust to scale digital I/Q data.</p></body></html> + + + dB + + + Gain + + + -50 + + + 10 + + + 1 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 57 + 0 + + + + 20000 + + + 51000 + + + 50004 + + + + + + + + 0 + 0 + + + + + 26 + 0 + + + + + 16777215 + 20 + + + + Port + + + + + + + + + false + + + + 0 + 0 + + + + Dev Ch API Name + + + + + + + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 50 + 13 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 13 + + + + + + + + + 0 + 0 + + + + + 16777215 + 60 + + + + Sample Rate + + + + + 30 + 20 + 282 + 22 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 96000 Hz + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 95238 Hz + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + 0 + 0 + + + + + 16777215 + 55 + + + + Output Device (Tx Audio) + + + + + 10 + 20 + 291 + 22 + + + + + + + + + + + Colors + + + + + 12 + 21 + 351 + 281 + + + + + + + + 10 + + + + Choose colors for Band Map and Messages Windows + + + Qt::AlignCenter + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 80 + 20 + + + + + + + + Red + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 31 + 20 + + + + + + + + Green + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 34 + 20 + + + + + + + + Blue + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 80 + 20 + + + + + + + + + + + + + 60 + 16777215 + + + + Background + + + Qt::AlignCenter + + + + + + + 255 + + + + + + + 255 + + + + + + + 255 + + + 102 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 55 + 20 + + + + + + + + + + + + + 60 + 16777215 + + + + Newest + + + Qt::AlignCenter + + + + + + + 255 + + + 255 + + + + + + + 255 + + + + + + + 255 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + 2nd + + + Qt::AlignCenter + + + + + + + 255 + + + 255 + + + + + + + 255 + + + 255 + + + + + + + 255 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + 3rd + + + Qt::AlignCenter + + + + + + + 255 + + + 150 + + + + + + + 255 + + + 150 + + + + + + + 255 + + + 150 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + + 60 + 16777215 + + + + Oldest + + + Qt::AlignCenter + + + + + + + 255 + + + 100 + + + + + + + 255 + + + 100 + + + + + + + 255 + + + 100 + + + + + + + + 0 + 0 + + + + + 50 + 16777215 + + + + + Courier New + 9 + + + + K1ABC + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Color Selector + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Si570 Control + + + + + 41 + 41 + 272 + 248 + + + + + + + + + LO Selection: + + + + + + + IQ+, Generic Si570 + + + true + + + + + + + IQ+ Rx/XT + + + false + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + + + Rx frequency multiplier: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 47 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 1 + + + 8 + + + 2 + + + + + + + + + + + Tx Offset (MHz): + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 3 + + + 150.000000000000000 + + + 130.900000000000006 + + + + + + + + + + + false + + + Tx frequency multiplier: + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 47 + 20 + + + + + + + + false + + + + 0 + 0 + + + + + 80 + 0 + + + + 1 + + + + + + + + + + + Frequency correction (ppm): + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + 3 + + + -200.000000000000000 + + + 200.000000000000000 + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + Initialize IQ+ on startup + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + DialogSndCard + accept() + + + 257 + 380 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogSndCard + reject() + + + 325 + 380 + + + 286 + 274 + + + + + diff --git a/q65w/displaytext.cpp b/q65w/displaytext.cpp new file mode 100644 index 000000000..4d7286d3b --- /dev/null +++ b/q65w/displaytext.cpp @@ -0,0 +1,15 @@ +#include "displaytext.h" +#include +#include + +DisplayText::DisplayText(QWidget *parent) : + QTextBrowser(parent) +{ +} + +void DisplayText::mouseDoubleClickEvent(QMouseEvent *e) +{ + bool ctrl = (e->modifiers() & 0x4000000); + emit(selectCallsign(ctrl)); + QTextBrowser::mouseDoubleClickEvent(e); +} diff --git a/q65w/displaytext.h b/q65w/displaytext.h new file mode 100644 index 000000000..4553d53fb --- /dev/null +++ b/q65w/displaytext.h @@ -0,0 +1,22 @@ +#ifndef DISPLAYTEXT_H +#define DISPLAYTEXT_H + +#include + +class DisplayText : public QTextBrowser +{ + Q_OBJECT +public: + explicit DisplayText(QWidget *parent = 0); + +signals: + void selectCallsign(bool ctrl); + +public slots: + +protected: + void mouseDoubleClickEvent(QMouseEvent *e); + +}; + +#endif // DISPLAYTEXT_H diff --git a/q65w/ffft.f b/q65w/ffft.f new file mode 100644 index 000000000..9c3c091a7 --- /dev/null +++ b/q65w/ffft.f @@ -0,0 +1,69 @@ + subroutine ffft(d,npts,isign,ireal) + +C Fourier transform of length npts=2**k, performed in place. +C Input data in array d, treated as complex if ireal=0, and as real if ireal=1. +C In either case the transform values are returned in array d, treated as +C complex. The DC term is d(1), and d(npts/2+1) is the term at the Nyquist +C frequency. The basic algorithm is the same as Norm Brenner's FOUR1, and +C uses radix-2 transforms. + +C J. H. Taylor, Princeton University. + + complex d(npts),t,w,wstep,tt,uu + data pi/3.14159265359/ + +C Shuffle the data to bit-reversed order. + + imax=npts/(ireal+1) + irev=1 + do 5 i=1,imax + if(i.ge.irev) go to 2 + t=d(i) + d(i)=d(irev) + d(irev)=t +2 mmax=imax/2 +3 if(irev.le.mmax) go to 5 + irev=irev-mmax + mmax=mmax/2 + if(mmax.ge.1) go to 3 +5 irev=irev+mmax + +C The radix-2 transform begins here. + + api=isign*pi/2. + mmax=1 +6 istep=2*mmax + wstep=cmplx(-2.*sin(api/mmax)**2,sin(2.*api/mmax)) + w=1. + do 9 m=1,mmax + +C This in the inner-most loop -- optimization here is important! + do 8 i=m,imax,istep + t=w*d(i+mmax) + d(i+mmax)=d(i)-t +8 d(i)=d(i)+t + +9 w=w*(1.+wstep) + mmax=istep + if(mmax.lt.imax) go to 6 + + if(ireal.eq.0) return + +C Now complete the last stage of a doubled-up real transform. + + jmax=imax/2 + 1 + wstep=cmplx(-2.*sin(isign*pi/npts)**2,sin(isign*pi/imax)) + w=1.0 + d(imax+1)=d(1) + + do 10 j=1,jmax + uu=cmplx(real(d(j))+real(d(2+imax-j)),aimag(d(j)) - + + aimag(d(2+imax-j))) + tt=w*cmplx(aimag(d(j))+aimag(d(2+imax-j)),-real(d(j)) + + + real(d(2+imax-j))) + d(j)=uu+tt + d(2+imax-j)=conjg(uu-tt) +10 w=w*(1.+wstep) + + return + end diff --git a/q65w/ft2000_freq.sh b/q65w/ft2000_freq.sh new file mode 100644 index 000000000..8bf9d07e9 --- /dev/null +++ b/q65w/ft2000_freq.sh @@ -0,0 +1 @@ +rigctl-wsjtx -m 129 -r COM1 -s 38400 -C data_bits=8 -C stop_bits=2 -C serial_handshake=Hardware f diff --git a/q65w/getdev.cpp b/q65w/getdev.cpp new file mode 100644 index 000000000..45addfa01 --- /dev/null +++ b/q65w/getdev.cpp @@ -0,0 +1,259 @@ +#include +#define MAXDEVICES 100 +#include +#include +#include + +//------------------------------------------------------- pa_get_device_info +int pa_get_device_info (int n, + void *pa_device_name, + void *pa_device_hostapi, + double *pa_device_max_speed, + double *pa_device_min_speed, + int *pa_device_max_bytes, + int *pa_device_min_bytes, + int *pa_device_max_channels, + int *pa_device_min_channels ) +{ + + (void) n ; + (void) pa_device_name; + (void) pa_device_hostapi; + (void) pa_device_max_speed; + (void) pa_device_min_speed; + (void) pa_device_max_bytes; + (void) pa_device_min_bytes; + (void) pa_device_max_channels; + (void) pa_device_min_channels; + const PaDeviceInfo *deviceInfo; + PaError pa_err; + PaStreamParameters inputParameters; + int i,j, speed_warning; + int minBytes, maxBytes; + double maxStandardSampleRate; + double minStandardSampleRate; + int minInputChannels; + int maxInputChannels; + +// negative terminated list + static double standardSampleRates[] = {8000.0, 9600.0, + 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, + 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; +// ******************************************************* + + + *pa_device_max_speed=0; + *pa_device_min_speed=0; + *pa_device_max_bytes=0; + *pa_device_min_bytes=0; + *pa_device_max_channels=0; + *pa_device_min_channels=0; + minInputChannels=0; + if(n >= Pa_GetDeviceCount() ) return -1; + deviceInfo = Pa_GetDeviceInfo(n); + if (deviceInfo->maxInputChannels==0) return -1; + sprintf((char*)(pa_device_name),"%s",deviceInfo->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo( deviceInfo->hostApi )->name); + speed_warning=0; + +// bypass bug in Juli@ ASIO driver: +// this driver hangs after a Pa_IsFormatSupported call + i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); + if (i == 0) { + minStandardSampleRate=44100; + maxStandardSampleRate=192000; + minBytes=1; + maxBytes=4; + maxInputChannels= deviceInfo->maxInputChannels; + minInputChannels= 1; + goto end_pa_get_device_info; + } + +// Investigate device capabilities. +// Check min and max samplerates with 16 bit data. + maxStandardSampleRate=0; + minStandardSampleRate=0; + inputParameters.device = n; + inputParameters.channelCount = deviceInfo->maxInputChannels; + inputParameters.sampleFormat = paInt16; + inputParameters.suggestedLatency = 0; + inputParameters.hostApiSpecificStreamInfo = NULL; + +// ************************************************************************ +//filter for portaudio Windows hostapi's with non experts. +//only allow ASIO or WASAPI or WDM-KS + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WASAPI", 14); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WDM-KS", 14); + if (i==0 ) goto end_filter_hostapi; + speed_warning=1; +end_filter_hostapi:; + +// ************************************************************************ + i=0; + while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if(pa_err == paFormatIsSupported ) { + minStandardSampleRate=standardSampleRates[i]; + } + i++; + } + if(minStandardSampleRate == 0) return -1; + j=i; + while(standardSampleRates[i] > 0 ) i++; + i--; + + while(i >= j && maxStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if( pa_err == paFormatIsSupported ) { + maxStandardSampleRate=standardSampleRates[i]; + } + i--; + } + +// check if min SampleRate = max SampleRate + if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { + maxStandardSampleRate= minStandardSampleRate; + } + +// check min and max bytes + minBytes=2; + maxBytes=2; + inputParameters.sampleFormat = paUInt8; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + minBytes=1; + } + inputParameters.sampleFormat = paInt32; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + maxBytes=4; + } + +// check min channel count + maxInputChannels= deviceInfo->maxInputChannels; + inputParameters.channelCount = 1; + inputParameters.sampleFormat = paInt16; + pa_err=paFormatIsSupported+32000; + while(pa_err != paFormatIsSupported && + ( inputParameters.channelCount < (maxInputChannels+1)) ) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + inputParameters.channelCount++; + } + if( pa_err == paFormatIsSupported ) { + minInputChannels=inputParameters.channelCount-1; + } else { + return -1; + } + +end_pa_get_device_info:; + + *pa_device_max_speed=maxStandardSampleRate; + *pa_device_min_speed=minStandardSampleRate; + *pa_device_max_bytes=maxBytes; + *pa_device_min_bytes=minBytes; + *pa_device_max_channels= maxInputChannels; + *pa_device_min_channels= minInputChannels; + + return speed_warning; +} + + +void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, + int* maxChan, int* minSpeed, int* maxSpeed) +{ + int i; + char pa_device_name[128]; + char pa_device_hostapi[128]; + double pa_device_max_speed; + double pa_device_min_speed; + int pa_device_max_bytes; + int pa_device_min_bytes; + int pa_device_max_channels; + int pa_device_min_channels; + char p2[256]; + char *p,*p1; + static int iret, valid_dev_cnt; + + iret=pa_get_device_info (id, + &pa_device_name, + &pa_device_hostapi, + &pa_device_max_speed, + &pa_device_min_speed, + &pa_device_max_bytes, + &pa_device_min_bytes, + &pa_device_max_channels, + &pa_device_min_channels); + + if (iret >= 0 ) { + valid_dev_cnt++; + + p1=(char*)""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1=(char*)"MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1=(char*)"DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1=(char*)"WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1=(char*)"ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1=(char*)"WDM-KS"; + + sprintf(p2,"%-8s %-39s",p1,pa_device_name); + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=p2[i]; + if(p2[i]==0) break; + } + *minChan=pa_device_min_channels; + *maxChan=pa_device_max_channels; + *minSpeed=(int)pa_device_min_speed; + *maxSpeed=(int)pa_device_max_speed; + } else { + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=0; + } + *minChan=0; + *maxChan=0; + *minSpeed=0; + *maxSpeed=0; + } +} + +void getDev(int* numDevices0, char hostAPI_DeviceName[][50], + int minChan[], int maxChan[], + int minSpeed[], int maxSpeed[]) +{ + int i,id,numDevices; + int minch,maxch,minsp,maxsp; + char apidev[256]; + + numDevices=Pa_GetDeviceCount(); + *numDevices0=numDevices; + + for(id=0; id +#include +#include +#include + +extern qint16 id[4*60*96000]; + +void getfile(QString fname, bool xpol, int dbDgrd) +{ + int npts=2*56*96000; + if(xpol) npts=2*npts; + +// Degrade S/N by dbDgrd dB -- for tests only!! + float dgrd=0.0; + if(dbDgrd<0) dgrd = 23.0*sqrt(pow(10.0,-0.1*(double)dbDgrd) - 1.0); + float fac=23.0/sqrt(dgrd*dgrd + 23.0*23.0); + + memset(id,0,2*npts); + char name[80]; + strcpy(name,fname.toLocal8Bit()); + FILE* fp=fopen(name,"rb"); + + if(fp != NULL) { + auto n = fread(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); + n = fread(id,2,npts,fp); + Q_UNUSED (n); + int j=0; + + if(dbDgrd<0) { + for(int i=0; i0) { + datcom_.nutc=100*fname.mid(i0-4,2).toInt() + fname.mid(i0-2,2).toInt(); + } + } +} + +void savetf2(QString fname, bool xpol) +{ + int npts=2*56*96000; + if(xpol) npts=2*npts; + + qint16* buf=(qint16*)malloc(2*npts); + char name[80]; + strcpy(name,fname.toLocal8Bit()); + FILE* fp=fopen(name,"wb"); + + if(fp != NULL) { + fwrite(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); + int j=0; + for(int i=0; i= 1.0 || rsq == 0.0); + fac = sqrt(-2.0*log(rsq)/rsq); + gset = v1*fac; + iset++; + return v2*fac; +} diff --git a/q65w/getfile.h b/q65w/getfile.h new file mode 100644 index 000000000..796c31e5c --- /dev/null +++ b/q65w/getfile.h @@ -0,0 +1,12 @@ +#ifndef GETFILE_H +#define GETFILE_H +#include +#include +#include +#include "commons.h" + +void getfile(QString fname, bool xpol, int dbDgrd); +void savetf2(QString fname, bool xpol); +float gran(); + +#endif // GETFILE_H diff --git a/q65w/getsvn.cmake b/q65w/getsvn.cmake new file mode 100644 index 000000000..d1007b2c4 --- /dev/null +++ b/q65w/getsvn.cmake @@ -0,0 +1,16 @@ +find_package (Subversion) +if (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + # the FindSubversion.cmake module is part of the standard distribution + include (FindSubversion) + # extract working copy information for SOURCE_DIR into MY_XXX variables + Subversion_WC_INFO (${SOURCE_DIR} MY) + # write a file with the SVNVERSION define + file (WRITE svnversion.h.txt "#define SVNVERSION ${MY_WC_REVISION}\n") +else (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + file (WRITE svnversion.h.txt "#define SVNVERSION local\n") +endif (Subversion_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.svn) + +# copy the file to the final header only if the version changes +# reduces needless rebuilds +execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different + svnversion.h.txt svnversion.h) diff --git a/q65w/in.dat b/q65w/in.dat new file mode 100644 index 000000000..5294129cb --- /dev/null +++ b/q65w/in.dat @@ -0,0 +1,16 @@ + 35 36 22 8 31 11 14 55 20 36 55 13 24 15 56 38 16 28 61 58 + 15 26 45 8 41 53 37 57 59 60 29 29 41 46 44 35 52 61 24 26 + 16 20 53 35 2 6 9 27 47 28 57 6 15 9 16 10 56 9 63 46 + 9 15 3 + 74 61 44 233 29 245 254 64 119 64 250 111 38 145 53 29 140 194 119 99 + 55 86 48 110 142 95 48 120 61 66 252 252 245 88 62 41 124 249 246 68 + 250 249 65 64 140 142 88 190 237 90 240 52 79 216 55 31 112 135 66 44 + 99 57 68 + 54 61 26 5 13 60 3 56 30 58 57 4 16 43 28 43 6 61 13 19 + 56 8 4 9 45 32 9 7 14 52 4 38 40 27 3 26 51 54 40 29 + 36 63 34 43 3 48 36 49 46 30 8 20 40 59 29 28 17 11 8 19 + 11 63 5 + 38 25 35 8 28 0 0 60 60 25 0 31 28 52 14 24 9 30 18 54 + 49 55 48 15 27 54 26 22 30 27 1 1 4 31 35 29 23 2 2 27 + 0 1 25 32 21 84 28 19 5 60 2 27 15 9 39 23 42 12 29 17 + 16 50 49 diff --git a/q65w/killbyname.cpp b/q65w/killbyname.cpp new file mode 100644 index 000000000..11629e657 --- /dev/null +++ b/q65w/killbyname.cpp @@ -0,0 +1,282 @@ +#include +#include +#include + +int killbyname(const char *szToTerminate) +// Created: 6/23/2000 (Ravi Kochhar) +// Last modified: 3/10/2002 (RK) +// Please report any problems or bugs to kochhar@physiology.wisc.edu +// The latest version of this routine can be found at: +// http://www.neurophys.wisc.edu/ravi/software/killproc/ +// Terminate the process "szToTerminate" if it is currently running +// This works for Win/95/98/ME and also Win/NT/2000/XP +// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE" +// will both work (for szToTerminate) +// Return codes are as follows: +// 0 = Process was successfully terminated +// 602 = Unable to terminate process for some other reason +// 603 = Process was not currently running +// 604 = No permission to terminate process +// 605 = Unable to load PSAPI.DLL +// 606 = Unable to identify system type +// 607 = Unsupported OS +// 632 = Invalid process name +// 700 = Unable to get procedure address from PSAPI.DLL +// 701 = Unable to get process list, EnumProcesses failed +// 702 = Unable to load KERNEL32.DLL +// 703 = Unable to get procedure address from KERNEL32.DLL +// 704 = CreateToolhelp32Snapshot failed + +{ + BOOL bResult,bResultm; + DWORD aiPID[1000],iCb=1000,iNumProc; //,iV2000=0; + DWORD iCbneeded,i,iFound=0; + char szName[MAX_PATH],szToTermUpper[MAX_PATH]; + HANDLE hProc,hSnapShot,hSnapShotm; + OSVERSIONINFO osvi; + HINSTANCE hInstLib; + int iLenP,indx; + HMODULE hMod; + PROCESSENTRY32 procentry; + MODULEENTRY32 modentry; + + // Transfer Process name into "szToTermUpper" and convert to upper case + iLenP=strlen(szToTerminate); + if(iLenP<1 || iLenP>MAX_PATH) return 632; + for(indx=0;indx +#include +#include +#include +#include +#include +// #include +// #include +// #include +#include "sleep.h" +#include "timeval.h" + +/* FORTRAN: fd = close(filedes) */ +int close_(int *filedes) +{ +return(close(*filedes)); +} +/* FORTRAN: fd = open(filnam,mode) */ +int open_(char filnam[], int *mode) +{ + return(open(filnam,*mode)); +} +/* FORTRAN: fd = creat(filnam,mode) */ +int creat_(char filnam[],int *mode) +{ + return(creat(filnam,*mode)); +} +/* FORTRAN: nread = read(fd,buf,n) */ +int read_(int *fd, char buf[], int *n) +{ + return(read(*fd,buf,*n)); +} +/* FORTRAN: nwrt = write(fd,buf,n) */ +int write_(int *fd, char buf[], int *n) +{ + return(write(*fd,buf,*n)); +} +/* FORTRAN: ns = lseek(fd,offset,origin) */ +int lseek_(int *fd,int *offset, int *origin) +{ + return(lseek(*fd,*offset,*origin)); +} +/* times(2) */ +//int times_(struct tms *buf) +//{ +// return (times(buf)); +//} +/* ioperm(2) */ +//ioperm_(from,num,turn_on) +//unsigned long *from,*num,*turn_on; +//{ +// return (ioperm(*from,*num,*turn_on)); +// return (i386_get_ioperm(*from,*num,*turn_on)); +//} + +/* usleep(3) */ +void usleep_(unsigned long *microsec) +{ + usleep(*microsec); +} + +/* returns random numbers between 0 and 32767 to FORTRAN program */ +int iran_(int *arg) +{ + return (rand()); +} + +int exit_(int *n) +{ + printf("\n\n"); + exit(*n); +} + +/* +struct tm * +gmtime_r_(const time_t *clock, struct tm *result) +{ + gmtime_r(clock, result); +} +*/ + +time_t time_(void) +{ + return time(0); +} + +/* hrtime() */ +double hrtime_(void) +{ + struct timeval tv; + gettimeofday(&tv,NULL); + return(tv.tv_sec+1.e-6*tv.tv_usec); +} diff --git a/q65w/libm65/dcoord.f90 b/q65w/libm65/dcoord.f90 new file mode 100644 index 000000000..5ef6877aa --- /dev/null +++ b/q65w/libm65/dcoord.f90 @@ -0,0 +1,40 @@ +SUBROUTINE DCOORD(A0,B0,AP,BP,A1,B1,A2,B2) + + implicit real*8 (a-h,o-z) +! Examples: +! 1. From ha,dec to az,el: +! call coord(pi,pio2-lat,0.,lat,ha,dec,az,el) +! 2. From az,el to ha,dec: +! call coord(pi,pio2-lat,0.,lat,az,el,ha,dec) +! 3. From ra,dec to l,b +! call coord(4.635594495,-0.504691042,3.355395488,0.478220215, +! ra,dec,l,b) +! 4. From l,b to ra,dec +! call coord(1.705981071d0,-1.050357016d0,2.146800277d0, +! 0.478220215d0,l,b,ra,dec) +! 5. From ecliptic latitude (eb) and longitude (el) to ra, dec: +! call coord(0.d0,0.d0,-pio2,pio2-23.443*pi/180,ra,dec,el,eb) + + SB0=sin(B0) + CB0=cos(B0) + SBP=sin(BP) + CBP=cos(BP) + SB1=sin(B1) + CB1=cos(B1) + SB2=SBP*SB1 + CBP*CB1*cos(AP-A1) + CB2=SQRT(1.D0-SB2**2) + B2=atan(SB2/CB2) + SAA=sin(AP-A1)*CB1/CB2 + CAA=(SB1-SB2*SBP)/(CB2*CBP) + CBB=SB0/CBP + SBB=sin(AP-A0)*CB0 + SA2=SAA*CBB-CAA*SBB + CA2=CAA*CBB+SAA*SBB + TA2O2=0.0 !Shut up compiler warnings. -db + IF(CA2.LE.0.D0) TA2O2=(1.D0-CA2)/SA2 + IF(CA2.GT.0.D0) TA2O2=SA2/(1.D0+CA2) + A2=2.D0*atan(TA2O2) + IF(A2.LT.0.D0) A2=A2+6.2831853071795864D0 + + RETURN +END SUBROUTINE DCOORD diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 new file mode 100644 index 000000000..438079f1d --- /dev/null +++ b/q65w/libm65/decode0.f90 @@ -0,0 +1,71 @@ +subroutine decode0(dd,ss,savg,nstandalone) + + use timer_module, only: timer + parameter (NSMAX=60*96000) + + real*4 dd(4,NSMAX),ss(4,322,NFFT),savg(4,NFFT) + real*8 fcenter + integer hist(0:32768) + logical ldecoded + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 + character mycall0*12,hiscall0*12,hisgrid0*6 + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime + common/early/nhsym1,nhsym2,ldecoded(32768) + common/decodes/ndecodes + data neme0/-99/,mcall3b/1/ + save + + call sec0(0,tquick) + call timer('decode0 ',0) + if(newdat.ne.0) then + nz=96000*nhsym/5.3833 + hist=0 + do i=1,nz + j1=min(abs(dd(1,i)),32768.0) + hist(j1)=hist(j1)+1 + j2=min(abs(dd(2,i)),32768.0) + hist(j2)=hist(j2)+1 + j3=min(abs(dd(3,i)),32768.0) + hist(j3)=hist(j3)+1 + j4=min(abs(dd(4,i)),32768.0) + hist(j4)=hist(j4)+1 + enddo + m=0 + do i=0,32768 + m=m+hist(i) + if(m.ge.2*nz) go to 10 + enddo +10 rmsdd=1.5*i + endif + ndphi=0 + if(iand(nrxlog,8).ne.0) ndphi=1 + + if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0 .or. & + hisgrid.ne.hisgrid0 .or. mcall3.ne.0 .or. neme.ne.neme0) mcall3b=1 + + mycall0=mycall + hiscall0=hiscall + hisgrid0=hisgrid + neme0=neme + + call timer('map65a ',0) + call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & + neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & + ndiskdat,nxpol,nmode,ndop00) + call timer('map65a ',1) + call timer('decode0 ',1) + + call sec0(1,tdec) + if(nhsym.eq.nhsym1) write(*,1010) nsum,nsave,nstandalone,nhsym,tdec +1010 format('',3i4,i6,f6.2) + if(nhsym.eq.nhsym2) write(*,1012) nsum,nsave,nstandalone,nhsym,tdec,ndecodes +1012 format('',3i4,i6,f6.2,i5) + flush(6) + + return +end subroutine decode0 diff --git a/q65w/libm65/decode1a.f90 b/q65w/libm65/decode1a.f90 new file mode 100644 index 000000000..4219c0043 --- /dev/null +++ b/q65w/libm65/decode1a.f90 @@ -0,0 +1,145 @@ +subroutine decode1a(dd,newdat,f0,nflip,mode65,nfsample,xpol, & + mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi, & + nutc,nkhz,ndf,ipol,ntol,sync2,a,dt,pol,nkv,nhist,nsum,nsave, & + qual,decoded) + +! Apply AFC corrections to a candidate JT65 signal, then decode it. + + use timer_module, only: timer + parameter (NMAX=60*96000) !Samples per 60 s + real*4 dd(4,NMAX) !92 MB: raw data from Linrad timf2 + complex cx(NMAX/64), cy(NMAX/64) !Data at 1378.125 samples/s + complex c5x(NMAX/256),c5y(NMAX/256) !Data at 344.53125 Hz + complex c5a(512) + complex z + real s2(66,126) + real s3(64,63),sy(63) + real a(5) + logical first,xpol + character decoded*22 + character mycall*12,hiscall*12,hisgrid*6 + data first/.true./,jjjmin/1000/,jjjmax/-1000/ + data nutc0/-999/,nhz0/-9999999/ + save + +! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz + dt00=dt + call timer('filbig ',0) + call filbig(dd,NMAX,f0,newdat,nfsample,xpol,cx,cy,n5) +! NB: cx, cy have sample rate 96000*77125/5376000 = 1378.125 Hz + call timer('filbig ',1) + if(mode65.eq.0) goto 900 + sqa=0. + sqb=0. + do i=1,n5 + sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2 + if(xpol) sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2 + enddo + sqa=sqa/n5 + sqb=sqb/n5 + +! Find best DF, f1, f2, DT, and pol. Start by downsampling to 344.53125 Hz + if(xpol) then + z=cmplx(cos(dphi),sin(dphi)) + cy(:n5)=z*cy(:n5) !Adjust for cable length difference + endif +! Add some zeros at start of c5 arrays -- empirical fix for negative DT's + nadd=1089 + c5x(:nadd)=0. + call fil6521(cx,n5,c5x(nadd+1),n6) + if(xpol) then + c5y(:nadd)=0. + call fil6521(cy,n5,c5y(nadd+1),n6) + endif + n6=n6+nadd + + fsample=1378.125/4. + a(5)=dt00 + i0=nint((a(5)+0.5)*fsample) - 2 + nadd + if(i0.lt.1) then + write(13,*) 'i0 too small in decode1a:',i0,f0 + flush(13) + i0=1 + endif + nz=n6+1-i0 + +! We're looking only at sync tone here... so why not downsample by another +! factor of 1/8, say? Should be a significant execution speed-up. +! Best fit for DF, f1, f2, pol + call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,xpol,ndphi,a,ccfbest,dtbest) + + pol=a(4)/57.2957795 + aa=cos(pol) + bb=sin(pol) + sq0=aa*aa*sqa + bb*bb*sqb + sync2=3.7*ccfbest/sq0 + +! Apply AFC corrections to the time-domain signal +! Now we are back to using the 1378.125 Hz sample rate, enough to +! accommodate the full JT65C bandwidth. + + call twkfreq_xy(cx,cy,n5,a) + +! Compute spectrum at best polarization for each half symbol. +! Adding or subtracting a small number (e.g., 5) to j may make it decode.\ +! NB: might want to try computing full-symbol spectra (nfft=512, even for +! submodes B and C). + + nsym=126 + nfft=512 + j=(dt00+dtbest+2.685)*1378.125 + if(j.lt.0) j=0 + + +! Perhaps should try full-symbol-length FFTs even in B, C sub-modes? +! (Tried this, found no significant difference in decodes.) + + do k=1,nsym +! do n=1,mode65 + do n=1,1 + do i=1,nfft + j=min(j+1,NMAX/64) + c5a(i)=aa*cx(j) + bb*cy(j) + enddo + call four2a(c5a,nfft,1,1,1) + if(n.eq.1) then + do i=1,66 +! s2(i,k)=real(c5a(i))**2 + aimag(c5a(i))**2 + jj=i + if(mode65.eq.2) jj=2*i-1 + if(mode65.eq.4) jj=4*i-3 + s2(i,k)=real(c5a(jj))**2 + aimag(c5a(jj))**2 + enddo + else + do i=1,66 + s2(i,k)=s2(i,k) + real(c5a(i))**2 + aimag(c5a(i))**2 + enddo + endif + enddo + enddo + + flip=nflip + call timer('dec65b ',0) + call decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & + nqd,nkv,nhist,qual,decoded,s3,sy) + dt=dt00 + dtbest + 1.7 + call timer('dec65b ',1) + + if(nqd.eq.1 .and. decoded.eq.' ') then + nhz=1000*nkhz + ndf + ihzdiff=min(500,ntol) + if(nutc.ne.nutc0 .or. abs(nhz-nhz0).ge.ihzdiff) syncbest=0. + if(sync2.gt.0.99999*syncbest) then + nsave=nsave+1 + nsave=mod(nsave-1,64)+1 + npol=nint(57.296*pol) + + call s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) + syncbest=sync2 + nhz0=nhz + endif + nutc0=nutc + endif + +900 return +end subroutine decode1a diff --git a/q65w/libm65/decode65b.f90 b/q65w/libm65/decode65b.f90 new file mode 100644 index 000000000..9b3ebccda --- /dev/null +++ b/q65w/libm65/decode65b.f90 @@ -0,0 +1,48 @@ +subroutine decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & + nqd,nkv,nhist,qual,decoded,s3,sy) + + real s2(66,126) + real s3(64,63),sy(63) + logical first,ltext + character decoded*22,deepmsg*22 + character mycall*12,hiscall*12,hisgrid*6 + common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) + data first/.true./ + save + + if(first) call setup65 + first=.false. + + do j=1,63 + k=mdat(j) !Points to data symbol + if(flip.lt.0.0) k=mdat2(j) + do i=1,64 + s3(i,j)=s2(i+2,k) + enddo + k=mdat2(j) !Points to data symbol + if(flip.lt.0.0) k=mdat(j) + sy(j)=s2(1,k) + enddo + + nadd=mode65 + call extract(s3,nadd,ncount,nhist,decoded,ltext) !Extract the message +! Suppress "birdie messages" and other garbage decodes: + if(decoded(1:7).eq.'000AAA ') ncount=-1 + if(decoded(1:7).eq.'0L6MWK ') ncount=-1 + if(flip.lt.0.0 .and. ltext) ncount=-1 + nkv=1 + if(ncount.lt.0) then + nkv=0 + decoded=' ' + endif + + qual=0. + if(ndepth.ge.1 .and. (nqd.eq.1 .or. flip.eq.1.0)) then + call deep65(s3,mode65,neme,flip,mycall,hiscall,hisgrid,deepmsg,qual) + if(nqd.ne.1 .and. qual.lt.10.0) qual=0.0 + if(ndepth.lt.2 .and. qual.lt.6.0) qual=0.0 + endif + if(nkv.eq.0 .and. qual.ge.1.0) decoded=deepmsg + + return +end subroutine decode65b diff --git a/q65w/libm65/decode_rs.c b/q65w/libm65/decode_rs.c new file mode 100644 index 000000000..91f582ac1 --- /dev/null +++ b/q65w/libm65/decode_rs.c @@ -0,0 +1,268 @@ +/* Reed-Solomon decoder + * Copyright 2002 Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + * Modified by Steve Franke, K9AN, for use in a soft-symbol RS decoder + */ + +#ifdef DEBUG +#include +#endif + +#include + +#define NULL ((void *)0) +#define min(a,b) ((a) < (b) ? (a) : (b)) + +#ifdef FIXED +#include "fixed.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +int DECODE_RS( +#ifndef FIXED + void *p, +#endif + DTYPE *data, int *eras_pos, int no_eras, int calc_syn){ + +#ifndef FIXED + struct rs *rs = (struct rs *)p; +#endif + int deg_lambda, el, deg_omega; + int i, j, r,k; + DTYPE u,q,tmp,num1,num2,den,discr_r; + DTYPE lambda[NROOTS+1]; // Err+Eras Locator poly + static DTYPE s[51]; // and syndrome poly + DTYPE b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1]; + DTYPE root[NROOTS], reg[NROOTS+1], loc[NROOTS]; + int syn_error, count; + + if( calc_syn ) { + /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ + for(i=0;i 0) { + /* Init lambda to be the erasure locator polynomial */ + lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))]; + for (i = 1; i < no_eras; i++) { + u = MODNN(PRIM*(NN-1-eras_pos[i])); + for (j = i+1; j > 0; j--) { + tmp = INDEX_OF[lambda[j - 1]]; + if(tmp != A0) + lambda[j] ^= ALPHA_TO[MODNN(u + tmp)]; + } + } + +#if DEBUG >= 1 + /* Test code that verifies the erasure locator polynomial just constructed + Needed only for decoder debugging. */ + + /* find roots of the erasure location polynomial */ + for(i=1;i<=no_eras;i++) + reg[i] = INDEX_OF[lambda[i]]; + + count = 0; + for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { + q = 1; + for (j = 1; j <= no_eras; j++) + if (reg[j] != A0) { + reg[j] = MODNN(reg[j] + j); + q ^= ALPHA_TO[reg[j]]; + } + if (q != 0) + continue; + /* store root and error location number indices */ + root[count] = i; + loc[count] = k; + count++; + } + if (count != no_eras) { + printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); + count = -1; + goto finish; + } +#if DEBUG >= 2 + printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); + for (i = 0; i < count; i++) + printf("%d ", loc[i]); + printf("\n"); +#endif +#endif + } + for(i=0;i 0; j--){ + if (reg[j] != A0) { + reg[j] = MODNN(reg[j] + j); + q ^= ALPHA_TO[reg[j]]; + } + } + if (q != 0) + continue; /* Not a root */ + /* store root (index-form) and error location number */ +#if DEBUG>=2 + printf("count %d root %d loc %d\n",count,i,k); +#endif + root[count] = i; + loc[count] = k; + /* If we've already found max possible roots, + * abort the search to save time + */ + if(++count == deg_lambda) + break; + } + if (deg_lambda != count) { + /* + * deg(lambda) unequal to number of roots => uncorrectable + * error detected + */ + count = -1; + goto finish; + } + /* + * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo + * x**NROOTS). in index form. Also find deg(omega). + */ + deg_omega = 0; + for (i = 0; i < NROOTS;i++){ + tmp = 0; + j = (deg_lambda < i) ? deg_lambda : i; + for(;j >= 0; j--){ + if ((s[i - j] != A0) && (lambda[j] != A0)) + tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])]; + } + if(tmp != 0) + deg_omega = i; + omega[i] = INDEX_OF[tmp]; + } + omega[NROOTS] = A0; + + /* + * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = + * inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form + */ + for (j = count-1; j >=0; j--) { + num1 = 0; + for (i = deg_omega; i >= 0; i--) { + if (omega[i] != A0) + num1 ^= ALPHA_TO[MODNN(omega[i] + i * root[j])]; + } + num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)]; + den = 0; + + /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ + for (i = min(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) { + if(lambda[i+1] != A0) + den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])]; + } + if (den == 0) { +#if DEBUG >= 1 + printf("\n ERROR: denominator = 0\n"); +#endif + count = -1; + goto finish; + } + /* Apply error to data */ + if (num1 != 0) { + data[loc[j]] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])]; + } + } +finish: + if(eras_pos != NULL){ + for(i=0;i0 means compound mycall + j4=index(callsign,'/') ! j4>0 means compound hiscall + callgrid(icall)=callsign(1:j2) + + mz=1 +! Allow MyCall + HisCall + rpt (?) + if(n.eq.1 .and. j3.lt.1 .and. j4.lt.1 .and. callsign(1:6).ne.' ') & + mz=MAXRPT+1 + do m=1,mz + if(m.gt.1) grid=rpt(m-1) + if(j3.lt.1 .and.j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid + message=mycall(1:j1)//' '//callgrid(icall) + k=k+1 + testmsg(k)=message + call encode65(message,ncode(1,k)) + +! Insert CQ message + if(j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid + message='CQ '//callgrid(icall) + k=k+1 + testmsg(k)=message + call encode65(message,ncode(1,k)) + enddo +10 continue + enddo + +20 continue + ntot=k + call timer('deep65a ',1) + +30 continue + call timer('deep65b ',0) + ref0=0. + do j=1,63 + ref0=ref0 + s3(mrs(j),j) + enddo + + p1=-1.e30 + do k=1,ntot + pp(k)=0. + if(k.ge.2 .and. k.le.64 .and. flip.lt.0.0) cycle +! Test all messages if flip=+1; skip the CQ messages if flip=-1. + if(flip.gt.0.0 .or. testmsg(k)(1:3).ne.'CQ ') then + sum=0. + ref=ref0 + do j=1,63 + i=ncode(j,k)+1 + sum=sum + s3(i,j) + if(i.eq.mrs(j)) ref=ref - s3(i,j) + s3(mrs2(j),j) + enddo + p=sum/ref + pp(k)=p + if(p.gt.p1) then + p1=p + ip1=k + bestmsg=testmsg(k) + endif + endif + enddo + + p2=-1.e30 + do i=1,ntot + if(pp(i).gt.p2 .and. testmsg(i).ne.bestmsg) p2=pp(i) + enddo + + if(mode65.eq.1) bias=max(1.12*p2,0.335) + if(mode65.eq.2) bias=max(1.08*p2,0.405) + if(mode65.ge.4) bias=max(1.04*p2,0.505) + + if(p2.eq.p1 .and. p1.ne.-1.e30) then + open(77,file='error.log',status='unknown',access='append') + write(77,*) p1,p2,ip1,bestmsg + close(77) + endif + + qual=100.0*(p1-bias) + + decoded=' ' + c=' ' + + if(qual.gt.1.0) then + if(qual.lt.6.0) c='?' + decoded=testmsg(ip1) + else + qual=0. + endif + decoded(22:22)=c + +! Make sure everything is upper case. + do i=1,22 + if(decoded(i:i).ge.'a' .and. decoded(i:i).le.'z') & + decoded(i:i)=char(ichar(decoded(i:i))-32) + enddo + call timer('deep65b ',1) + + return +end subroutine deep65 diff --git a/q65w/libm65/deg2grid.f90 b/q65w/libm65/deg2grid.f90 new file mode 100644 index 000000000..9ca3602f8 --- /dev/null +++ b/q65w/libm65/deg2grid.f90 @@ -0,0 +1,30 @@ +subroutine deg2grid(dlong0,dlat,grid) + + real dlong !West longitude (deg) + real dlat !Latitude (deg) + character grid*6 + + dlong=dlong0 + if(dlong.lt.-180.0) dlong=dlong+360.0 + if(dlong.gt.180.0) dlong=dlong-360.0 + +! Convert to units of 5 min of longitude, working east from 180 deg. + nlong=60.0*(180.0-dlong)/5.0 + n1=nlong/240 !20-degree field + n2=(nlong-240*n1)/24 !2 degree square + n3=nlong-240*n1-24*n2 !5 minute subsquare + grid(1:1)=char(ichar('A')+n1) + grid(3:3)=char(ichar('0')+n2) + grid(5:5)=char(ichar('a')+n3) + +! Convert to units of 2.5 min of latitude, working north from -90 deg. + nlat=60.0*(dlat+90)/2.5 + n1=nlat/240 !10-degree field + n2=(nlat-240*n1)/24 !1 degree square + n3=nlat-240*n1-24*n2 !2.5 minuts subsquare + grid(2:2)=char(ichar('A')+n1) + grid(4:4)=char(ichar('0')+n2) + grid(6:6)=char(ichar('a')+n3) + + return +end subroutine deg2grid diff --git a/q65w/libm65/demod64a.f90 b/q65w/libm65/demod64a.f90 new file mode 100644 index 000000000..3b8ee03ce --- /dev/null +++ b/q65w/libm65/demod64a.f90 @@ -0,0 +1,77 @@ +subroutine demod64a(s3,nadd,mrsym,mrprob,mr2sym,mr2prob,ntest,nlow) + +! Demodulate the 64-bin spectra for each of 63 symbols in a frame. + +! Parameters +! nadd number of spectra already summed +! mrsym most reliable symbol value +! mr2sym second most likely symbol value +! mrprob probability that mrsym was the transmitted value +! mr2prob probability that mr2sym was the transmitted value + + implicit real*8 (a-h,o-z) + real*4 s3(64,63) + real*8 fs(64) + integer mrsym(63),mrprob(63),mr2sym(63),mr2prob(63) + common/mrscom/ mrs(63),mrs2(63) + + afac=1.1 * float(nadd)**0.64 + scale=255.999 + +! Compute average spectral value + sum=0. + do j=1,63 + do i=1,64 + sum=sum+s3(i,j) + enddo + enddo + ave=sum/(64.*63.) + i1=1 !Silence warning + i2=1 + +! Compute probabilities for most reliable symbol values + do j=1,63 + s1=-1.e30 + fsum=0. + psum=0. + do i=1,64 + x=min(afac*s3(i,j)/ave,50.d0) + fs(i)=exp(x) + fsum=fsum+fs(i) + psum=psum + s3(i,j) + if(s3(i,j).gt.s1) then + s1=s3(i,j) + i1=i !Most reliable + endif + enddo + + s2=-1.e30 + do i=1,64 + if(i.ne.i1 .and. s3(i,j).gt.s2) then + s2=s3(i,j) + i2=i !Second most reliable + endif + enddo +! p1=fs(i1)/fsum !Normalized probabilities +! p2=fs(i2)/fsum + p1=s1/psum + p2=s2/psum + mrsym(j)=i1-1 + mr2sym(j)=i2-1 + mrprob(j)=scale*p1 + mr2prob(j)=scale*p2 + mrs(j)=i1 + mrs2(j)=i2 + enddo + + sum=0. + nlow=0 + do j=1,63 + sum=sum+mrprob(j) + if(mrprob(j).le.5) nlow=nlow+1 + enddo +! ntest=sum/63 + ntest=sum + + return +end subroutine demod64a diff --git a/q65w/libm65/display.f90 b/q65w/libm65/display.f90 new file mode 100644 index 000000000..1fef5c560 --- /dev/null +++ b/q65w/libm65/display.f90 @@ -0,0 +1,179 @@ +subroutine display(nkeep,ftol) + + parameter (MAXLINES=400,MX=400,MAXCALLS=500) + integer indx(MAXLINES),indx2(MX) + character*83 line(MAXLINES),line2(MX),line3(MAXLINES) + character out*52,out0*52,cfreq0*3,livecq*58 + character*6 callsign,callsign0 + character*12 freqcall(MAXCALLS) + real freqkHz(MAXLINES) + integer utc(MAXLINES),utc2(MX),utcz + real*8 f0 + save + + out0=' ' + rewind(26) + + do i=1,MAXLINES + read(26,1010,end=10) line(i) +1010 format(a77) + read(line(i),1020) f0,ndf,nh,nm +1020 format(f8.3,i5,25x,i3,i2) + utc(i)=60*nh + nm + freqkHz(i)=1000.d0*(f0-144.d0) + 0.001d0*ndf + enddo + +10 backspace(26) + nz=i-1 + utcz=utc(nz) + nz=nz-1 + if(nz.lt.1) go to 999 + nquad=max(nkeep/4,3) + do i=1,nz + nage=utcz-utc(i) + if(nage.lt.0) nage=nage+1440 + iage=nage/nquad + write(line(i)(73:74),1021) iage +1021 format(i2) + enddo + + nage=utcz-utc(1) + if(nage.lt.0) nage=nage+1440 + if(nage.gt.nkeep) then + do i=1,nz + nage=utcz-utc(i) + if(nage.lt.0) nage=nage+1440 + if(nage.le.nkeep) go to 20 + enddo +20 i0=i + nz=nz-i0+1 + rewind(26) + if(nz.lt.1) go to 999 + do i=1,nz + j=i+i0-1 + line(i)=line(j) + utc(i)=utc(j) + freqkHz(i)=freqkHz(j) + write(26,1022) line(i) +1022 format(a77) + enddo + endif + + call flush(26) + call indexx(freqkHz,nz,indx) + + nstart=1 + k3=0 + k=1 + m=indx(1) + if(m.lt.1 .or. m.gt.MAXLINES) then + print*,'Error in display.f90: ',nz,m + m=1 + endif + line2(1)=line(m) + utc2(1)=utc(m) + do i=2,nz + j0=indx(i-1) + j=indx(i) + if(freqkHz(j)-freqkHz(j0).gt.2.0*ftol) then + if(nstart.eq.0) then + k=k+1 + line2(k)="" + utc2(k)=-1 + endif + kz=k + if(nstart.eq.1) then + call indexx(float(utc2(1:kz)),kz,indx2) + k3=0 + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + nstart=0 + else + call indexx(float(utc2(1:kz)),kz,indx2) + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + endif + k=0 + endif + if(i.eq.nz) then + k=k+1 + line2(k)="" + utc2(k)=-1 + endif + k=k+1 + line2(k)=line(j) + utc2(k)=utc(j) + j0=j + enddo + kz=k + call indexx(float(utc2(1:kz)),kz,indx2) + do k=1,kz + k3=min(k3+1,400) + line3(k3)=line2(indx2(k)) + enddo + + rewind 19 + rewind 20 + cfreq0=' ' + nc=0 + callsign0=' ' + do k=1,k3 + out=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & + line3(k)(35:38)//line3(k)(46:74) + if(out(1:3).ne.' ') then + cfreq0=out(1:3) + livecq=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & + line3(k)(23:27)//line3(k)(35:38)//line3(k)(46:70)// & + line3(k)(73:77) + if(livecq(56:56).eq.':') livecq(56:58)=' '//livecq(56:57) + if(index(livecq,' CQ ').gt.0 .or. index(livecq,' QRZ ').gt.0 .or. & + index(livecq,' QRT ').gt.0 .or. index(livecq,' CQV ').gt.0 .or. & + index(livecq,' CQH ').gt.0) write(19,1029) livecq +1029 format(a58) + +! Suppress listing duplicate (same time, decoded message, and frequency) + if(out(14:17).ne.out0(14:17) .or. out(26:50).ne.out0(26:50) .or. & + out(1:3).ne.out0(1:3)) then + write(*,1030) out !Messages +1030 format('@',a52) + out0=out + endif + + i1=index(out(26:),' ') + callsign=out(i1+26:) + i2=index(callsign,' ') + if(i2.gt.1) callsign(i2:)=' ' + if(callsign.ne.' ' .and. callsign.ne.callsign0) then + len=i2-1 + if(len.lt.0) len=6 + if(len.ge.4) then !Omit short "callsigns" + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) + callsign0=callsign + endif + endif + if(callsign.ne.' ' .and. callsign.eq.callsign0) then + freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) + endif + endif + enddo + flush(19) + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=' ' + if(nc.lt.MAXCALLS) nc=nc+1 + freqcall(nc)=' ' + freqcall(nc+1)=' ' + freqcall(nc+2)=' ' + + do i=1,nc + write(*,1042) freqcall(i) !Band Map +1042 format('&',a12) + enddo + +999 continue + return +end subroutine display diff --git a/q65w/libm65/dot.f90 b/q65w/libm65/dot.f90 new file mode 100644 index 000000000..5829e8787 --- /dev/null +++ b/q65w/libm65/dot.f90 @@ -0,0 +1,11 @@ +real*8 function dot(x,y) + + real*8 x(3),y(3) + + dot=0.d0 + do i=1,3 + dot=dot+x(i)*y(i) + enddo + + return +end function dot diff --git a/q65w/libm65/dpol.f90 b/q65w/libm65/dpol.f90 new file mode 100644 index 000000000..3f8085c0a --- /dev/null +++ b/q65w/libm65/dpol.f90 @@ -0,0 +1,41 @@ +real function dpol(mygrid,hisgrid) + +! Compute spatial polartzation offset in degrees for the present +! time, between two specified grid locators. + + character*6 MyGrid,HisGrid + real lat,lon,LST + character cdate*8,ctime2*10,czone*5 + integer it(8) + data rad/57.2957795/ + + call date_and_time(cdate,ctime2,czone,it) + nyear=it(1) + month=it(2) + nday=it(3) + nh=it(5)-it(4)/60 + nm=it(6) + ns=it(7) + uth=nh + nm/60.0 + ns/3600.0 + + call grid2deg(MyGrid,lon,lat) + call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr,dist) + xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & + cos(AzMoon/rad)*sin(ElMoon/rad) + yy=cos(lat/rad)*sin(AzMoon/rad) + poloffset1=rad*atan2(yy,xx) + + call grid2deg(hisGrid,lon,lat) + call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr,dist) + xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & + cos(AzMoon/rad)*sin(ElMoon/rad) + yy=cos(lat/rad)*sin(AzMoon/rad) + poloffset2=rad*atan2(yy,xx) + + dpol=mod(poloffset2-poloffset1+720.0,180.0) + if(dpol.gt.90.0) dpol=dpol-180.0 + + return +end function dpol diff --git a/q65w/libm65/encode65.f90 b/q65w/libm65/encode65.f90 new file mode 100644 index 000000000..920d9c841 --- /dev/null +++ b/q65w/libm65/encode65.f90 @@ -0,0 +1,14 @@ +subroutine encode65(message,sent) + + use packjt + character message*22 + integer dgen(12) + integer sent(63) + + call packmsg(message,dgen,itype) + call rs_encode(dgen,sent) + call interleave63(sent,1) + call graycode(sent,63,1) + + return +end subroutine encode65 diff --git a/q65w/libm65/encode_rs.c b/q65w/libm65/encode_rs.c new file mode 100644 index 000000000..9d56d0bf1 --- /dev/null +++ b/q65w/libm65/encode_rs.c @@ -0,0 +1,47 @@ +/* Reed-Solomon encoder + * Copyright 2002, Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#include + +#ifdef FIXED +#include "fixed.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +void ENCODE_RS( +#ifndef FIXED +void *p, +#endif +DTYPE *data, DTYPE *bb){ +#ifndef FIXED + struct rs *rs = (struct rs *)p; +#endif + int i, j; + DTYPE feedback; + + memset(bb,0,NROOTS*sizeof(DTYPE)); + + for(i=0;i +#include +#include +#include +#include +#include "rs2.h" + +static void *rs; +void getpp_(int workdat[], float *pp); + +void ftrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[], + int* ntrials0, int correct[], int param[], int ntry[]) +{ + int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63]; + int workdat[63]; + int indexes[63]; + int era_pos[51]; + int i, j, numera, nerr, nn=63; + int ntrials = *ntrials0; + int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768; + int ntotal=0,ntotal_min=32768,ncandidates; + int nera_best=0; + float pp,pp1,pp2; + static unsigned int nseed; + +// Power-percentage symbol metrics - composite gnnf/hf + int perr[8][8] = { + { 4, 9, 11, 13, 14, 14, 15, 15}, + { 2, 20, 20, 30, 40, 50, 50, 50}, + { 7, 24, 27, 40, 50, 50, 50, 50}, + {13, 25, 35, 46, 52, 70, 50, 50}, + {17, 30, 42, 54, 55, 64, 71, 70}, + {25, 39, 48, 57, 64, 66, 77, 77}, + {32, 45, 54, 63, 66, 75, 78, 83}, + {51, 58, 57, 66, 72, 77, 82, 86}}; + + +// Initialize the KA9Q Reed-Solomon encoder/decoder + unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51; + rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0); + +// Reverse the received symbol vectors for BM decoder + for (i=0; i<63; i++) { + rxdat[i]=mrsym[62-i]; + rxprob[i]=mrprob[62-i]; + rxdat2[i]=mr2sym[62-i]; + rxprob2[i]=mr2prob[62-i]; + } + +// Sort rxprob to find indexes of the least reliable symbols + int k, pass, tmp, nsym=63; + int probs[63]; + for (i=0; i<63; i++) { + indexes[i]=i; + probs[i]=rxprob[i]; + } + for (pass = 1; pass <= nsym-1; pass++) { + for (k = 0; k < nsym - pass; k++) { + if( probs[k] < probs[k+1] ) { + tmp = probs[k]; + probs[k] = probs[k+1]; + probs[k+1] = tmp; + tmp = indexes[k]; + indexes[k] = indexes[k+1]; + indexes[k+1] = tmp; + } + } + } + +// See if we can decode using BM HDD, and calculate the syndrome vector. + memset(era_pos,0,51*sizeof(int)); + numera=0; + memcpy(workdat,rxdat,sizeof(rxdat)); + nerr=decode_rs_int(rs,workdat,era_pos,numera,1); + if( nerr >= 0 ) { + // Hard-decision decoding succeeded. Save codeword and some parameters. + nhard=0; + for (i=0; i<63; i++) { + if( workdat[i] != rxdat[i] ) nhard=nhard+1; + } + memcpy(correct,workdat,63*sizeof(int)); + param[0]=0; + param[1]=nhard; + param[2]=0; + param[3]=0; + param[4]=0; + param[5]=0; + param[7]=1000*1000; + ntry[0]=0; + return; + } + +/* +Hard-decision decoding failed. Try the FT soft-decision method. +Generate random erasure-locator vectors and see if any of them +decode. This will generate a list of "candidate" codewords. The +soft distance between each candidate codeword and the received +word is estimated by finding the largest (pp1) and second-largest +(pp2) outputs from a synchronized filter-bank operating on the +symbol spectra, and using these to decide which candidate +codeword is "best". +*/ + + nseed=1; //Seed for random numbers + float ratio; + int thresh, nsum; + int thresh0[63]; + ncandidates=0; + nsum=0; + int ii,jj; + for (i=0; i= 0 ) { + // We have a candidate codeword. Find its hard and soft distance from + // the received word. Also find pp1 and pp2 from the full array + // s3(64,63) of synchronized symbol spectra. + ncandidates=ncandidates+1; + nhard=0; + nsoft=0; + for (i=0; i<63; i++) { + if(workdat[i] != rxdat[i]) { + nhard=nhard+1; + if(workdat[i] != rxdat2[i]) { + nsoft=nsoft+rxprob[i]; + } + } + } + nsoft=63*nsoft/nsum; + ntotal=nsoft+nhard; + + getpp_(workdat,&pp); + if(pp>pp1) { + pp2=pp1; + pp1=pp; + nsoft_min=nsoft; + nhard_min=nhard; + ntotal_min=ntotal; + memcpy(correct,workdat,63*sizeof(int)); + nera_best=numera; + ntry[0]=k; + } else { + if(pp>pp2 && pp!=pp1) pp2=pp; + } + if(nhard_min <= 41 && ntotal_min <= 71) break; + } + if(k == ntrials) ntry[0]=k; + } + + param[0]=ncandidates; + param[1]=nhard_min; + param[2]=nsoft_min; + param[3]=nera_best; + param[4]= pp1 > 0 ? 1000.0*pp2/pp1 : 1000.0; + param[5]=ntotal_min; + param[6]=ntry[0]; + param[7]=1000.0*pp2; + param[8]=1000.0*pp1; + if(param[0]==0) param[2]=-1; + return; +} diff --git a/q65w/libm65/gen65.f90 b/q65w/libm65/gen65.f90 new file mode 100644 index 000000000..f09d0868a --- /dev/null +++ b/q65w/libm65/gen65.f90 @@ -0,0 +1,99 @@ +subroutine gen65(message,mode65,samfac,nsendingsh,msgsent,iwave,nwave) + +! Encodes a JT65 message into a wavefile. +! Executes in 17 ms on opti-745. + + use packjt + + parameter (NMAX=2*60*11025) !Max length of wave file + character*22 message !Message to be generated + character*22 msgsent !Message as it will be received + character*3 cok !' ' or 'OOO' + real*8 dt,phi,f,f0,dfgen,dphi,twopi,samfac + integer*2 iwave(NMAX) !Generated wave file + integer dgen(12) + integer sent(63) + logical first + integer nprc(126) + real pr(126) + data nprc/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + data twopi/6.283185307179586476d0/,first/.true./ + save + + if(first) then + do i=1,126 + pr(i)=2*nprc(i)-1 + enddo + first=.false. + endif + + call chkmsg(message,cok,nspecial,flip) + if(nspecial.eq.0) then + call packmsg(message,dgen,itype) !Pack message into 72 bits + nsendingsh=0 + if(iand(dgen(10),8).ne.0) nsendingsh=-1 !Plain text flag + + call rs_encode(dgen,sent) + call interleave63(sent,1) !Apply interleaving + call graycode(sent,63,1) !Apply Gray code + nsym=126 !Symbols per transmission + nsps=4096 + else + nsym=32 + nsps=16384 + nsendingsh=1 !Flag for shorthand message + endif + if(mode65.eq.0) go to 900 + +! Set up necessary constants + dt=1.d0/(samfac*11025.d0) + f0=118*11025.d0/1024 + dfgen=mode65*11025.d0/4096.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + k=0 + do j=1,nsym + if(message(1:5).ne.'@TUNE') then + f=f0 + if(nspecial.ne.0 .and. mod(j,2).eq.0) f=f0+10*nspecial*dfgen + if(nspecial.eq.0 .and. flip*pr(j).lt.0.0) then + k=k+1 + f=f0+(sent(k)+2)*dfgen + endif + dphi=twopi*dt*f + endif + do ii=1,nsps + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + i=i+1 + iwave(2*i-1)=32767.0*cos(xphi) + iwave(2*i)=32767.0*sin(xphi) + enddo + enddo + + iwave(2*nsym*nsps+1:)=0 + nwave=2*nsym*nsps + 5512 + call unpackmsg(dgen,msgsent) + if(flip.lt.0.0) then + do i=22,1,-1 + if(msgsent(i:i).ne.' ') goto 10 + enddo +10 msgsent=msgsent(1:i)//' OOO' + endif + + if(nsendingsh.eq.1) then + if(nspecial.eq.2) msgsent='RO' + if(nspecial.eq.3) msgsent='RRR' + if(nspecial.eq.4) msgsent='73' + endif + +900 return +end subroutine gen65 diff --git a/q65w/libm65/gen_q65_cwave.f90 b/q65w/libm65/gen_q65_cwave.f90 new file mode 100644 index 000000000..0e3d00074 --- /dev/null +++ b/q65w/libm65/gen_q65_cwave.f90 @@ -0,0 +1,52 @@ +subroutine gen_q65_cwave(msg,ntxfreq,ntone_spacing,msgsent,cwave,nwave) + +! Encodes a Q65 message to yield complex cwave() at fsample = 96000 Hz + + use packjt + use q65_encoding + parameter (NMAX=60*96000) + character*22 msg + character*22 msgsent !Message as it will be received + character*37 msg37 + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym + complex cwave(NMAX) + integer codeword(65),itone(85) + integer icos7(0:6) + data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array + data twopi/6.283185307179586476d0/ + save + + msgsent=msg + msg37='' + msg37(1:22)=msg + call get_q65_tones(msg37,codeword,itone) + +! Set up necessary constants + nsym=85 + tsym=7200.d0/12000.d0 + dt=1.d0/96000.d0 + f0=ntxfreq + dfgen=ntone_spacing*12000.d0/7200.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + nwave=85*7200*96000.d0/12000.d0 + t=0.d0 + j0=0 + do i=1,nwave + t=t+dt + j=t/tsym + 1 + if(j.gt.85) exit + if(j.ne.j0) then + f=f0 + itone(j)*dfgen + dphi=twopi*dt*f + j0=j + endif + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + cwave(i)=cmplx(cos(xphi),-sin(xphi)) + enddo + +999 return +end subroutine gen_q65_cwave diff --git a/q65w/libm65/gen_q65_wave.f90 b/q65w/libm65/gen_q65_wave.f90 new file mode 100644 index 000000000..bd91c8ddb --- /dev/null +++ b/q65w/libm65/gen_q65_wave.f90 @@ -0,0 +1,54 @@ +subroutine gen_q65_wave(msg,ntxfreq,mode65,msgsent,iwave,nwave) + +! Encodes a Q65 message to yield complex iwave() at fsample = 11025 Hz + + use packjt + use q65_encoding + parameter (NMAX=2*60*11025) + character*22 msg + character*22 msgsent !Message as it will be received + character*37 msg37 + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym + integer codeword(65),itone(85) + integer*2 iwave(NMAX) + integer icos7(0:6) + data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array + data twopi/6.283185307179586476d0/ + save + + msgsent=msg + msg37='' + msg37(1:22)=msg + call get_q65_tones(msg37,codeword,itone) + +! Set up necessary constants + nsym=85 + tsym=7200.d0/12000.d0 + dt=1.d0/11025.d0 + f0=ntxfreq + ndf=2**(mode65-1) + dfgen=ndf*12000.d0/7200.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + iz=85*7200*11025.d0/12000.d0 + t=0.d0 + j0=0 + do i=1,iz + t=t+dt + j=t/tsym + 1.0 + if(j.ne.j0) then + f=f0 + itone(j)*dfgen + dphi=twopi*dt*f + j0=j + endif + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + iwave(2*i-1)=32767.0*cos(xphi) + iwave(2*i)=32767.0*sin(xphi) + enddo + nwave=2*iz + +999 return +end subroutine gen_q65_wave diff --git a/q65w/libm65/geocentric.f90 b/q65w/libm65/geocentric.f90 new file mode 100644 index 000000000..59ed90b51 --- /dev/null +++ b/q65w/libm65/geocentric.f90 @@ -0,0 +1,17 @@ +subroutine geocentric(alat,elev,hlt,erad) + + implicit real*8 (a-h,o-z) + +! IAU 1976 flattening f, equatorial radius a + f = 1.d0/298.257d0 + a = 6378140.d0 + c = 1.d0/sqrt(1.d0 + (-2.d0 + f)*f*sin(alat)*sin(alat)) + arcf = (a*c + elev)*cos(alat) + arsf = (a*(1.d0 - f)*(1.d0 - f)*c + elev)*sin(alat) + hlt = datan2(arsf,arcf) + erad = sqrt(arcf*arcf + arsf*arsf) + erad = 0.001d0*erad + + return +end subroutine geocentric + diff --git a/q65w/libm65/getdphi.f90 b/q65w/libm65/getdphi.f90 new file mode 100644 index 000000000..e55d7120d --- /dev/null +++ b/q65w/libm65/getdphi.f90 @@ -0,0 +1,18 @@ +subroutine getdphi(qphi) + + real qphi(12) + + s=0. + c=0. + do i=1,12 + th=i*30/57.2957795 + s=s+qphi(i)*sin(th) + c=c+qphi(i)*cos(th) + enddo + + dphi=57.2957795*atan2(s,c) + write(*,1010) nint(dphi) +1010 format('!Best-fit Dphi =',i4,' deg') + + return + end diff --git a/q65w/libm65/getpfx1.f90 b/q65w/libm65/getpfx1.f90 new file mode 100644 index 000000000..40fcc369c --- /dev/null +++ b/q65w/libm65/getpfx1.f90 @@ -0,0 +1,96 @@ +subroutine getpfx1(callsign,k,nv2) + + character*12 callsign0,callsign,lof,rof + character*8 c + character addpfx*8,tpfx*4,tsfx*3 + logical ispfx,issfx,invalid + common/pfxcom/addpfx + include 'pfx.f90' + + callsign0=callsign + nv2=0 + iz=index(callsign,' ') - 1 + if(iz.lt.0) iz=12 + islash=index(callsign(1:iz),'/') + k=0 + c=' ' + if(islash.gt.0 .and. islash.le.(iz-4)) then +! Add-on prefix + c=callsign(1:islash-1) + callsign=callsign(islash+1:iz) + do i=1,NZ + if(pfx(i)(1:4).eq.c) then + k=i + go to 10 + endif + enddo + if(addpfx.eq.c) then + k=449 + go to 10 + endif + + else if(islash.eq.(iz-1)) then +! Add-on suffix + c=callsign(islash+1:iz) + callsign=callsign(1:islash-1) + do i=1,NZ2 + if(sfx(i).eq.c(1:1)) then + k=400+i + go to 10 + endif + enddo + endif + +10 if(islash.ne.0 .and.k.eq.0) then +! Original JT65 would force this compound callsign to be treated as +! plain text. In JT65v2, we will encode the prefix or suffix into nc1. +! The task here is to compute the proper value of k. + lof=callsign0(:islash-1) + rof=callsign0(islash+1:) + llof=len_trim(lof) + lrof=len_trim(rof) + ispfx=(llof.gt.0 .and. llof.le.4) + issfx=(lrof.gt.0 .and. lrof.le.3) + invalid=.not.(ispfx.or.issfx) + if(ispfx.and.issfx) then + if(llof.lt.3) issfx=.false. + if(lrof.lt.3) ispfx=.false. + if(ispfx.and.issfx) then + i=ichar(callsign0(islash-1:islash-1)) + if(i.ge.ichar('0') .and. i.le.ichar('9')) then + issfx=.false. + else + ispfx=.false. + endif + endif + endif + + if(invalid) then + k=-1 + else + if(ispfx) then + tpfx=lof(1:4) + k=nchar(tpfx(1:1)) + k=37*k + nchar(tpfx(2:2)) + k=37*k + nchar(tpfx(3:3)) + k=37*k + nchar(tpfx(4:4)) + nv2=1 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + callsign=callsign0(i+1:) + endif + if(issfx) then + tsfx=rof(1:3) + k=nchar(tsfx(1:1)) + k=37*k + nchar(tsfx(2:2)) + k=37*k + nchar(tsfx(3:3)) + nv2=2 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + endif + endif + endif + + return +end subroutine getpfx1 + diff --git a/q65w/libm65/getpfx2.f90 b/q65w/libm65/getpfx2.f90 new file mode 100644 index 000000000..d747e7f29 --- /dev/null +++ b/q65w/libm65/getpfx2.f90 @@ -0,0 +1,24 @@ +subroutine getpfx2(k0,callsign) + + character callsign*12 + include 'pfx.f90' + character addpfx*8 + common/pfxcom/addpfx + + k=k0 + if(k.gt.450) k=k-450 + if(k.ge.1 .and. k.le.NZ) then + iz=index(pfx(k),' ') - 1 + callsign=pfx(k)(1:iz)//'/'//callsign + else if(k.ge.401 .and. k.le.400+NZ2) then + iz=index(callsign,' ') - 1 + callsign=callsign(1:iz)//'/'//sfx(k-400) + else if(k.eq.449) then + iz=index(addpfx,' ') - 1 + if(iz.lt.1) iz=8 + callsign=addpfx(1:iz)//'/'//callsign + endif + + return +end subroutine getpfx2 + diff --git a/q65w/libm65/gran.c b/q65w/libm65/gran.c new file mode 100644 index 000000000..24b986503 --- /dev/null +++ b/q65w/libm65/gran.c @@ -0,0 +1,28 @@ +#include +#include + +/* Generate gaussian random float with mean=0 and std_dev=1 */ +float gran_() +{ + float fac,rsq,v1,v2; + static float gset; + static int iset; + + if(iset){ + /* Already got one */ + iset = 0; + return gset; + } + /* Generate two evenly distributed numbers between -1 and +1 + * that are inside the unit circle + */ + do { + v1 = 2.0 * (float)rand() / RAND_MAX - 1; + v2 = 2.0 * (float)rand() / RAND_MAX - 1; + rsq = v1*v1 + v2*v2; + } while(rsq >= 1.0 || rsq == 0.0); + fac = sqrt(-2.0*log(rsq)/rsq); + gset = v1*fac; + iset++; + return v2*fac; +} diff --git a/q65w/libm65/graycode.f90 b/q65w/libm65/graycode.f90 new file mode 100644 index 000000000..2074241a6 --- /dev/null +++ b/q65w/libm65/graycode.f90 @@ -0,0 +1,10 @@ +subroutine graycode(dat,n,idir) + + integer dat(n) + do i=1,n + dat(i)=igray(dat(i),idir) + enddo + + return +end subroutine graycode + diff --git a/q65w/libm65/graycode65.f90 b/q65w/libm65/graycode65.f90 new file mode 100644 index 000000000..bb2c669ce --- /dev/null +++ b/q65w/libm65/graycode65.f90 @@ -0,0 +1,9 @@ +subroutine graycode65(dat,n,idir) + + integer dat(n) + do i=1,n + dat(i)=igray(dat(i),idir) + enddo + + return +end subroutine graycode65 diff --git a/q65w/libm65/grid2deg.f90 b/q65w/libm65/grid2deg.f90 new file mode 100644 index 000000000..344351dd7 --- /dev/null +++ b/q65w/libm65/grid2deg.f90 @@ -0,0 +1,38 @@ +subroutine grid2deg(grid0,dlong,dlat) + +! Converts Maidenhead grid locator to degrees of West longitude +! and North latitude. + + character*6 grid0,grid + character*1 g1,g2,g3,g4,g5,g6 + + grid=grid0 + i=ichar(grid(5:5)) + if(grid(5:5).eq.' ' .or. i.le.64 .or. i.ge.128) grid(5:6)='mm' + + if(grid(1:1).ge.'a' .and. grid(1:1).le.'z') grid(1:1)= & + char(ichar(grid(1:1))+ichar('A')-ichar('a')) + if(grid(2:2).ge.'a' .and. grid(2:2).le.'z') grid(2:2)= & + char(ichar(grid(2:2))+ichar('A')-ichar('a')) + if(grid(5:5).ge.'A' .and. grid(5:5).le.'Z') grid(5:5)= & + char(ichar(grid(5:5))-ichar('A')+ichar('a')) + if(grid(6:6).ge.'A' .and. grid(6:6).le.'Z') grid(6:6)= & + char(ichar(grid(6:6))-ichar('A')+ichar('a')) + + g1=grid(1:1) + g2=grid(2:2) + g3=grid(3:3) + g4=grid(4:4) + g5=grid(5:5) + g6=grid(6:6) + + nlong = 180 - 20*(ichar(g1)-ichar('A')) + n20d = 2*(ichar(g3)-ichar('0')) + xminlong = 5*(ichar(g5)-ichar('a')+0.5) + dlong = nlong - n20d - xminlong/60.0 + nlat = -90+10*(ichar(g2)-ichar('A')) + ichar(g4)-ichar('0') + xminlat = 2.5*(ichar(g6)-ichar('a')+0.5) + dlat = nlat + xminlat/60.0 + + return +end subroutine grid2deg diff --git a/q65w/libm65/grid2k.f90 b/q65w/libm65/grid2k.f90 new file mode 100644 index 000000000..f68b1409e --- /dev/null +++ b/q65w/libm65/grid2k.f90 @@ -0,0 +1,12 @@ +subroutine grid2k(grid,k) + + character*6 grid + + call grid2deg(grid,xlong,xlat) + nlong=nint(xlong) + nlat=nint(xlat) + k=0 + if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 + + return +end subroutine grid2k diff --git a/q65w/libm65/igray.c b/q65w/libm65/igray.c new file mode 100644 index 000000000..395f79712 --- /dev/null +++ b/q65w/libm65/igray.c @@ -0,0 +1,22 @@ +#ifdef CVF +extern int __stdcall IGRAY(int *n0, int *idir) +#else +int igray_(int *n0, int *idir) +#endif +{ + int n; + unsigned long sh; + unsigned long nn; + n=*n0; + + if(*idir>0) return (n ^ (n >> 1)); + + sh = 1; + nn = (n >> sh); + while (nn > 0) { + n ^= nn; + sh <<= 1; + nn = (n >> sh); + } + return (n); +} diff --git a/q65w/libm65/indexx.f90 b/q65w/libm65/indexx.f90 new file mode 100644 index 000000000..7a35f53b8 --- /dev/null +++ b/q65w/libm65/indexx.f90 @@ -0,0 +1,91 @@ +subroutine indexx(arr,n,indx) + + parameter (M=7,NSTACK=50) + integer n,indx(n) + real arr(n) + integer i,indxt,ir,itemp,j,jstack,k,l,istack(NSTACK) + real a + + do j=1,n + indx(j)=j + enddo + + jstack=0 + l=1 + ir=n +1 if(ir-l.lt.M) then + do j=l+1,ir + indxt=indx(j) + a=arr(indxt) + do i=j-1,1,-1 + if(arr(indx(i)).le.a) goto 2 + indx(i+1)=indx(i) + enddo + i=0 +2 indx(i+1)=indxt + enddo + if(jstack.eq.0) return + + ir=istack(jstack) + l=istack(jstack-1) + jstack=jstack-2 + + else + k=(l+ir)/2 + itemp=indx(k) + indx(k)=indx(l+1) + indx(l+1)=itemp + + if(arr(indx(l+1)).gt.arr(indx(ir))) then + itemp=indx(l+1) + indx(l+1)=indx(ir) + indx(ir)=itemp + endif + + if(arr(indx(l)).gt.arr(indx(ir))) then + itemp=indx(l) + indx(l)=indx(ir) + indx(ir)=itemp + endif + + if(arr(indx(l+1)).gt.arr(indx(l))) then + itemp=indx(l+1) + indx(l+1)=indx(l) + indx(l)=itemp + endif + + i=l+1 + j=ir + indxt=indx(l) + a=arr(indxt) +3 continue + i=i+1 + if(arr(indx(i)).lt.a) goto 3 + +4 continue + j=j-1 + if(arr(indx(j)).gt.a) goto 4 + if(j.lt.i) goto 5 + itemp=indx(i) + indx(i)=indx(j) + indx(j)=itemp + goto 3 + +5 indx(l)=indx(j) + indx(j)=indxt + jstack=jstack+2 + if(jstack.gt.NSTACK) stop 'NSTACK too small in indexx' + if(ir-i+1.ge.j-l)then + istack(jstack)=ir + istack(jstack-1)=i + ir=j-1 + else + istack(jstack)=j-1 + istack(jstack-1)=l + l=i + endif + endif + goto 1 + +end subroutine indexx + diff --git a/q65w/libm65/init_rs.c b/q65w/libm65/init_rs.c new file mode 100644 index 000000000..876819f8c --- /dev/null +++ b/q65w/libm65/init_rs.c @@ -0,0 +1,120 @@ +/* Initialize a RS codec + * + * Copyright 2002 Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#include + +#ifdef CCSDS +#include "ccsds.h" +#elif defined(BIGSYM) +#include "int.h" +#else +#include "char.h" +#endif + +void FREE_RS(void *p){ + struct rs *rs = (struct rs *)p; + + free(rs->alpha_to); + free(rs->index_of); + free(rs->genpoly); + free(rs); +} + +/* Initialize a Reed-Solomon codec + * symsize = symbol size, bits (1-8) + * gfpoly = Field generator polynomial coefficients + * fcr = first root of RS code generator polynomial, index form + * prim = primitive element to generate polynomial roots + * nroots = RS code generator polynomial degree (number of roots) + */ +void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim, + unsigned int nroots){ + struct rs *rs; + int i, j, sr,root,iprim; + + /* Check parameter ranges */ + if(symsize < 0 || symsize > (int)(8*sizeof(DTYPE))) + return NULL; /* Need version with ints rather than chars */ + + if(fcr >= (1<= (1<= (1<mm = symsize; + rs->nn = (1<alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); + if(rs->alpha_to == NULL){ + free(rs); + return NULL; + } + rs->index_of = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); + if(rs->index_of == NULL){ + free(rs->alpha_to); + free(rs); + return NULL; + } + + /* Generate Galois field lookup tables */ + rs->index_of[0] = A0; /* log(zero) = -inf */ + rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */ + sr = 1; + for(i=0;inn;i++){ + rs->index_of[sr] = i; + rs->alpha_to[i] = sr; + sr <<= 1; + if(sr & (1<nn; + } + if(sr != 1){ + /* field generator polynomial is not primitive! */ + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + + /* Form RS code generator polynomial from its roots */ + rs->genpoly = (DTYPE *)malloc(sizeof(DTYPE)*(nroots+1)); + if(rs->genpoly == NULL){ + free(rs->alpha_to); + free(rs->index_of); + free(rs); + return NULL; + } + rs->fcr = fcr; + rs->prim = prim; + rs->nroots = nroots; + + /* Find prim-th root of 1, used in decoding */ + for(iprim=1;(iprim % prim) != 0;iprim += rs->nn) + ; + rs->iprim = iprim / prim; + + rs->genpoly[0] = 1; + for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) { + rs->genpoly[i+1] = 1; + + /* Multiply rs->genpoly[] by @**(root + x) */ + for (j = i; j > 0; j--){ + if (rs->genpoly[j] != 0) + rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; + else + rs->genpoly[j] = rs->genpoly[j-1]; + } + /* rs->genpoly[0] can never be zero */ + rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; + } + /* convert rs->genpoly[] to index form for quicker encoding */ + for (i = 0; i <= nroots; i++) + rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; + + return rs; +} diff --git a/q65w/libm65/int.h b/q65w/libm65/int.h new file mode 100644 index 000000000..ada5bfd4c --- /dev/null +++ b/q65w/libm65/int.h @@ -0,0 +1,54 @@ +/* Include file to configure the RS codec for integer symbols + * + * Copyright 2002, Phil Karn, KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ +#define DTYPE int + +/* Reed-Solomon codec control block */ +struct rs { + unsigned int mm; /* Bits per symbol */ + unsigned int nn; /* Symbols per block (= (1<= rs->nn) { + x -= rs->nn; + x = (x >> rs->mm) + (x & rs->nn); + } + return x; +} +#define MODNN(x) modnn(rs,x) + +#define MM (rs->mm) +#define NN (rs->nn) +#define ALPHA_TO (rs->alpha_to) +#define INDEX_OF (rs->index_of) +#define GENPOLY (rs->genpoly) +#define NROOTS (rs->nroots) +#define FCR (rs->fcr) +#define PRIM (rs->prim) +#define IPRIM (rs->iprim) +#define A0 (NN) + +#define ENCODE_RS encode_rs_int +#define DECODE_RS decode_rs_int +#define INIT_RS init_rs_int +#define FREE_RS free_rs_int + +void ENCODE_RS(void *p,DTYPE *data,DTYPE *parity); +int DECODE_RS(void *p,DTYPE *data,int *eras_pos,int no_eras, int calc_syn); +void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned int fcr, + unsigned int prim,unsigned int nroots); +void FREE_RS(void *p); + + + + diff --git a/q65w/libm65/interleave63.f90 b/q65w/libm65/interleave63.f90 new file mode 100644 index 000000000..a32ef34cd --- /dev/null +++ b/q65w/libm65/interleave63.f90 @@ -0,0 +1,25 @@ +subroutine interleave63(d1,idir) + +! Interleave (idir=1) or de-interleave (idir=-1) the array d1. + + integer d1(0:6,0:8) + integer d2(0:8,0:6) + + if(idir.ge.0) then + do i=0,6 + do j=0,8 + d2(j,i)=d1(i,j) + enddo + enddo + call move(d2,d1,63) + else + call move(d1,d2,63) + do i=0,6 + do j=0,8 + d1(i,j)=d2(j,i) + enddo + enddo + endif + + return +end subroutine interleave63 diff --git a/q65w/libm65/ipcomm.cpp b/q65w/libm65/ipcomm.cpp new file mode 100644 index 000000000..b40a09998 --- /dev/null +++ b/q65w/libm65/ipcomm.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +QSharedMemory mem_m65("mem_m65"); +QSystemSemaphore sem_m65("sem_m65", 1, QSystemSemaphore::Open); + +extern "C" { + bool attach_m65_(); + bool create_m65_(int nsize); + bool detach_m65_(); + bool lock_m65_(); + bool unlock_m65_(); + char* address_m65_(); + int size_m65_(); + + bool acquire_m65_(); + bool release_m65_(); + + extern struct { + char c[10]; + } m65com_; +} + +bool attach_m65_() {return mem_m65.attach();} +bool create_m65_(int nsize) {return mem_m65.create(nsize);} +bool detach_m65_() {return mem_m65.detach();} +bool lock_m65_() {return mem_m65.lock();} +bool unlock_m65_() {return mem_m65.unlock();} +char* address_m65_() {return (char*)mem_m65.constData();} +int size_m65_() {return (int)mem_m65.size();} + +bool acquire_m65_() {return sem_m65.acquire();} +bool release_m65_() {return sem_m65.release();} diff --git a/q65w/libm65/iqcal.f90 b/q65w/libm65/iqcal.f90 new file mode 100644 index 000000000..c0c4fce2d --- /dev/null +++ b/q65w/libm65/iqcal.f90 @@ -0,0 +1,30 @@ +subroutine iqcal(nn,c,nfft,gain,phase,zsum,ipk,reject) + + complex c(0:nfft-1) + complex z,zsum,zave + + if(nn.eq.0) then + zsum=0. + endif + nn=nn+1 + smax=0. + ipk=1 + do i=1,nfft-1 !Find strongest signal + s=real(c(i))**2 + aimag(c(i))**2 + if(s.gt.smax) then + smax=s + ipk=i + endif + enddo + pimage=real(c(nfft-ipk))**2 + aimag(c(nfft-ipk))**2 + p=smax + pimage + z=c(ipk)*c(nfft-ipk)/p !Synchronous detection of image + zsum=zsum+z + zave=zsum/nn + tmp=sqrt(1.0 - (2.0*real(zave))**2) + phase=asin(2.0*aimag(zave)/tmp) !Estimate phase + gain=tmp/(1.0-2.0*real(zave)) !Estimate gain + reject=10.0*log10(pimage/smax) + + return +end subroutine iqcal diff --git a/q65w/libm65/iqfix.f90 b/q65w/libm65/iqfix.f90 new file mode 100644 index 000000000..93cace4b1 --- /dev/null +++ b/q65w/libm65/iqfix.f90 @@ -0,0 +1,28 @@ +subroutine iqfix(c,nfft,gain,phase) + + complex c(0:nfft-1) + complex z,h,u,v + + nh=nfft/2 + h=gain*cmplx(cos(phase),sin(phase)) + + do i=1,nh-1 + u=c(i) + v=c(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + c(i)=0.5*cmplx(x,y) + z=u + u=v + v=z + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + c(nfft-i)=0.5*cmplx(x,y) + enddo + + return +end subroutine iqfix diff --git a/q65w/libm65/jt65code.f90 b/q65w/libm65/jt65code.f90 new file mode 100644 index 000000000..b232fcdd6 --- /dev/null +++ b/q65w/libm65/jt65code.f90 @@ -0,0 +1,47 @@ +program JT65code + +! Provides examples of message packing, bit and symbol ordering, +! Reed Solomon encoding, and other necessary details of the JT65 +! protocol. + + character*22 msg0,msg,decoded,cok*3 + integer dgen(12),sent(63),recd(12),era(51) + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: JT65code "message"' + go to 999 + endif + + call getarg(1,msg0) !Get message from command line + msg=msg0 + + call chkmsg(msg,cok,nspecial,flip) !See if it includes "OOO" report + if(nspecial.gt.0) then !or is a shorthand message + write(*,1010) +1010 format('Shorthand message.') + go to 999 + endif + + call packmsg(msg,dgen) !Pack message into 72 bits + write(*,1020) msg0 +1020 format('Message: ',a22) !Echo input message + if(iand(dgen(10),8).ne.0) write(*,1030) !Is plain text bit set? +1030 format('Plain text.') + write(*,1040) dgen +1040 format('Packed message, 6-bit symbols: ',12i3) !Display packed symbols + + call rs_encode(dgen,sent) !RS encode + call interleave63(sent,1) !Interleave channel symbols + call graycode(sent,63,1) !Apply Gray code + write(*,1050) sent +1050 format('Channel symbols, including FEC:'/(i5,20i3)) + + call graycode(sent,63,-1) + call interleave63(sent,-1) + call rs_decode(sent,era,0,recd,nerr) + call unpackmsg(recd,decoded) !Unpack the user message + write(*,1060) decoded,cok +1060 format('Decoded message: ',a22,2x,a3) + +999 end program JT65code diff --git a/q65w/libm65/k2grid.f90 b/q65w/libm65/k2grid.f90 new file mode 100644 index 000000000..aa7631579 --- /dev/null +++ b/q65w/libm65/k2grid.f90 @@ -0,0 +1,12 @@ +subroutine k2grid(k,grid) + character grid*6 + + nlong=2*mod((k-1)/5,90)-179 + if(k.gt.450) nlong=nlong+180 + nlat=mod(k-1,5)+ 85 + dlat=nlat + dlong=nlong + call deg2grid(dlong,dlat,grid) + + return +end subroutine k2grid diff --git a/q65w/libm65/lorentzian.f90 b/q65w/libm65/lorentzian.f90 new file mode 100644 index 000000000..cd2257a75 --- /dev/null +++ b/q65w/libm65/lorentzian.f90 @@ -0,0 +1,102 @@ +subroutine lorentzian(y,npts,a) + +! Input: y(npts); assume x(i)=i, i=1,npts +! Output: a(5) +! a(1) = baseline +! a(2) = amplitude +! a(3) = x0 +! a(4) = width +! a(5) = chisqr + + real y(npts) + real a(5) + real deltaa(4) + + a=0. + df=12000.0/8192.0 !df = 1.465 Hz + width=0. + ipk=0 + ymax=-1.e30 + do i=1,npts + if(y(i).gt.ymax) then + ymax=y(i) + ipk=i + endif +! write(50,3001) i,i*df,y(i) +!3001 format(i6,2f12.3) + enddo +! base=(sum(y(ipk-149:ipk-50)) + sum(y(ipk+51:ipk+150)))/200.0 + base=(sum(y(1:20)) + sum(y(npts-19:npts)))/40.0 + stest=ymax - 0.5*(ymax-base) + ssum=y(ipk) + do i=1,50 + if(ipk+i.gt.npts) exit + if(y(ipk+i).lt.stest) exit + ssum=ssum + y(ipk+i) + enddo + do i=1,50 + if(ipk-i.lt.1) exit + if(y(ipk-i).lt.stest) exit + ssum=ssum + y(ipk-i) + enddo + ww=ssum/y(ipk) + width=2 + t=ww*ww - 5.67 + if(t.gt.0.0) width=sqrt(t) + a(1)=base + a(2)=ymax-base + a(3)=ipk + a(4)=width + +! Now find Lorentzian parameters + + deltaa(1)=0.1 + deltaa(2)=0.1 + deltaa(3)=1.0 + deltaa(4)=1.0 + nterms=4 + +! Start the iteration + chisqr=0. + chisqr0=1.e6 + do iter=1,5 + do j=1,nterms + chisq1=fchisq0(y,npts,a) + fn=0. + delta=deltaa(j) +10 a(j)=a(j)+delta + chisq2=fchisq0(y,npts,a) + if(chisq2.eq.chisq1) go to 10 + if(chisq2.gt.chisq1) then + delta=-delta !Reverse direction + a(j)=a(j)+delta + tmp=chisq1 + chisq1=chisq2 + chisq2=tmp + endif +20 fn=fn+1.0 + a(j)=a(j)+delta + chisq3=fchisq0(y,npts,a) + if(chisq3.lt.chisq2) then + chisq1=chisq2 + chisq2=chisq3 + go to 20 + endif + +! Find minimum of parabola defined by last three points + delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) + a(j)=a(j)-delta + deltaa(j)=deltaa(j)*fn/3. +! write(*,4000) iter,j,a,chisq2 +!4000 format(i1,i2,4f10.4,f11.3) + enddo + chisqr=fchisq0(y,npts,a) +! write(*,4000) 0,0,a,chisqr + if(chisqr/chisqr0.gt.0.99) exit + chisqr0=chisqr + enddo + a(5)=chisqr + + return +end subroutine lorentzian + diff --git a/q65w/libm65/m65.f90 b/q65w/libm65/m65.f90 new file mode 100644 index 000000000..c93357c7e --- /dev/null +++ b/q65w/libm65/m65.f90 @@ -0,0 +1,195 @@ +program m65 + +! Decoder for map65. Can run stand-alone, reading data from *.tf2 files; +! or as the back end of map65, with data placed in a shared memory region. + +! Fortran logical units +! +! 10 binary input data, *.tf2 files +! 11 prefixes.txt +! 12 wb_w65.txt +! 13 map65.log +! 14 +! 15 +! 16 tquick log +! 17 saved *.tf2 files +! 18 test file to be transmitted (wsjtgen.f90) +! 19 livecq.txt +! 20 +! 21 map65_rx.log +! 22 +! 23 CALL3.TXT +! 24 +! 25 +! 26 tmp26.txt + + use timer_module, only: timer + use timer_impl, only: init_timer, fini_timer + + include 'njunk.f90' + parameter (NFFT=32768) + parameter (NSMAX=60*96000) + parameter (NREAD=2048) + integer*2 i2(NREAD) + real*8 hsym + real*4 ssz5a(NFFT) + logical*1 lstrong(0:1023),ldecoded,eof + real*8 fc0,fcenter + character*80 arg,infile + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fc0,nutc0,junk(NJUNK) + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime + common/early/nhsym1,nhsym2,ldecoded(32768) + + nargs=iargc() + if(nargs.ne.1 .and. nargs.lt.5) then + print*,'Usage: m65 Jsub Qsub Xpol <95238|96000> file1 [file2 ...]' + print*,'Examples: m65 B A X 96000 *.tf2' + print*,' m65 C C N 96000 *.iq' + print*,'' + print*,' m65 -s' + print*,' (Gets data from MAP65, via shared memory region.)' + go to 999 + endif + nstandalone=1 + nhsym1=280 + nhsym2=302 + call getarg(1,arg) + if(arg(1:2).eq.'-s') then + call m65a + go to 999 + endif + n=1 + if(arg(1:1).eq.'0') n=0 + if(arg(1:1).eq.'A') n=1 + if(arg(1:1).eq.'B') n=2 + if(arg(1:1).eq.'C') n=3 + + call getarg(2,arg) + m=1 + if(arg(1:1).eq.'0') m=0 + if(arg(1:1).eq.'A') m=1 + if(arg(1:1).eq.'B') m=2 + if(arg(1:1).eq.'C') m=3 + if(arg(1:1).eq.'D') m=4 + if(arg(1:1).eq.'E') m=5 + nmode=10*m + n + + call getarg(3,arg) + nxpol=0 + if(arg(1:1).eq.'X') nxpol=1 + + call getarg(4,arg) + nfsample=96000 + if(arg.eq.'95238') nfsample=95238 + + ifile1=5 + +! Some default parameters for command-line execution, in early testing. + mycall='K1JT' + mygrid='FN20QI' + hiscall='K9AN' + hisgrid='EN50' + nfa=100 !144.100 + nfb=162 !144.162 + ntol=100 + nkeep=10 !??? + mousefqso=140 !For IK4WLV in 210220_1814.tf2 + mousedf=0 + nfcal=0 + nkhz_center=125 + + if(nxpol.eq.0) then + nfa=55 !For KA1GT files + nfb=143 + mousefqso=69 !W2HRO signal + nkhz_center=100 + endif + + call ftninit('.') + call init_timer('timer.out') + call timer('m65 ',0) + + do ifile=ifile1,nargs + call getarg(ifile,infile) + open(10,file=infile,access='stream',status='old',err=998) + i1=index(infile,'.tf2') + if(i1.lt.1) i1=index(infile,'.iq') + read(infile(i1-4:i1-1),*,err=1) nutc0 + go to 2 +1 nutc0=0 +2 hsym=2048.d0*96000.d0/11025.d0 !Samples per half symbol + read(10) fcenter + newdat=1 + nhsym0=-999 + k=0 + + nch=2 + if(nxpol.eq.1) nch=4 + eof=.false. + do irec=1,9999999 + if(.not.eof) read(10,end=4) i2 + go to 6 +4 eof=.true. +6 if(eof) i2=0 + do i=1,NREAD,nch + k=k+1 + if(k.gt.60*96000) exit + dd(1,k)=i2(i) + dd(2,k)=i2(i+1) + if(nxpol.eq.1) then + dd(3,k)=i2(i+2) + dd(4,k)=i2(i+3) + endif + enddo + nhsym=(k-2048)/hsym + if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then + ndiskdat=1 + nb=0 +! Emit signal readyForFFT + fgreen=-13.0 + iqadjust=0 + iqapply=0 + nbslider=100 + gainx=0.9962 + gainy=1.0265 + phasex=0.01426 + phasey=-0.01195 + call timer('symspec ',0) + call symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & + fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx, & + rejecty,pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) + call timer('symspec ',1) + nhsym0=nhsym + + nutc=nutc0 + if(nhsym.eq.nhsym1) call decode0(dd,ss,savg,nstandalone) + if(nhsym.eq.nhsym2) then + call decode0(dd,ss,savg,nstandalone) + exit + endif + endif + enddo ! irec + + if(iqadjust.ne.0) write(*,3002) rejectx,rejecty +3002 format('Image rejection:',2f7.1,' dB') + enddo ! ifile + + call timer('m65 ',1) + call timer('m65 ',101) + go to 999 + +998 print*,'Cannot open file:' + print*,infile + +999 call fini_timer() + if(arg(1:2).eq.'-s') then + write(21,1999) datetime(:17) +1999 format('Subprocess m65 terminated normally at UTC ',a17) + close(21) + endif + +end program m65 diff --git a/q65w/libm65/m65a.f90 b/q65w/libm65/m65a.f90 new file mode 100644 index 000000000..ffeb176a3 --- /dev/null +++ b/q65w/libm65/m65a.f90 @@ -0,0 +1,107 @@ +subroutine m65a + + use timer_module, only: timer + use timer_impl, only: init_timer !, limtrace + use, intrinsic :: iso_c_binding, only: C_NULL_CHAR + use FFTW3 + + interface + function address_m65() + integer*1, pointer :: address_m65 + end function address_m65 + end interface + + integer*1 attach_m65 + integer size_m65 + integer*1, pointer :: p_m65 + character*80 cwd + character wisfile*256 + logical fileExists + + call getcwd(cwd) + call ftninit(trim(cwd)) + call init_timer (trim(cwd)//'/timer.out') + + limtrace=0 + lu=12 + i1=attach_m65() + +10 inquire(file=trim(cwd)//'/.lock',exist=fileExists) + if(fileExists) then + call sleep_msec(100) + go to 10 + endif + + inquire(file=trim(cwd)//'/.quit',exist=fileExists) + if(fileExists) then + call timer('decode0 ',101) + i=detach_m65() + ! Save FFTW wisdom and free memory + wisfile=trim(cwd)//'/m65_wisdom.dat'// C_NULL_CHAR + if(len(trim(wisfile)).gt.0) iret=fftwf_export_wisdom_to_filename(wisfile) + call four2a(a,-1,1,1,1) + call filbig(a,-1,1,0.0,0,0,0,0,0) !used for FFT plans + call fftwf_cleanup_threads() + call fftwf_cleanup() + go to 999 + endif + + nbytes=size_m65() + if(nbytes.le.0) then + print*,'m65a: Shared memory mem_m65 does not exist.' + print*,'Program m65a should be started automatically from within map65.' + go to 999 + endif + p_m65=>address_m65() + call m65b(p_m65,nbytes) + call sleep_msec(500) ! wait for .lock to be recreated + go to 10 + +999 return +end subroutine m65a + +subroutine m65b(m65com,nbytes) + integer*1 m65com(0:nbytes-1) + kss=4*4*60*96000 + ksavg=kss+4*4*322*32768 + kfcenter=ksavg+4*4*32768 + call m65c(m65com(0),m65com(kss),m65com(ksavg),m65com(kfcenter)) + return +end subroutine m65b + +subroutine m65c(dd,ss,savg,nparams0) + + include 'njunk.f90' + real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768) + real*8 fcenter + integer nparams0(NJUNK+2),nparams(NJUNK+2) + logical ldecoded + character*12 mycall,hiscall + character*6 mygrid,hisgrid + character*20 datetime + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & + datetime,junk1,junk2 + common/early/nhsym1,nhsym2,ldecoded(32768) + equivalence (nparams,fcenter) + + nparams=nparams0 !Copy parameters into common/npar/ + npatience=1 + if(nhsym.eq.nhsym1 .and. iand(nrxlog,1).ne.0) then + write(21,1000) datetime(:17) +1000 format(/'UTC Date: 'a17/78('-')) + flush(21) + endif + if(iand(nrxlog,2).ne.0) rewind(21) + if(iand(nrxlog,4).ne.0) then + if(nhsym.eq.nhsym1) rewind(26) + if(nhsym.eq.nhsym2) backspace(26) + endif + + nstandalone=0 + if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone) + + return +end subroutine m65c diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 new file mode 100644 index 000000000..1861467ad --- /dev/null +++ b/q65w/libm65/map65a.f90 @@ -0,0 +1,529 @@ +subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & + nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & + neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & + ndiskdat,nxpol,nmode,ndop00) + +! Processes timf2 data from Linrad to find and decode JT65 signals. + + use wideband_sync + use timer_module, only: timer + + parameter (MAXMSG=1000) !Size of decoded message list + parameter (NSMAX=60*96000) + real dd(4,NSMAX) + real*4 ss(4,322,NFFT),savg(4,NFFT) + real tavg(-50:50) !Temp for finding local base level + real base(4) !Local basel level at 4 pol'ns + real sig(MAXMSG,30) !Parameters of detected signals + real a(5) + real*8 fcenter + character*22 msg(MAXMSG) + character*3 shmsg0(4) + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,cp*1,cm*1 + integer indx(MAXMSG),nsiz(MAXMSG) + logical done(MAXMSG) + logical xpol,bq65,q65b_called + logical candec(MAX_CANDIDATES) + logical ldecoded + character decoded*22,blank*22,cmode*2 + real short(3,NFFT) !SNR dt ipol for potential shorthands + real qphi(12) + type(candidate) :: cand(MAX_CANDIDATES) + + common/c3com/ mcall3a + common/testcom/ifreq + common/early/nhsym1,nhsym2,ldecoded(32768) + common/decodes/ndecodes + + data blank/' '/,cm/'#'/ + data shmsg0/'ATT','RO ','RRR','73 '/ + data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ + save + + rewind 12 + ndecodes=0 + +! Clean start for Q65 at early decode + if(nhsym.eq.nhsym1 .or. nagain.ne.0) ldecoded=.false. + if(ndiskdat.eq.1) ldecoded=.false. + + nkhz_center=nint(1000.0*(fcenter-int(fcenter))) + mfa=nfa-nkhz_center+48 + mfb=nfb-nkhz_center+48 + mode65=mod(nmode,10) + if(mode65.eq.3) mode65=4 + mode_q65=nmode/10 + nts_jt65=mode65 !JT65 tone separation factor + nts_q65=2**(mode_q65-1) !Q65 tone separation factor + xpol=(nxpol.ne.0) + +! No second decode for JT65? + if(nhsym.eq.nhsym2 .and. nagain.eq.0 .and.ndiskdat.eq.0) mode65=0 + + if(nagain.eq.0) then + call timer('get_cand',0) + call get_candidates(ss,savg,xpol,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + candec=.false. + endif +!### +! do k=1,ncand +! freq=cand(k)%f+nkhz_center-48.0 +! ipk=cand(k)%indx +! write(71,3071) k,db(cand(k)%snr),freq,cand(k)%xdt, & +! cand(k)%ipol,cand(k)%iflip,ipk,ldecoded(ipk) +!3071 format(i3,f8.2,f10.3,f8.2,2i3,i6,L4) +! enddo +!### + + nwrite_q65=0 + bq65=mode_q65.gt.0 + + mcall3a=mcall3b + mousefqso0=mousefqso + if(.not.xpol) ndphi=0 + nsum=0 + +!### Should use AppDir! ### + open(23,file='CALL3.TXT',status='unknown') + + df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz + if(nfsample.eq.95238) df=95238.1/NFFT + ftol=0.010 !Frequency tolerance (kHz) + dphi=idphi/57.2957795 + foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL + fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) + iloop=0 + +2 if(ndphi.eq.1) dphi=30*iloop/57.2957795 + + if(nutc.ne.nutc0) nfile=nfile+1 + nutc0=nutc + + do nqd=1,0,-1 + if(nqd.eq.1) then !Quick decode, at fQSO + fa=1000.0*(fqso+0.001*mousedf) - ntol + fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078 + else !Wideband decode at all freqs + fa=-1000*0.5*(nfb-nfa) + 1000*nfshift + fb= 1000*0.5*(nfb-nfa) + 1000*nfshift + endif + ia=nint(fa/df) + 16385 + ib=nint(fb/df) + 16385 + ia=max(51,ia) + ib=min(32768-51,ib) + if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia + + km=0 + nkm=1 + nz=n/8 + freq0=-999. + sync10=-999. + fshort0=-999. + syncshort0=-999. + ntry=0 + short=0. !Zero the whole short array + jpz=1 + if(xpol) jpz=4 + +! First steps for JT65 decoding + do i=ia,ib !Search over freq range + freq=0.001*(i-16385)*df +! Find the local base level for each polarization; update every 10 bins. + if(mod(i-ia,10).eq.0) then + do jp=1,jpz + do ii=-50,50 + iii=i+ii + if(iii.ge.1 .and. iii.le.32768) then + tavg(ii)=savg(jp,iii) + else + write(13,*) 'Error in iii:',iii,ia,ib,fa,fb + flush(13) + go to 900 + endif + enddo + call pctile(tavg,101,50,base(jp)) + enddo + endif + +! Find max signal at this frequency + smax=0. + do jp=1,jpz + if(savg(jp,i)/base(jp).gt.smax) then + smax=savg(jp,i)/base(jp) + jpmax=jp + endif + enddo + + if(smax.gt.1.1 .or. ia.eq.ib) then +! Look for JT65 sync patterns and shorthand square-wave patterns. + call timer('ccf65 ',0) + ssmax=1.e30 + call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt, & + flipk,syncshort,snr2,ipol2,dt2) +!### if(dt.lt.-2.6 .or. dt.gt.2.5) sync1=-99.0 !### + call timer('ccf65 ',1) + if(mode65.eq.0) syncshort=-99.0 !If "No JT65", don't waste time + +! ########################### Search for Shorthand Messages ################# +! Is there a shorthand tone above threshold? + thresh0=1.0 +! Use lower thresh0 at fQSO + if(nqd.eq.1 .and. ntol.le.100) thresh0=0. + if(syncshort.gt.thresh0) then +! ### Do shorthand AFC here (or maybe after finding a pair?) ### + short(1,i)=syncshort + short(2,i)=dt2 + short(3,i)=ipol2 + +! Check to see if lower tone of shorthand pair was found. + do j=2,4 + i0=i-nint(j*mode65*10.0*(11025.0/4096.0)/df) +! Should this be i0 +/- 1, or just i0? +! Should we also insist that difference in DT be either 1.5 or -1.5 s? + if(short(1,i0).gt.thresh0) then + fshort=0.001*(i0-16385)*df + noffset=0 + if(nqd.eq.1) noffset=nint(1000.0*(fshort-fqso)-mousedf) + if(abs(noffset).le.ntol) then +! Keep only the best candidate within ftol. +!### NB: sync2 was not defined here! +! sync2=syncshort !### try this ??? + if(fshort-fshort0.le.ftol .and. & + syncshort.gt.syncshort0 .and. nkm.eq.2) km=km-1 + if(fshort-fshort0.gt.ftol .or. & + syncshort.gt.syncshort0) then + if(km.lt.MAXMSG) km=km+1 + sig(km,1)=nfile + sig(km,2)=nutc + sig(km,3)=fshort + 0.5*(nfa+nfb) + sig(km,4)=syncshort + sig(km,5)=dt2 + sig(km,6)=45*(ipol2-1)/57.2957795 + sig(km,7)=0 + sig(km,8)=snr2 + sig(km,9)=0 + sig(km,10)=0 +! sig(km,11)=rms0 + sig(km,12)=savg(ipol2,i) + sig(km,13)=0 + sig(km,14)=0 + sig(km,15)=0 + sig(km,16)=0 +! sig(km,17)=0 + sig(km,18)=0 + msg(km)=shmsg0(j) + fshort0=fshort + syncshort0=syncshort + nkm=2 + endif + endif + endif + enddo + endif + +! ########################### Search for Normal Messages ########### +! Is sync1 above threshold? + thresh1=1.0 +! Use lower thresh1 at fQSO + if(nqd.eq.1 .and. ntol.le.100) thresh1=0. + noffset=0 + if(nqd.ge.1) noffset=nint(1000.0*(freq-fqso)-mousedf) + if(newdat.eq.1 .and. sync1.gt.-99.0) then + sync1=thresh1+1.0 + noffset=0 + endif + if(sync1.gt.thresh1 .and. abs(noffset).le.ntol) then +! Keep only the best candidate within ftol. +! (Am I deleting any good decodes by doing this?) + if(freq-freq0.le.ftol .and. sync1.gt.sync10 .and. & + nkm.eq.1) km=km-1 + if(freq-freq0.gt.ftol .or. sync1.gt.sync10) then + nflip=nint(flipk) + f00=(i-1)*df !Freq of detected sync tone (0-96000 Hz) + ntry=ntry+1 + if((nqd.eq.1 .and. ntry.ge.40) .or. & + (nqd.eq.0 .and. ntry.ge.400)) then +! Too many calls to decode1a! + write(*,*) '! Signal too strong, or suspect data? Decoding aborted.' + write(13,*) 'Signal too strong, or suspect data? Decoding aborted.' + call flush(13) + go to 900 + endif + + call timer('decode1a',0) + ifreq=i + ikhz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift + idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift))) + call decode1a(dd,newdat,f00,nflip,mode65,nfsample, & + xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & + ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & + a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded) + call timer('decode1a',1) + +! The case sync1=2.0 is just to make sure decode1a is called and bigfft done. + if(mode65.ne.0 .and. sync1.ne.2.000000) then + if(km.lt.MAXMSG) km=km+1 + sig(km,1)=nfile + sig(km,2)=nutc + sig(km,3)=freq + 0.5*(nfa+nfb) + sig(km,4)=sync1 + sig(km,5)=dt + sig(km,6)=pol + sig(km,7)=flipk + sig(km,8)=sync2 + sig(km,9)=nkv + sig(km,10)=qual +! sig(km,11)=idphi + sig(km,12)=savg(ipol,i) + sig(km,13)=a(1) + sig(km,14)=a(2) + sig(km,15)=a(3) + sig(km,16)=a(4) +! sig(km,17)=a(5) + sig(km,18)=nhist + msg(km)=decoded + freq0=freq + sync10=sync1 + nkm=1 + endif + endif + endif + endif + enddo !i=ia,ib + + if(nqd.eq.1) then + nwrite=0 + if(mode65.eq.0) km=0 + do k=1,km + decoded=msg(k) + if(decoded.ne.' ') then + nutc=sig(k,2) + freq=sig(k,3) + sync1=sig(k,4) + dt=sig(k,5) + npol=nint(57.2957795*sig(k,6)) + flip=sig(k,7) + sync2=sig(k,8) + nkv=sig(k,9) + nqual=sig(k,10) +! idphi=nint(sig(k,11)) + if(flip.lt.0.0) then + do i=22,1,-1 + if(decoded(i:i).ne.' ') go to 8 + enddo + stop 'Error in message format' +8 if(i.le.18) decoded(i+2:i+4)='OOO' + endif + nkHz=nint(freq-foffset)-nfshift + mhz=fcenter ! ... +fadd ??? + f0=mhz+0.001*nkHz + ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) + nsync1=sync1 + + s2db=10.0*log10(sync2) - 40 !### empirical ### + nsync2=nint(s2db) + if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & + decoded(1:4).eq.'73 ') then + nsync2=nint(1.33*s2db + 2.0) + endif + + nwrite=nwrite+1 + if(nxant.ne.0) then + npol=npol-45 + if(npol.lt.0) npol=npol+180 + endif + + call txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) + + if(ndphi.eq.0) then + write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & + cm,decoded,nkv,nqual,ntxpol,cp +1010 format('!',i3,i5,i4,i6.4,f5.1,i5,1x,a1,1x,a22,i2,i5,i5,1x,a1) + else + if(iloop.ge.1) qphi(iloop)=sig(k,10) + write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & + cm,decoded,nkv,nqual,30*iloop + write(27,1011) 30*iloop,nkHz,ndf,npol,nutc, & + dt,sync2,nkv,nqual,cm,decoded +1011 format(i3,i4,i5,i4,i6.4,1x,f5.1,f7.1,i3,i5,a1,1x,a22) + endif + endif + enddo ! k=1,km + + if(bq65) then + q65b_called=.false. + do icand=1,ncand + if(cand(icand)%iflip.ne.0) cycle !Keep only Q65 candidates + freq=cand(icand)%f+nkhz_center-48.0-1.27046 + nhzdiff=nint(1000.0*(freq-mousefqso)-mousedf) - nfcal +! Now looking for "quick decode" (nqd=1) candidates at cursor freq +/- ntol. + if(nqd.eq.1 .and. abs(nhzdiff).gt.ntol) cycle + ikhz=mousefqso + q65b_called=.true. + f0=cand(icand)%f + call timer('q65b ',0) + call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & + ntol,xpol,mycall,mygrid, hiscall,hisgrid,mode_q65,f0,fqso, & + newdat,nagain,max_drift,nhsym,ndop00,idec) + call timer('q65b ',1) + if(idec.ge.0) candec(icand)=.true. + enddo + if(.not.q65b_called) then + freq=mousefqso + 0.001*mousedf + ikhz=mousefqso + f0=freq - (nkhz_center-48.0-1.27046) !### ??? ### + call timer('q65b ',0) + call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & + ntol,xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso, & + newdat,nagain,max_drift,nhsym,ndop00,idec) + call timer('q65b ',1) + endif + endif + + if(nwrite.eq.0 .and. nwrite_q65.eq.0) then + write(*,1012) mousefqso,nutc +1012 format('!',i3,9x,i6.4,' ') + endif + endif !nqd.eq.1 + + if(ndphi.eq.1 .and.iloop.lt.12) then + iloop=iloop+1 + go to 2 + endif + + if(ndphi.eq.1 .and.iloop.eq.12) call getdphi(qphi) + if(nqd.eq.1) then + call sec0(1,tdec) + write(*,1013) nsum,nsave,nstandalone,nhsym,tdec +1013 format('',3i4,i6,f6.2) + flush(6) + open(16,file='tquick.dat',status='unknown',access='append') + write(16,1016) nutc,tdec +1016 format(i4.4,f7.1) + close(16) + endif + call sec0(1,tsec0) + if(nhsym.eq.nhsym1 .and. tsec0.gt.3.0) go to 700 + if(nqd.eq.1 .and. nagain.eq.1) go to 900 + + if(nqd.eq.0 .and. bq65) then +! Do the wideband Q65 decode + do icand=1,ncand + if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here + if(candec(icand)) cycle !Skip if already decoded + freq=cand(icand)%f+nkhz_center-48.0-1.27046 +!###! If here at nqd=1, do only candidates at mousefqso +/- ntol +!### if(nqd.eq.1 .and. abs(freq-mousefqso).gt.0.001*ntol) cycle + ikhz=nint(freq) + f0=cand(icand)%f + call timer('q65b ',0) + call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,nhsym,ndop00,idec) + call timer('q65b ',1) + if(idec.ge.0) candec(icand)=.true. + enddo ! icand + endif + call sec0(1,tsec0) + + enddo ! nqd + +! Trim the list and produce a sorted index and sizes of groups. +! (Should trimlist remove all but best SNR for given UTC and message content?) +700 call trimlist(sig,km,ftol,indx,nsiz,nz) + done(1:km)=.false. + j=0 + ilatest=-1 + do n=1,nz + ifile0=0 + do m=1,nsiz(n) + i=indx(j+m) + ifile=sig(i,1) + if(ifile.gt.ifile0 .and.msg(i).ne.blank) then + ilatest=i + ifile0=ifile + endif + enddo + i=ilatest + + if(i.ge.1) then + if(.not.done(i)) then + done(i)=.true. + nutc=sig(i,2) + freq=sig(i,3) + sync1=sig(i,4) + dt=sig(i,5) + npol=nint(57.2957795*sig(i,6)) + flip=sig(i,7) + sync2=sig(i,8) + nkv=sig(i,9) + nqual=min(sig(i,10),10.0) +! rms0=sig(i,11) + do k=1,5 + a(k)=sig(i,12+k) + enddo + nhist=sig(i,18) + decoded=msg(i) + + if(flip.lt.0.0) then + do i=22,1,-1 + if(decoded(i:i).ne.' ') go to 10 + enddo + stop 'Error in message format' +10 if(i.le.18) decoded(i+2:i+4)='OOO' + endif + mhz=fcenter !... +fadd ??? + nkHz=nint(freq-foffset)-nfshift + f0=mhz+0.001*nkHz + ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) + ndf0=nint(a(1)) + ndf1=nint(a(2)) + ndf2=nint(a(3)) + nsync1=sync1 + + s2db=10.0*log10(sync2) - 40 !### empirical ### + nsync2=nint(s2db) + if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & + decoded(1:4).eq.'73 ') then + nsync2=nint(1.33*s2db + 2.0) + endif + + if(nxant.ne.0) then + npol=npol-45 + if(npol.lt.0) npol=npol+180 + endif + + call txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) + + cmode='#A' + if(mode65.eq.2) cmode='#B' + if(mode65.eq.4) cmode='#C' + write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & + nsync2,nutc,decoded,cp,cmode +1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) + ndecodes=ndecodes+1 + write(21,1100) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & + cmode(1:1),cmode(2:2) +1100 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) + endif + + endif + j=j+nsiz(n) + enddo !i=1,km + + write(26,1015) nutc +1015 format(37x,i6.4,' ') + call flush(21) + call flush(26) + call display(nkeep,ftol) + ndecdone=2 + +900 close(23) + call flush(12) + ndphi=0 + mcall3b=mcall3a + + return +end subroutine map65a diff --git a/q65w/libm65/mapsim.f90 b/q65w/libm65/mapsim.f90 new file mode 100644 index 000000000..e58485f6c --- /dev/null +++ b/q65w/libm65/mapsim.f90 @@ -0,0 +1,229 @@ +program mapsim + +! Generate simulated data for testing of MAP65 + + parameter (NMAX=60*96000) + real*4 d4(4,NMAX) !Floating-point data + integer*2 id4(4,NMAX) !i*2 data, dual polarization + integer*2 id2(2,NMAX) !i*2 data, single polarization + complex cwave(NMAX) !Generated complex waveform (no noise) + complex z,zx,zy + real*8 fcenter,fsample,samfac,f,dt,twopi,phi,dphi + logical bq65 + character msg0*22,message*22,msgsent*22,arg*8,fname*11,mode*2 + character*16 msg_list(60) + data msg_list/ & + 'W1AAA K2BBB EM00','W2CCC K3DDD EM01','W3EEE K4FFF EM02', & + 'W5GGG K6HHH EM03','W7III K8JJJ EM04','W9KKK K0LLL EM05', & + 'G0MMM F1NNN JN06','G2OOO F3PPP JN07','G4QQQ F5RRR JN08', & + 'G6SSS F7TTT JN09','W1XAA K2XBB EM10','W2XCC K3XDD EM11', & + 'W3XEE K4XFF EM12','W5XGG K6XHH EM13','W7XII K8XJJ EM14', & + 'W9XKK K0XLL EM15','G0XMM F1XNN JN16','G2XOO F3XPP JN17', & + 'G4XQQ F5XRR JN18','G6XSS F7XTT JN19','W1YAA K2YBB EM20', & + 'W2YCC K3YDD EM21','W3YEE K4YFF EM22','W5YGG K6YHH EM23', & + 'W7YII K8YJJ EM24','W9YKK K0YLL EM25','G0YMM F1YNN JN26', & + 'G2YOO F3YPP JN27','G4YQQ F5YRR JN28','G6YSS F7YTT JN29', & + 'W1ZAA K2ZBB EM30','W2ZCC K3ZDD EM31','W3ZEE K4ZFF EM32', & + 'W5ZGG K6ZHH EM33','W7ZII K8ZJJ EM34','W9ZKK K0ZLL EM35', & + 'G0ZMM F1ZNN JN36','G2ZOO F3ZPP JN37','G4ZQQ F5ZRR JN38', & + 'G6ZSS F7ZTT JN39','W1AXA K2BXB EM40','W2CXC K3DXD EM41', & + 'W3EXE K4FXF EM42','W5GXG K6HXH EM43','W7IXI K8JXJ EM44', & + 'W9KXK K0LXL EM45','G0MXM F1NXN JN46','G2OXO F3PXP JN47', & + 'G4QXQ F5RXR JN48','G6SXS F7TXT JN49','W1AYA K2BYB EM50', & + 'W2CYC K3DYD EM51','W3EYE K4FYF EM52','W5GYG K6HYH EM53', & + 'W7IYI K8JYJ EM54','W9KYK K0LYL EM55','G0MYM F1NYN JN56', & + 'G2OYO F3PYP JN57','G4QYQ F5RYR JN58','G6SYS F7TYT JN59'/ + + nargs=iargc() + if(nargs.ne.10) then + print*,'Usage: mapsim "message" mode DT fa fb nsigs pol fDop SNR nfiles' + print*,'Example: mapsim "CQ K1ABC FN42" B 2.5 -20 20 21 45 0.0 -20 1' + print*,' ' + print*,' mode = A B C for JT65; QA-QE for Q65-60A' + print*,' fa = lowest freq in kHz, relative to center' + print*,' fb = highest freq in kHz, relative to center' + print*,' message = "list" to use callsigns from list' + print*,' pol = -1 to generate a range of polarization angles.' + print*,' SNR = 0 to generate a range of SNRs.' + go to 999 + endif + + call getarg(1,msg0) + call getarg(2,mode) !JT65 sub-mode (A B C QA-QE) + call getarg(3,arg) + read(arg,*) dt0 !Time delay + call getarg(4,arg) + read(arg,*) fa !Lowest freq (kHz, relative to fcenter) + call getarg(5,arg) + read(arg,*) fb !Highest freq + call getarg(6,arg) + read(arg,*) nsigs !Number of signals in each file + call getarg(7,arg) + read(arg,*) npol !Polarization in degrees + pol=npol + call getarg(8,arg) + read(arg,*) fdop !Doppler spread + call getarg(9,arg) + read(arg,*) snrdb !S/N + call getarg(10,arg) + read(arg,*) nfiles !Number of files + + message=msg0 !Transmitted message + rmsdb=25. + rms=10.0**(0.05*rmsdb) + fcenter=144.125d0 !Center frequency (MHz) + fsample=96000.d0 !Sample rate (Hz) + dt=1.d0/fsample !Sample interval (s) + twopi=8.d0*atan(1.d0) + rad=360.0/twopi + samfac=1.d0 + bq65=(mode(1:1).eq.'Q') + ntone_spacing=1 + ntxfreq=1270 + fac=1.0/32767.0 + if(mode(1:1).eq.'B' .or. mode(2:2).eq.'B') ntone_spacing=2 + if(mode(1:1).eq.'C' .or. mode(2:2).eq.'C') ntone_spacing=4 + if(mode(2:2).eq.'D') ntone_spacing=8 + if(mode(2:2).eq.'E') ntone_spacing=16 + npts=NMAX + + write(*,1000) +1000 format('File N Mode DT freq pol fDop SNR Message'/68('-')) + + do ifile=1,nfiles + ilist=0 + nmin=ifile-1 + if(mode(2:2).eq.' ') nmin=2*nmin + write(fname,1002) nmin !Create the output filenames +1002 format('000000_',i4.4) + open(10,file=fname//'.iq',access='stream',status='unknown') + open(11,file=fname//'.tf2',access='stream',status='unknown') + + call noisegen(d4,npts) !Generate Gaussuian noise + + if(msg0(1:4).ne.'list') then + if(bq65) then + call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & + cwave,nwave) + else + call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & + cwave,nwave) + endif + endif + + if(fdop.gt.0.0) call dopspread(cwave,fdop) + + do isig=1,nsigs + + if(msg0(1:4).eq.'list') then + ilist=ilist+1 + message=msg_list(ilist) + if(bq65) then + call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & + cwave,nwave) + else + call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & + cwave,nwave) + endif + endif + + if(npol.lt.0) pol=(isig-1)*180.0/nsigs + a=cos(pol/rad) + b=sin(pol/rad) + f=1000.0*(fa+fb)/2.0 + if(nsigs.gt.1) f=1000.0*(fa + (isig-1)*(fb-fa)/(nsigs-1.0)) + dphi=twopi*f*dt + 0.5*twopi + + snrdbx=snrdb + if(snrdb.eq.0.0) snrdbx=-15.0 - 15.0*(isig-1.0)/nsigs + sig=sqrt(2.2*2500.0/96000.0) * 10.0**(0.05*snrdbx) + write(*,1020) ifile,isig,mode,dt0,0.001*f,nint(pol),fDop,snrdbx,msgsent +1020 format(i3,i3,2x,a2,f6.2,f8.3,i5,2f7.1,2x,a22) + + phi=0. +! i0=fsample*(3.5d0+0.05d0*(isig-1)) + i0=fsample*(1.d0 + dt0) + do i=1,nwave + phi=phi + dphi + if(phi.lt.-twopi) phi=phi+twopi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + z=sig*cwave(i)*cmplx(cos(xphi),-sin(xphi)) + zx=a*z + zy=b*z + j=i+i0 + d4(1,j)=d4(1,j) + real(zx) + d4(2,j)=d4(2,j) + aimag(zx) + d4(3,j)=d4(3,j) + real(zy) + d4(4,j)=d4(4,j) + aimag(zy) + enddo + enddo + + do i=1,npts + id4(1,i)=nint(rms*d4(1,i)) + id4(2,i)=nint(rms*d4(2,i)) + id4(3,i)=nint(rms*d4(3,i)) + id4(4,i)=nint(rms*d4(4,i)) + id2(1,i)=id4(1,i) + id2(2,i)=id4(2,i) + enddo + + write(10) fcenter,id2(1:2,1:npts) + write(11) fcenter,id4(1:4,1:npts) + close(10) + close(11) + enddo + +999 end program mapsim + +subroutine dopspread(cwave,fspread) + + parameter (NMAX=60*96000) + parameter (NFFT=NMAX,NH=NFFT/2) + complex cwave(NMAX) + complex cspread(0:NMAX-1) + + twopi=8.0*atan(1.0) + df=96000.0/nfft + cspread(0)=1.0 + cspread(NH)=0. + b=6.0 !Use truncated Lorenzian shape for fspread + do i=1,NH + f=i*df + x=b*f/fspread + z=0. + a=0. + if(x.lt.3.0) then !Cutoff beyond x=3 + a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian amplitude + phi1=twopi*rran() !Random phase + z=a*cmplx(cos(phi1),sin(phi1)) + endif + cspread(i)=z + z=0. + if(x.lt.3.0) then !Same thing for negative freqs + phi2=twopi*rran() + z=a*cmplx(cos(phi2),sin(phi2)) + endif + cspread(nfft-i)=z + enddo + + call four2a(cspread,nfft,1,1,1) !Transform to time domain + + sum=0. + do i=0,nfft-1 + p=real(cspread(i))**2 + aimag(cspread(i))**2 + sum=sum+p + enddo + avep=sum/nfft + fac=sqrt(1.0/avep) + cspread=fac*cspread !Normalize to constant avg power + cwave=cspread*cwave !Apply Rayleigh fading + +! do i=0,nfft-1 +! p=real(cspread(i))**2 + aimag(cspread(i))**2 +! write(14,3010) i,p,cspread(i) +!3010 format(i8,3f12.6) +! enddo + + return +end subroutine dopspread diff --git a/q65w/libm65/moon2.f90 b/q65w/libm65/moon2.f90 new file mode 100644 index 000000000..9fa72f1df --- /dev/null +++ b/q65w/libm65/moon2.f90 @@ -0,0 +1,163 @@ +subroutine moon2(y,m,Day,UT,lon,lat,RA,Dec,topRA,topDec,LST,HA,Az,El,dist) + + implicit none + + integer y !Year + integer m !Month + integer Day !Day + real*8 UT !UTC in hours + real*8 RA,Dec !RA and Dec of moon + +! NB: Double caps are single caps in the writeup. + + real*8 NN !Longitude of ascending node + real*8 i !Inclination to the ecliptic + real*8 w !Argument of perigee + real*8 a !Semi-major axis + real*8 e !Eccentricity + real*8 MM !Mean anomaly + + real*8 v !True anomaly + real*8 EE !Eccentric anomaly + real*8 ecl !Obliquity of the ecliptic + + real*8 d !Ephemeris time argument in days + real*8 r !Distance to sun, AU + real*8 xv,yv !x and y coords in ecliptic + real*8 lonecl,latecl !Ecliptic long and lat of moon + real*8 xg,yg,zg !Ecliptic rectangular coords + real*8 Ms !Mean anomaly of sun + real*8 ws !Argument of perihelion of sun + real*8 Ls !Mean longitude of sun (Ns=0) + real*8 Lm !Mean longitude of moon + real*8 DD !Mean elongation of moon + real*8 FF !Argument of latitude for moon + real*8 xe,ye,ze !Equatorial geocentric coords of moon + real*8 mpar !Parallax of moon (r_E / d) + real*8 lat,lon !Station coordinates on earth + real*8 gclat !Geocentric latitude + real*8 rho !Earth radius factor + real*8 GMST0,LST,HA + real*8 g + real*8 topRA,topDec !Topocentric coordinates of Moon + real*8 Az,El + real*8 dist + + real*8 rad,twopi,pi,pio2 + data rad/57.2957795131d0/,twopi/6.283185307d0/ + + d=367*y - 7*(y+(m+9)/12)/4 + 275*m/9 + Day - 730530 + UT/24.d0 + ecl = 23.4393d0 - 3.563d-7 * d + +! Orbital elements for Moon: + NN = 125.1228d0 - 0.0529538083d0 * d + i = 5.1454d0 + w = mod(318.0634d0 + 0.1643573223d0 * d + 360000.d0,360.d0) + a = 60.2666d0 + e = 0.054900d0 + MM = mod(115.3654d0 + 13.0649929509d0 * d + 360000.d0,360.d0) + + EE = MM + e*rad*sin(MM/rad) * (1.d0 + e*cos(MM/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.d0 - e*cos(EE/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.d0 - e*cos(EE/rad)) + + xv = a * (cos(EE/rad) - e) + yv = a * (sqrt(1.d0-e*e) * sin(EE/rad)) + + v = mod(rad*atan2(yv,xv)+720.d0,360.d0) + r = sqrt(xv*xv + yv*yv) + +! Get geocentric position in ecliptic rectangular coordinates: + + xg = r * (cos(NN/rad)*cos((v+w)/rad)-sin(NN/rad)*sin((v+w)/rad)*cos(i/rad)) + yg = r * (sin(NN/rad)*cos((v+w)/rad)+cos(NN/rad)*sin((v+w)/rad)*cos(i/rad)) + zg = r * (sin((v+w)/rad)*sin(i/rad)) + +! Ecliptic longitude and latitude of moon: + lonecl = mod(rad*atan2(yg/rad,xg/rad)+720.d0,360.d0) + latecl = rad*atan2(zg/rad,sqrt(xg*xg + yg*yg)/rad) + +! Now include orbital perturbations: + Ms = mod(356.0470d0 + 0.9856002585d0 * d + 3600000.d0,360.d0) + ws = 282.9404d0 + 4.70935d-5*d + Ls = mod(Ms + ws + 720.d0,360.d0) + Lm = mod(MM + w + NN+720.d0,360.d0) + DD = mod(Lm - Ls + 360.d0,360.d0) + FF = mod(Lm - NN + 360.d0,360.d0) + + lonecl = lonecl & + - 1.274d0 * sin((MM-2.d0*DD)/rad) & + + 0.658d0 * sin(2.d0*DD/rad) & + - 0.186d0 * sin(Ms/rad) & + - 0.059d0 * sin((2.d0*MM-2.d0*DD)/rad) & + - 0.057d0 * sin((MM-2.d0*DD+Ms)/rad) & + + 0.053d0 * sin((MM+2.d0*DD)/rad) & + + 0.046d0 * sin((2.d0*DD-Ms)/rad) & + + 0.041d0 * sin((MM-Ms)/rad) & + - 0.035d0 * sin(DD/rad) & + - 0.031d0 * sin((MM+Ms)/rad) & + - 0.015d0 * sin((2.d0*FF-2.d0*DD)/rad) & + + 0.011d0 * sin((MM-4.d0*DD)/rad) + + latecl = latecl & + - 0.173d0 * sin((FF-2.d0*DD)/rad) & + - 0.055d0 * sin((MM-FF-2.d0*DD)/rad) & + - 0.046d0 * sin((MM+FF-2.d0*DD)/rad) & + + 0.033d0 * sin((FF+2.d0*DD)/rad) & + + 0.017d0 * sin((2.d0*MM+FF)/rad) + + r = 60.36298d0 & + - 3.27746d0*cos(MM/rad) & + - 0.57994d0*cos((MM-2.d0*DD)/rad) & + - 0.46357d0*cos(2.d0*DD/rad) & + - 0.08904d0*cos(2.d0*MM/rad) & + + 0.03865d0*cos((2.d0*MM-2.d0*DD)/rad) & + - 0.03237d0*cos((2.d0*DD-Ms)/rad) & + - 0.02688d0*cos((MM+2.d0*DD)/rad) & + - 0.02358d0*cos((MM-2.d0*DD+Ms)/rad) & + - 0.02030d0*cos((MM-Ms)/rad) & + + 0.01719d0*cos(DD/rad) & + + 0.01671d0*cos((MM+Ms)/rad) + + dist=r*6378.140d0 + +! Geocentric coordinates: +! Rectangular ecliptic coordinates of the moon: + + xg = r * cos(lonecl/rad)*cos(latecl/rad) + yg = r * sin(lonecl/rad)*cos(latecl/rad) + zg = r * sin(latecl/rad) + +! Rectangular equatorial coordinates of the moon: + xe = xg + ye = yg*cos(ecl/rad) - zg*sin(ecl/rad) + ze = yg*sin(ecl/rad) + zg*cos(ecl/rad) + +! Right Ascension, Declination: + RA = mod(rad*atan2(ye,xe)+360.d0,360.d0) + Dec = rad*atan2(ze,sqrt(xe*xe + ye*ye)) + +! Now convert to topocentric system: + mpar=rad*asin(1.d0/r) +! alt_topoc = alt_geoc - mpar*cos(alt_geoc) + gclat = lat - 0.1924d0*sin(2.d0*lat/rad) + rho = 0.99883d0 + 0.00167d0*cos(2.d0*lat/rad) + GMST0 = (Ls + 180.d0)/15.d0 + LST = mod(GMST0+UT+lon/15.d0+48.d0,24.d0) !LST in hours + HA = 15.d0*LST - RA !HA in degrees + g = rad*atan(tan(gclat/rad)/cos(HA/rad)) + topRA = RA - mpar*rho*cos(gclat/rad)*sin(HA/rad)/cos(Dec/rad) + topDec = Dec - mpar*rho*sin(gclat/rad)*sin((g-Dec)/rad)/sin(g/rad) + + HA = 15.d0*LST - topRA !HA in degrees + if(HA.gt.180.d0) HA=HA-360.d0 + if(HA.lt.-180.d0) HA=HA+360.d0 + + pi=0.5d0*twopi + pio2=0.5d0*pi + call dcoord(pi,pio2-lat/rad,0.d0,lat/rad,ha*twopi/360,topDec/rad,az,el) + Az=az*rad + El=El*rad + + return +end subroutine moon2 diff --git a/q65w/libm65/moondop.f90 b/q65w/libm65/moondop.f90 new file mode 100644 index 000000000..096c3128e --- /dev/null +++ b/q65w/libm65/moondop.f90 @@ -0,0 +1,72 @@ +subroutine MoonDop(nyear,month,nday,uth4,lon4,lat4,RAMoon4,DecMoon4, & + LST4,HA4,AzMoon4,ElMoon4,vr4,dist4) + + implicit real*8 (a-h,o-z) + real*4 uth4 !UT in hours + real*4 lon4 !West longitude, degrees + real*4 lat4 !Latitude, degrees + real*4 RAMoon4 !Topocentric RA of moon, hours + real*4 DecMoon4 !Topocentric Dec of Moon, degrees + real*4 LST4 !Locat sidereal time, hours + real*4 HA4 !Local Hour angle, degrees + real*4 AzMoon4 !Topocentric Azimuth of moon, degrees + real*4 ElMoon4 !Topocentric Elevation of moon, degrees + real*4 vr4 !Radial velocity of moon wrt obs, km/s + real*4 dist4 !Echo time, seconds + + real*8 LST + real*8 RME(6) !Vector from Earth center to Moon + real*8 RAE(6) !Vector from Earth center to Obs + real*8 RMA(6) !Vector from Obs to Moon + real*8 rme0(6) + logical km + + data rad/57.2957795130823d0/,twopi/6.28310530717959d0/ + + km=.true. + dlat=lat4/rad + dlong1=lon4/rad + elev1=200.d0 + call geocentric(dlat,elev1,dlat1,erad1) + + dt=100.d0 !For numerical derivative, in seconds + UT=uth4 + +! NB: geodetic latitude used here, but geocentric latitude used when +! determining Earth-rotation contribution to Doppler. + + call moon2(nyear,month,nDay,UT-dt/3600.d0,dlong1*rad,dlat*rad, & + RA,Dec,topRA,topDec,LST,HA,Az0,El0,dist) + call toxyz(RA/rad,Dec/rad,dist,rme0) !Convert to rectangular coords + + call moon2(nyear,month,nDay,UT,dlong1*rad,dlat*rad, & + RA,Dec,topRA,topDec,LST,HA,Az,El,dist) + call toxyz(RA/rad,Dec/rad,dist,rme) !Convert to rectangular coords + + phi=LST*twopi/24.d0 + call toxyz(phi,dlat1,erad1,rae) !Gencentric numbers used here! + radps=twopi/(86400.d0/1.002737909d0) + rae(4)=-rae(2)*radps !Vel of Obs wrt Earth center + rae(5)=rae(1)*radps + rae(6)=0.d0 + + do i=1,3 + rme(i+3)=(rme(i)-rme0(i))/dt + rma(i)=rme(i)-rae(i) + rma(i+3)=rme(i+3)-rae(i+3) + enddo + + call fromxyz(rma,alpha1,delta1,dtopo0) !Get topocentric coords + vr=dot(rma(4),rma)/dtopo0 + + RAMoon4=topRA + DecMoon4=topDec + LST4=LST + HA4=HA + AzMoon4=Az + ElMoon4=El + vr4=vr + dist4=dist + + return +end subroutine MoonDop diff --git a/q65w/libm65/msgs.txt b/q65w/libm65/msgs.txt new file mode 100644 index 000000000..cb0630423 --- /dev/null +++ b/q65w/libm65/msgs.txt @@ -0,0 +1,60 @@ +W1AAA K2BBB EM00 +W2CCC K3DDD EM01 +W3EEE K4FFF EM02 +W5GGG K6HHH EM03 +W7III K8JJJ EM04 +W9KKK K0LLL EM05 +G0MMM F1NNN JN06 +G2OOO F3PPP JN07 +G4QQQ F5RRR JN08 +G6SSS F7TTT JN09 +W1XAA K2XBB EM10 +W2XCC K3XDD EM11 +W3XEE K4XFF EM12 +W5XGG K6XHH EM13 +W7XII K8XJJ EM14 +W9XKK K0XLL EM15 +G0XMM F1XNN JN16 +G2XOO F3XPP JN17 +G4XQQ F5XRR JN18 +G6XSS F7XTT JN19 +W1YAA K2YBB EM20 +W2YCC K3YDD EM21 +W3YEE K4YFF EM22 +W5YGG K6YHH EM23 +W7YII K8YJJ EM24 +W9YKK K0YLL EM25 +G0YMM F1YNN JN26 +G2YOO F3YPP JN27 +G4YQQ F5YRR JN28 +G6YSS F7YTT JN29 +W1ZAA K2ZBB EM30 +W2ZCC K3ZDD EM31 +W3ZEE K4ZFF EM32 +W5ZGG K6ZHH EM33 +W7ZII K8ZJJ EM34 +W9ZKK K0ZLL EM35 +G0ZMM F1ZNN JN36 +G2ZOO F3ZPP JN37 +G4ZQQ F5ZRR JN38 +G6ZSS F7ZTT JN39 +W1AXA K2BXB EM40 +W2CXC K3DXD EM41 +W3EXE K4FXF EM42 +W5GXG K6HXH EM43 +W7IXI K8JXJ EM44 +W9KXK K0LXL EM45 +G0MXM F1NXN JN46 +G2OXO F3PXP JN47 +G4QXQ F5RXR JN48 +G6SXS F7TXT JN49 +W1AYA K2BYB EM50 +W2CYC K3DYD EM51 +W3EYE K4FYF EM52 +W5GYG K6HYH EM53 +W7IYI K8JYJ EM54 +W9KYK K0LYL EM55 +G0MYM F1NYN JN56 +G2OYO F3PYP JN57 +G4QYQ F5RYR JN58 +G6SYS F7TYT JN59 diff --git a/q65w/libm65/nchar.f90 b/q65w/libm65/nchar.f90 new file mode 100644 index 000000000..21593bd13 --- /dev/null +++ b/q65w/libm65/nchar.f90 @@ -0,0 +1,23 @@ +function nchar(c) + +! Convert ascii number, letter, or space to 0-36 for callsign packing. + + character c*1 + + n=0 !Silence compiler warning + if(c.ge.'0' .and. c.le.'9') then + n=ichar(c)-ichar('0') + else if(c.ge.'A' .and. c.le.'Z') then + n=ichar(c)-ichar('A') + 10 + else if(c.ge.'a' .and. c.le.'z') then + n=ichar(c)-ichar('a') + 10 + else if(c.ge.' ') then + n=36 + else + Print*,'Invalid character in callsign ',c,' ',ichar(c) + call exit(1) + endif + nchar=n + + return +end function nchar diff --git a/q65w/libm65/njunk.f90 b/q65w/libm65/njunk.f90 new file mode 100644 index 000000000..319fb5ab7 --- /dev/null +++ b/q65w/libm65/njunk.f90 @@ -0,0 +1 @@ + parameter(NJUNK=40) diff --git a/q65w/libm65/noisegen.f90 b/q65w/libm65/noisegen.f90 new file mode 100644 index 000000000..65d943161 --- /dev/null +++ b/q65w/libm65/noisegen.f90 @@ -0,0 +1,13 @@ +subroutine noisegen(d4,nmax) + + real*4 d4(4,nmax) + + do i=1,nmax + d4(1,i)=gran() + d4(2,i)=gran() + d4(3,i)=gran() + d4(4,i)=gran() + enddo + + return +end subroutine noisegen diff --git a/q65w/libm65/packjt.f90 b/q65w/libm65/packjt.f90 new file mode 100644 index 000000000..c1fc0089d --- /dev/null +++ b/q65w/libm65/packjt.f90 @@ -0,0 +1,996 @@ +module packjt + + contains + +subroutine packbits(dbits,nsymd,m0,sym) + + ! Pack 0s and 1s from dbits() into sym() with m0 bits per word. + ! NB: nsymd is the number of packed output words. + + integer sym(:) + integer*1 dbits(:) + + k=0 + do i=1,nsymd + n=0 + do j=1,m0 + k=k+1 + m=dbits(k) + n=ior(ishft(n,1),m) + enddo + sym(i)=n + enddo + + return + end subroutine packbits + + subroutine unpackbits(sym,nsymd,m0,dbits) + + ! Unpack bits from sym() into dbits(), one bit per byte. + ! NB: nsymd is the number of input words, and m0 their length. + ! there will be m0*nsymd output bytes, each 0 or 1. + + integer sym(:) + integer*1 dbits(:) + + k=0 + do i=1,nsymd + mask=ishft(1,m0-1) + do j=1,m0 + k=k+1 + dbits(k)=0 + if(iand(mask,sym(i)).ne.0) dbits(k)=1 + mask=ishft(mask,-1) + enddo + enddo + + return + end subroutine unpackbits + + subroutine packcall(callsign,ncall,text) + + ! Pack a valid callsign into a 28-bit integer. + + parameter (NBASE=37*36*10*27*27*27) + character callsign*6,c*1,tmp*6 + logical text + + text=.false. + + ! Work-around for Swaziland prefix: + if(callsign(1:4).eq.'3DA0') callsign='3D0'//callsign(5:6) + + if(callsign(1:3).eq.'CQ ') then + ncall=NBASE + 1 + if(callsign(4:4).ge.'0' .and. callsign(4:4).le.'9' .and. & + callsign(5:5).ge.'0' .and. callsign(5:5).le.'9' .and. & + callsign(6:6).ge.'0' .and. callsign(6:6).le.'9') then + read(callsign(4:6),*) nfreq + ncall=NBASE + 3 + nfreq + endif + return + else if(callsign(1:4).eq.'QRZ ') then + ncall=NBASE + 2 + return + else if(callsign(1:3).eq.'DE ') then + ncall=267796945 + return + endif + + tmp=' ' + if(callsign(3:3).ge.'0' .and. callsign(3:3).le.'9') then + tmp=callsign + else if(callsign(2:2).ge.'0' .and. callsign(2:2).le.'9') then + if(callsign(6:6).ne.' ') then + text=.true. + return + endif + tmp=' '//callsign(:5) + else + text=.true. + return + endif + + do i=1,6 + c=tmp(i:i) + if(c.ge.'a' .and. c.le.'z') & + tmp(i:i)=char(ichar(c)-ichar('a')+ichar('A')) + enddo + + n1=0 + if((tmp(1:1).ge.'A'.and.tmp(1:1).le.'Z').or.tmp(1:1).eq.' ') n1=1 + if(tmp(1:1).ge.'0' .and. tmp(1:1).le.'9') n1=1 + n2=0 + if(tmp(2:2).ge.'A' .and. tmp(2:2).le.'Z') n2=1 + if(tmp(2:2).ge.'0' .and. tmp(2:2).le.'9') n2=1 + n3=0 + if(tmp(3:3).ge.'0' .and. tmp(3:3).le.'9') n3=1 + n4=0 + if((tmp(4:4).ge.'A'.and.tmp(4:4).le.'Z').or.tmp(4:4).eq.' ') n4=1 + n5=0 + if((tmp(5:5).ge.'A'.and.tmp(5:5).le.'Z').or.tmp(5:5).eq.' ') n5=1 + n6=0 + if((tmp(6:6).ge.'A'.and.tmp(6:6).le.'Z').or.tmp(6:6).eq.' ') n6=1 + + if(n1+n2+n3+n4+n5+n6 .ne. 6) then + text=.true. + return + endif + + ncall=nchar(tmp(1:1)) + ncall=36*ncall+nchar(tmp(2:2)) + ncall=10*ncall+nchar(tmp(3:3)) + ncall=27*ncall+nchar(tmp(4:4))-10 + ncall=27*ncall+nchar(tmp(5:5))-10 + ncall=27*ncall+nchar(tmp(6:6))-10 + + return + end subroutine packcall + + subroutine unpackcall(ncall,word,iv2,psfx) + + parameter (NBASE=37*36*10*27*27*27) + character word*12,c*37,psfx*4 + + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '/ + + word='......' + psfx=' ' + n=ncall + iv2=0 + if(n.ge.262177560) go to 20 + word='......' + ! if(n.ge.262177560) go to 999 !Plain text message ... + i=mod(n,27)+11 + word(6:6)=c(i:i) + n=n/27 + i=mod(n,27)+11 + word(5:5)=c(i:i) + n=n/27 + i=mod(n,27)+11 + word(4:4)=c(i:i) + n=n/27 + i=mod(n,10)+1 + word(3:3)=c(i:i) + n=n/10 + i=mod(n,36)+1 + word(2:2)=c(i:i) + n=n/36 + i=n+1 + word(1:1)=c(i:i) + do i=1,4 + if(word(i:i).ne.' ') go to 10 + enddo + go to 999 + 10 word=word(i:) + go to 999 + + 20 if(n.ge.267796946) go to 999 + + ! We have a JT65v2 message + if((n.ge.262178563) .and. (n.le.264002071)) then + ! CQ with prefix + iv2=1 + n=n-262178563 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.264002072) .and. (n.le.265825580)) then + ! QRZ with prefix + iv2=2 + n=n-264002072 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.265825581) .and. (n.le.267649089)) then + ! DE with prefix + iv2=3 + n=n-265825581 + i=mod(n,37)+1 + psfx(4:4)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267649090) .and. (n.le.267698374)) then + ! CQ with suffix + iv2=4 + n=n-267649090 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267698375) .and. (n.le.267747659)) then + ! QRZ with suffix + iv2=5 + n=n-267698375 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if((n.ge.267747660) .and. (n.le.267796944)) then + ! DE with suffix + iv2=6 + n=n-267747660 + i=mod(n,37)+1 + psfx(3:3)=c(i:i) + n=n/37 + i=mod(n,37)+1 + psfx(2:2)=c(i:i) + n=n/37 + i=n+1 + psfx(1:1)=c(i:i) + + else if(n.eq.267796945) then + ! DE with no prefix or suffix + iv2=7 + psfx = ' ' + endif + + 999 if(word(1:3).eq.'3D0') word='3DA0'//word(4:) + + return + end subroutine unpackcall + + subroutine packgrid(grid,ng,text) + + parameter (NGBASE=180*180) + character*4 grid + character*1 c1 + logical text + + text=.false. + if(grid.eq.' ') go to 90 !Blank grid is OK + + ! First, handle signal reports in the original range, -01 to -30 dB + if(grid(1:1).eq.'-') then + read(grid(2:3),*,err=800,end=800) n + if(n.ge.1 .and. n.le.30) then + ng=NGBASE+1+n + go to 900 + endif + go to 10 + else if(grid(1:2).eq.'R-') then + read(grid(3:4),*,err=800,end=800) n + if(n.ge.1 .and. n.le.30) then + ng=NGBASE+31+n + go to 900 + endif + go to 10 + ! Now check for RO, RRR, or 73 in the message field normally used for grid + else if(grid(1:4).eq.'RO ') then + ng=NGBASE+62 + go to 900 + else if(grid(1:4).eq.'RRR ') then + ng=NGBASE+63 + go to 900 + else if(grid(1:4).eq.'73 ') then + ng=NGBASE+64 + go to 900 + endif + + ! Now check for extended-range signal reports: -50 to -31, and 0 to +49. + 10 n=99 + c1=grid(1:1) + read(grid,*,err=20,end=20) n + go to 30 + 20 read(grid(2:4),*,err=30,end=30) n + 30 if(n.ge.-50 .and. n.le.49) then + if(c1.eq.'R') then + write(grid,1002) n+50 + 1002 format('LA',i2.2) + else + write(grid,1003) n+50 + 1003 format('KA',i2.2) + endif + go to 40 + endif + + ! Maybe it's free text ? + if(grid(1:1).lt.'A' .or. grid(1:1).gt.'R') text=.true. + if(grid(2:2).lt.'A' .or. grid(2:2).gt.'R') text=.true. + if(grid(3:3).lt.'0' .or. grid(3:3).gt.'9') text=.true. + if(grid(4:4).lt.'0' .or. grid(4:4).gt.'9') text=.true. + if(text) go to 900 + + ! OK, we have a properly formatted grid locator + 40 call grid2deg(grid//'mm',dlong,dlat) + long=int(dlong) + lat=int(dlat+ 90.0) + ng=((long+180)/2)*180 + lat + go to 900 + + 90 ng=NGBASE + 1 + go to 900 + + 800 text=.true. + 900 continue + + return + end subroutine packgrid + + subroutine unpackgrid(ng,grid) + + parameter (NGBASE=180*180) + character grid*4,grid6*6 + + grid=' ' + if(ng.ge.32400) go to 10 + dlat=mod(ng,180)-90 + dlong=(ng/180)*2 - 180 + 2 + call deg2grid(dlong,dlat,grid6) + grid=grid6(:4) + if(grid(1:2).eq.'KA') then + read(grid(3:4),*) n + n=n-50 + write(grid,1001) n + 1001 format(i3.2) + if(grid(1:1).eq.' ') grid(1:1)='+' + else if(grid(1:2).eq.'LA') then + read(grid(3:4),*) n + n=n-50 + write(grid,1002) n + 1002 format('R',i3.2) + if(grid(2:2).eq.' ') grid(2:2)='+' + endif + go to 900 + + 10 n=ng-NGBASE-1 + if(n.ge.1 .and.n.le.30) then + write(grid,1012) -n + 1012 format(i3.2) + else if(n.ge.31 .and.n.le.60) then + n=n-30 + write(grid,1022) -n + 1022 format('R',i3.2) + else if(n.eq.61) then + grid='RO' + else if(n.eq.62) then + grid='RRR' + else if(n.eq.63) then + grid='73' + endif + + 900 return + end subroutine unpackgrid + + subroutine packmsg(msg0,dat,itype) + + ! Packs a JT4/JT9/JT65 message into twelve 6-bit symbols + + ! itype Message Type + !-------------------- + ! 1 Standardd message + ! 2 Type 1 prefix + ! 3 Type 1 suffix + ! 4 Type 2 prefix + ! 5 Type 2 suffix + ! 6 Free text + ! -1 Does not decode correctly + + parameter (NBASE=37*36*10*27*27*27) + parameter (NBASE2=262178562) + character*22 msg0,msg + integer dat(:) + character*12 c1,c2 + character*4 c3 + character*6 grid6 + logical text1,text2,text3 + + msg=msg0 + itype=1 + call fmtmsg(msg,iz) + + if(msg(1:6).eq.'CQ DX ') msg(3:3)='9' + if(msg(1:3).eq."CQ " .and. & + msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & + msg(5:5).ge.'A' .and. msg(5:5).le.'Z' .and. & + msg(6:6).eq.' ') msg='E9'//msg(4:) + + ! See if it's a CQ message + if(msg(1:3).eq.'CQ ') then + i=3 + ! ... and if so, does it have a reply frequency? + if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and. & + msg(5:5).ge.'0' .and. msg(5:5).le.'9' .and. & + msg(6:6).ge.'0' .and. msg(6:6).le.'9') i=7 + go to 1 + endif + + do i=1,22 + if(msg(i:i).eq.' ') go to 1 !Get 1st blank + enddo + go to 10 !Consider msg as plain text + + 1 ia=i + c1=msg(1:ia-1) + do i=ia+1,22 + if(msg(i:i).eq.' ') go to 2 !Get 2nd blank + enddo + go to 10 !Consider msg as plain text + + 2 ib=i + c2=msg(ia+1:ib-1) + + do i=ib+1,22 + if(msg(i:i).eq.' ') go to 3 !Get 3rd blank + enddo + go to 10 !Consider msg as plain text + + 3 ic=i + c3=' ' + if(ic.ge.ib+1) c3=msg(ib+1:ic) + if(c3.eq.'OOO ') c3=' ' !Strip out the OOO flag + call getpfx1(c1,k1,nv2a) + if(nv2a.ge.4) go to 10 + call packcall(c1,nc1,text1) + if(text1) go to 10 + call getpfx1(c2,k2,nv2b) + call packcall(c2,nc2,text2) + if(text2) go to 10 + if(nv2a.eq.2 .or. nv2a.eq.3 .or. nv2b.eq.2 .or. nv2b.eq.3) then + if(k1.lt.0 .or. k2.lt.0 .or. k1*k2.ne.0) go to 10 + if(k2.gt.0) k2=k2+450 + k=max(k1,k2) + if(k.gt.0) then + call k2grid(k,grid6) + c3=grid6(:4) + endif + endif + call packgrid(c3,ng,text3) + + if(nv2a.lt.4 .and. nv2b.lt.4 .and. (.not.text1) .and. (.not.text2) .and. & + (.not.text3)) go to 20 + + nc1=0 + if(nv2b.eq.4) then + if(c1(1:3).eq.'CQ ') nc1=262178563 + k2 + if(c1(1:4).eq.'QRZ ') nc1=264002072 + k2 + if(c1(1:3).eq.'DE ') nc1=265825581 + k2 + else if(nv2b.eq.5) then + if(c1(1:3).eq.'CQ ') nc1=267649090 + k2 + if(c1(1:4).eq.'QRZ ') nc1=267698375 + k2 + if(c1(1:3).eq.'DE ') nc1=267747660 + k2 + endif + if(nc1.ne.0) go to 20 + + ! The message will be treated as plain text. + 10 itype=6 + call packtext(msg,nc1,nc2,ng) + ng=ng+32768 + + ! Encode data into 6-bit words + 20 continue + if(itype.ne.6) itype=max(nv2a,nv2b) + dat(1)=iand(ishft(nc1,-22),63) !6 bits + dat(2)=iand(ishft(nc1,-16),63) !6 bits + dat(3)=iand(ishft(nc1,-10),63) !6 bits + dat(4)=iand(ishft(nc1, -4),63) !6 bits + dat(5)=4*iand(nc1,15)+iand(ishft(nc2,-26),3) !4+2 bits + dat(6)=iand(ishft(nc2,-20),63) !6 bits + dat(7)=iand(ishft(nc2,-14),63) !6 bits + dat(8)=iand(ishft(nc2, -8),63) !6 bits + dat(9)=iand(ishft(nc2, -2),63) !6 bits + dat(10)=16*iand(nc2,3)+iand(ishft(ng,-12),15) !2+4 bits + dat(11)=iand(ishft(ng,-6),63) + dat(12)=iand(ng,63) + + return + end subroutine packmsg + + subroutine unpackmsg(dat,msg) + + parameter (NBASE=37*36*10*27*27*27) + parameter (NGBASE=180*180) + integer dat(:) + character c1*12,c2*12,grid*4,msg*22,grid6*6,psfx*4,junk2*4 + logical cqnnn + + cqnnn=.false. + nc1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+ & + ishft(dat(4),4) + iand(ishft(dat(5),-2),15) + + nc2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) + & + ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) + & + iand(ishft(dat(10),-4),3) + + ng=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12) + + if(ng.ge.32768) then + call unpacktext(nc1,nc2,ng,msg) + go to 100 + endif + + call unpackcall(nc1,c1,iv2,psfx) + if(iv2.eq.0) then + ! This is an "original JT65" message + if(nc1.eq.NBASE+1) c1='CQ ' + if(nc1.eq.NBASE+2) c1='QRZ ' + nfreq=nc1-NBASE-3 + if(nfreq.ge.0 .and. nfreq.le.999) then + write(c1,1002) nfreq + 1002 format('CQ ',i3.3) + cqnnn=.true. + endif + endif + + call unpackcall(nc2,c2,junk1,junk2) + call unpackgrid(ng,grid) + + if(iv2.gt.0) then + ! This is a JT65v2 message + do i=1,4 + if(ichar(psfx(i:i)).eq.0) psfx(i:i)=' ' + enddo + + n1=len_trim(psfx) + n2=len_trim(c2) + if(iv2.eq.1) msg='CQ '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.2) msg='QRZ '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.3) msg='DE '//psfx(:n1)//'/'//c2(:n2)//' '//grid + if(iv2.eq.4) msg='CQ '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.5) msg='QRZ '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.6) msg='DE '//c2(:n2)//'/'//psfx(:n1)//' '//grid + if(iv2.eq.7) msg='DE '//c2(:n2)//' '//grid + if(iv2.eq.8) msg=' ' + go to 100 + else + + endif + + grid6=grid//'ma' + call grid2k(grid6,k) + if(k.ge.1 .and. k.le.450) call getpfx2(k,c1) + if(k.ge.451 .and. k.le.900) call getpfx2(k,c2) + + i=index(c1,char(0)) + if(i.ge.3) c1=c1(1:i-1)//' ' + i=index(c2,char(0)) + if(i.ge.3) c2=c2(1:i-1)//' ' + + msg=' ' + j=0 + if(cqnnn) then + msg=c1//' ' + j=7 !### ??? ### + go to 10 + endif + + do i=1,12 + j=j+1 + msg(j:j)=c1(i:i) + if(c1(i:i).eq.' ') go to 10 + enddo + j=j+1 + msg(j:j)=' ' + + 10 do i=1,12 + if(j.le.21) j=j+1 + msg(j:j)=c2(i:i) + if(c2(i:i).eq.' ') go to 20 + enddo + if(j.le.21) j=j+1 + msg(j:j)=' ' + + 20 if(k.eq.0) then + do i=1,4 + if(j.le.21) j=j+1 + msg(j:j)=grid(i:i) + enddo + if(j.le.21) j=j+1 + msg(j:j)=' ' + endif + + 100 continue + if(msg(1:6).eq.'CQ9DX ') msg(3:3)=' ' + if(msg(1:2).eq.'E9' .and. & + msg(3:3).ge.'A' .and. msg(3:3).le.'Z' .and. & + msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & + msg(5:5).eq.' ') msg='CQ '//msg(3:) + + return + end subroutine unpackmsg + + subroutine packtext(msg,nc1,nc2,nc3) + + parameter (MASK28=2**28 - 1) + character*13 msg + character*42 c + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ + + nc1=0 + nc2=0 + nc3=0 + + do i=1,5 !First 5 characters in nc1 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 10 + enddo + j=37 + 10 j=j-1 !Codes should start at zero + nc1=42*nc1 + j + enddo + + do i=6,10 !Characters 6-10 in nc2 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 20 + enddo + j=37 + 20 j=j-1 !Codes should start at zero + nc2=42*nc2 + j + enddo + + do i=11,13 !Characters 11-13 in nc3 + do j=1,42 !Get character code + if(msg(i:i).eq.c(j:j)) go to 30 + enddo + j=37 + 30 j=j-1 !Codes should start at zero + nc3=42*nc3 + j + enddo + + ! We now have used 17 bits in nc3. Must move one each to nc1 and nc2. + nc1=nc1+nc1 + if(iand(nc3,32768).ne.0) nc1=nc1+1 + nc2=nc2+nc2 + if(iand(nc3,65536).ne.0) nc2=nc2+1 + nc3=iand(nc3,32767) + + return + end subroutine packtext + + subroutine unpacktext(nc1,nc2,nc3,msg) + + character*22 msg + character*44 c + data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ + + nc3=iand(nc3,32767) !Remove the "plain text" bit + if(iand(nc1,1).ne.0) nc3=nc3+32768 + nc1=nc1/2 + if(iand(nc2,1).ne.0) nc3=nc3+65536 + nc2=nc2/2 + + do i=5,1,-1 + j=mod(nc1,42)+1 + msg(i:i)=c(j:j) + nc1=nc1/42 + enddo + + do i=10,6,-1 + j=mod(nc2,42)+1 + msg(i:i)=c(j:j) + nc2=nc2/42 + enddo + + do i=13,11,-1 + j=mod(nc3,42)+1 + msg(i:i)=c(j:j) + nc3=nc3/42 + enddo + msg(14:22) = ' ' + + return + end subroutine unpacktext + + subroutine getpfx1(callsign,k,nv2) + + character*12 callsign0,callsign,lof,rof + character*8 c + character addpfx*8,tpfx*4,tsfx*3 + logical ispfx,issfx,invalid + common/pfxcom/addpfx + include 'pfx.f90' + + callsign0=callsign + nv2=1 + iz=index(callsign,' ') - 1 + if(iz.lt.0) iz=12 + islash=index(callsign(1:iz),'/') + k=0 + ! if(k.eq.0) go to 10 !Tnx to DL9RDZ for reminder:this was for tests only! + c=' ' + if(islash.gt.0 .and. islash.le.(iz-4)) then + ! Add-on prefix + c=callsign(1:islash-1) + callsign=callsign(islash+1:iz) + do i=1,NZ + if(pfx(i)(1:4).eq.c) then + k=i + nv2=2 + go to 10 + endif + enddo + if(addpfx.eq.c) then + k=449 + nv2=2 + go to 10 + endif + + else if(islash.eq.(iz-1)) then + ! Add-on suffix + c=callsign(islash+1:iz) + callsign=callsign(1:islash-1) + do i=1,NZ2 + if(sfx(i).eq.c(1:1)) then + k=400+i + nv2=3 + go to 10 + endif + enddo + endif + + 10 if(islash.ne.0 .and.k.eq.0) then + ! Original JT65 would force this compound callsign to be treated as + ! plain text. In JT65v2, we will encode the prefix or suffix into nc1. + ! The task here is to compute the proper value of k. + lof=callsign0(:islash-1) + rof=callsign0(islash+1:) + llof=len_trim(lof) + lrof=len_trim(rof) + ispfx=(llof.gt.0 .and. llof.le.4) + issfx=(lrof.gt.0 .and. lrof.le.3) + invalid=.not.(ispfx.or.issfx) + if(ispfx.and.issfx) then + if(llof.lt.3) issfx=.false. + if(lrof.lt.3) ispfx=.false. + if(ispfx.and.issfx) then + i=ichar(callsign0(islash-1:islash-1)) + if(i.ge.ichar('0') .and. i.le.ichar('9')) then + issfx=.false. + else + ispfx=.false. + endif + endif + endif + + if(invalid) then + k=-1 + else + if(ispfx) then + tpfx=lof(1:4) + k=nchar(tpfx(1:1)) + k=37*k + nchar(tpfx(2:2)) + k=37*k + nchar(tpfx(3:3)) + k=37*k + nchar(tpfx(4:4)) + nv2=4 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + callsign=callsign0(i+1:) + endif + if(issfx) then + tsfx=rof(1:3) + k=nchar(tsfx(1:1)) + k=37*k + nchar(tsfx(2:2)) + k=37*k + nchar(tsfx(3:3)) + nv2=5 + i=index(callsign0,'/') + callsign=callsign0(:i-1) + endif + endif + endif + + return + end subroutine getpfx1 + + subroutine getpfx2(k0,callsign) + + character callsign*12 + include 'pfx.f90' + character addpfx*8 + common/pfxcom/addpfx + + k=k0 + if(k.gt.450) k=k-450 + if(k.ge.1 .and. k.le.NZ) then + iz=index(pfx(k),' ') - 1 + callsign=pfx(k)(1:iz)//'/'//callsign + else if(k.ge.401 .and. k.le.400+NZ2) then + iz=index(callsign,' ') - 1 + callsign=callsign(1:iz)//'/'//sfx(k-400) + else if(k.eq.449) then + iz=index(addpfx,' ') - 1 + if(iz.lt.1) iz=8 + callsign=addpfx(1:iz)//'/'//callsign + endif + + return + end subroutine getpfx2 + + subroutine grid2k(grid,k) + + character*6 grid + + call grid2deg(grid,xlong,xlat) + nlong=nint(xlong) + nlat=nint(xlat) + k=0 + if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 + + return + end subroutine grid2k + + subroutine k2grid(k,grid) + character grid*6 + + nlong=2*mod((k-1)/5,90)-179 + if(k.gt.450) nlong=nlong+180 + nlat=mod(k-1,5)+ 85 + dlat=nlat + dlong=nlong + call deg2grid(dlong,dlat,grid) + + return + end subroutine k2grid + + subroutine grid2n(grid,n) + character*4 grid + + i1=ichar(grid(1:1))-ichar('A') + i2=ichar(grid(3:3))-ichar('0') + i=10*i1 + i2 + n=-i - 31 + + return + end subroutine grid2n + + subroutine n2grid(n,grid) + character*4 grid + + if(n.gt.-31 .or. n.lt.-70) stop 'Error in n2grid' + i=-(n+31) !NB: 0 <= i <= 39 + i1=i/10 + i2=mod(i,10) + grid(1:1)=char(ichar('A')+i1) + grid(2:2)='A' + grid(3:3)=char(ichar('0')+i2) + grid(4:4)='0' + + return + end subroutine n2grid + + function nchar(c) + + ! Convert ascii number, letter, or space to 0-36 for callsign packing. + + character c*1 + + n=0 !Silence compiler warning + if(c.ge.'0' .and. c.le.'9') then + n=ichar(c)-ichar('0') + else if(c.ge.'A' .and. c.le.'Z') then + n=ichar(c)-ichar('A') + 10 + else if(c.ge.'a' .and. c.le.'z') then + n=ichar(c)-ichar('a') + 10 + else if(c.ge.' ') then + n=36 + else + Print*,'Invalid character in callsign ',c,' ',ichar(c) + stop + endif + nchar=n + + return + end function nchar + + subroutine pack50(n1,n2,dat) + + integer*1 dat(:),i1 + + i1=iand(ishft(n1,-20),255) !8 bits + dat(1)=i1 + i1=iand(ishft(n1,-12),255) !8 bits + dat(2)=i1 + i1=iand(ishft(n1, -4),255) !8 bits + dat(3)=i1 + i1=16*iand(n1,15)+iand(ishft(n2,-18),15) !4+4 bits + dat(4)=i1 + i1=iand(ishft(n2,-10),255) !8 bits + dat(5)=i1 + i1=iand(ishft(n2, -2),255) !8 bits + dat(6)=i1 + i1=64*iand(n2,3) !2 bits + dat(7)=i1 + dat(8)=0 + dat(9)=0 + dat(10)=0 + dat(11)=0 + + return + end subroutine pack50 + +subroutine packpfx(call1,n1,ng,nadd) + + character*12 call1,call0 + character*3 pfx + logical text + + i1=index(call1,'/') + if(call1(i1+2:i1+2).eq.' ') then +! Single-character add-on suffix (maybe also fourth suffix letter?) + call0=call1(:i1-1) + call packcall(call0,n1,text) + nadd=1 + nc=ichar(call1(i1+1:i1+1)) + if(nc.ge.48 .and. nc.le.57) then + n=nc-48 + else if(nc.ge.65 .and. nc.le.90) then + n=nc-65+10 + else + n=38 + endif + nadd=1 + ng=60000-32768+n + else if(call1(i1+3:i1+3).eq.' ') then +! Two-character numerical suffix, /10 to /99 + call0=call1(:i1-1) + call packcall(call0,n1,text) + nadd=1 + n=10*(ichar(call1(i1+1:i1+1))-48) + ichar(call1(i1+2:i1+2)) - 48 + nadd=1 + ng=60000 + 26 + n + else +! Prefix of 1 to 3 characters + pfx=call1(:i1-1) + if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) + if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) + call0=call1(i1+1:) + call packcall(call0,n1,text) + + ng=0 + do i=1,3 + nc=ichar(pfx(i:i)) + if(nc.ge.48 .and. nc.le.57) then + n=nc-48 + else if(nc.ge.65 .and. nc.le.90) then + n=nc-65+10 + else + n=36 + endif + ng=37*ng + n + enddo + nadd=0 + if(ng.ge.32768) then + ng=ng-32768 + nadd=1 + endif + endif + + return +end subroutine packpfx + +end module packjt diff --git a/q65w/libm65/pfx.f90 b/q65w/libm65/pfx.f90 new file mode 100644 index 000000000..724b0f8a3 --- /dev/null +++ b/q65w/libm65/pfx.f90 @@ -0,0 +1,50 @@ + parameter (NZ=339) !Total number of prefixes + parameter (NZ2=12) !Total number of suffixes + character*1 sfx(NZ2) + character*5 pfx(NZ) + + data sfx/'P','0','1','2','3','4','5','6','7','8','9','A'/ + data pfx/ & + '1A ','1S ','3A ','3B6 ','3B8 ','3B9 ','3C ','3C0 ', & + '3D2 ','3D2C ','3D2R ','3DA ','3V ','3W ','3X ','3Y ', & + '3YB ','3YP ','4J ','4L ','4S ','4U1I ','4U1U ','4W ', & + '4X ','5A ','5B ','5H ','5N ','5R ','5T ','5U ', & + '5V ','5W ','5X ','5Z ','6W ','6Y ','7O ','7P ', & + '7Q ','7X ','8P ','8Q ','8R ','9A ','9G ','9H ', & + '9J ','9K ','9L ','9M2 ','9M6 ','9N ','9Q ','9U ', & + '9V ','9X ','9Y ','A2 ','A3 ','A4 ','A5 ','A6 ', & + 'A7 ','A9 ','AP ','BS7 ','BV ','BV9 ','BY ','C2 ', & + 'C3 ','C5 ','C6 ','C9 ','CE ','CE0X ','CE0Y ','CE0Z ', & + 'CE9 ','CM ','CN ','CP ','CT ','CT3 ','CU ','CX ', & + 'CY0 ','CY9 ','D2 ','D4 ','D6 ','DL ','DU ','E3 ', & + 'E4 ','EA ','EA6 ','EA8 ','EA9 ','EI ','EK ','EL ', & + 'EP ','ER ','ES ','ET ','EU ','EX ','EY ','EZ ', & + 'F ','FG ','FH ','FJ ','FK ','FKC ','FM ','FO ', & + 'FOA ','FOC ','FOM ','FP ','FR ','FRG ','FRJ ','FRT ', & + 'FT5W ','FT5X ','FT5Z ','FW ','FY ','M ','MD ','MI ', & + 'MJ ','MM ', 'MU ','MW ','H4 ','H40 ','HA ', & + 'HB ','HB0 ','HC ','HC8 ','HH ','HI ','HK ','HK0 ', & + 'HK0M ','HL ','HM ','HP ','HR ','HS ','HV ','HZ ', & + 'I ','IS ','IS0 ', 'J2 ','J3 ','J5 ','J6 ', & + 'J7 ','J8 ','JA ','JDM ','JDO ','JT ','JW ', & + 'JX ','JY ','K ','KG4 ','KH0 ','KH1 ','KH2 ','KH3 ', & + 'KH4 ','KH5 ','KH5K ','KH6 ','KH7 ','KH8 ','KH9 ','KL ', & + 'KP1 ','KP2 ','KP4 ','KP5 ','LA ','LU ','LX ','LY ', & + 'LZ ','OA ','OD ','OE ','OH ','OH0 ','OJ0 ','OK ', & + 'OM ','ON ','OX ','OY ','OZ ','P2 ','P4 ','PA ', & + 'PJ2 ','PJ7 ','PY ','PY0F ','PT0S ','PY0T ','PZ ','R1F ', & + 'R1M ','S0 ','S2 ','S5 ','S7 ','S9 ','SM ','SP ', & + 'ST ','SU ','SV ','SVA ','SV5 ','SV9 ','T2 ','T30 ', & + 'T31 ','T32 ','T33 ','T5 ','T7 ','T8 ','T9 ','TA ', & + 'TF ','TG ','TI ','TI9 ','TJ ','TK ','TL ', & + 'TN ','TR ','TT ','TU ','TY ','TZ ','UA ','UA2 ', & + 'UA9 ','UK ','UN ','UR ','V2 ','V3 ','V4 ','V5 ', & + 'V6 ','V7 ','V8 ','VE ','VK ','VK0H ','VK0M ','VK9C ', & + 'VK9L ','VK9M ','VK9N ','VK9W ','VK9X ','VP2E ','VP2M ','VP2V ', & + 'VP5 ','VP6 ','VP6D ','VP8 ','VP8G ','VP8H ','VP8O ','VP8S ', & + 'VP9 ','VQ9 ','VR ','VU ','VU4 ','VU7 ','XE ','XF4 ', & + 'XT ','XU ','XW ','XX9 ','XZ ','YA ','YB ','YI ', & + 'YJ ','YK ','YL ','YN ','YO ','YS ','YU ','YV ', & + 'YV0 ','Z2 ','Z3 ','ZA ','ZB ','ZC4 ','ZD7 ','ZD8 ', & + 'ZD9 ','ZF ','ZK1N ','ZK1S ','ZK2 ','ZK3 ','ZL ','ZL7 ', & + 'ZL8 ','ZL9 ','ZP ','ZS ','ZS8 ','KC4 ','E5 '/ diff --git a/q65w/libm65/pfxdump.f90 b/q65w/libm65/pfxdump.f90 new file mode 100644 index 000000000..7587dbf72 --- /dev/null +++ b/q65w/libm65/pfxdump.f90 @@ -0,0 +1,13 @@ +subroutine pfxdump(fname) + character*(*) fname + include 'pfx.f90' + + open(11,file=fname,status='unknown') + write(11,1001) sfx +1001 format('Supported Suffixes:'/(11('/',a1,2x))) + write(11,1002) pfx +1002 format(/'Supported Add-On DXCC Prefixes:'/(15(a5,1x))) + close(11) + + return +end subroutine pfxdump diff --git a/q65w/libm65/polfit.f90 b/q65w/libm65/polfit.f90 new file mode 100644 index 000000000..33e8d44ed --- /dev/null +++ b/q65w/libm65/polfit.f90 @@ -0,0 +1,87 @@ +subroutine polfit(y,npts,a) + +! Input: y(npts) !Expect npts=4 +! Output: a(1) = baseline +! a(2) = amplitude +! a(3) = theta (deg) + + real y(npts) + real a(3) + real deltaa(3) + integer ipk(1) + save + +! Set starting values: + a(1)=minval(y) + a(2)=maxval(y)-a(1) + ipk=maxloc(y) + a(3)=(ipk(1)-1)*45.0 + + deltaa(1:2)=0.1*a(2) + deltaa(3)=10.0 + nterms=3 + +! Start the iteration + chisqr=0. + chisqr0=1.e6 + iters=10 + + do iter=1,iters + do j=1,nterms + chisq1=fchisq_pol(y,npts,a) + fn=0. + delta=deltaa(j) +10 a(j)=a(j)+delta + chisq2=fchisq_pol(y,npts,a) + if(chisq2.eq.chisq1) go to 10 + if(chisq2.gt.chisq1) then + delta=-delta !Reverse direction + a(j)=a(j)+delta + tmp=chisq1 + chisq1=chisq2 + chisq2=tmp + endif +20 fn=fn+1.0 + a(j)=a(j)+delta + chisq3=fchisq_pol(y,npts,a) + if(chisq3.lt.chisq2) then + chisq1=chisq2 + chisq2=chisq3 + go to 20 + endif + +! Find minimum of parabola defined by last three points + delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) + a(j)=a(j)-delta + deltaa(j)=deltaa(j)*fn/3. +! write(*,4000) iter,j,a,deltaa,chisq2 +!4000 format(2i2,2(2x,3f8.2),f12.5) + enddo ! j=1,nterms + chisqr=fchisq_pol(y,npts,a) +! write(*,4000) 0,0,a,chisqr + if(chisqr.lt.1.0) exit + if(deltaa(1).lt.0.01*(a(2)-a(1)) .and. deltaa(2).lt.0.01*(a(2)-a(1)) & + .and. deltaa(3).lt.1.0) exit + if(chisqr/chisqr0.gt.0.99) exit + chisqr0=chisqr + enddo ! iter + a(3)=mod(a(3)+360.0,180.0) + + return +end subroutine polfit + +real function fchisq_pol(y,npts,a) + + real y(npts),a(3) + data rad/57.2957795/ + + chisq = 0. + do i=1,npts + theta=(i-1)*45.0 + yfit=a(1) + a(2)*cos((theta-a(3))/rad)**2 + chisq=chisq + (y(i) - yfit)**2 + enddo + fchisq_pol=chisq + + return +end function fchisq_pol diff --git a/q65w/libm65/ptt.c b/q65w/libm65/ptt.c new file mode 100644 index 000000000..0f99d1be8 --- /dev/null +++ b/q65w/libm65/ptt.c @@ -0,0 +1,43 @@ +#include +#include + +int ptt_(int *nport, int *ntx, int *iptt) +{ + static HANDLE hFile; + static int open=0; + char s[10]; + int i3=0,i4=0,i5=0,i6=0,i9=0,i00=0; + + if(*nport==0) { + *iptt=*ntx; + return(0); + } + + if(*ntx && (!open)) { + sprintf(s,"COM%d",*nport); + hFile=CreateFile(TEXT(s),GENERIC_WRITE,0,NULL,OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL,NULL); + if(hFile==INVALID_HANDLE_VALUE) { + // printf("PTT: Cannot open COM port %d.\n",*nport); + return 1; + } + open=1; + } + + if(*ntx && open) { + EscapeCommFunction(hFile,3); + EscapeCommFunction(hFile,5); + *iptt=1; + } + + else { + EscapeCommFunction(hFile,4); + EscapeCommFunction(hFile,6); + EscapeCommFunction(hFile,9); + i00=CloseHandle(hFile); + *iptt=0; + open=0; + } + if((i00+i3+i4+i5+i6+i9)==-99) return -1; //Silence compiler warning + return 0; +} diff --git a/q65w/libm65/ptt_unix.c b/q65w/libm65/ptt_unix.c new file mode 100644 index 000000000..1c583f641 --- /dev/null +++ b/q65w/libm65/ptt_unix.c @@ -0,0 +1,405 @@ +/* + * WSJT is Copyright (c) 2001-2006 by Joseph H. Taylor, Jr., K1JT, + * and is licensed under the GNU General Public License (GPL). + * + * Code used from cwdaemon for parallel port ptt only. + * + * cwdaemon - morse sounding daemon for the parallel or serial port + * Copyright (C) 2002 -2005 Joop Stakenborg + * and many authors, see the AUTHORS file. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +# if HAVE_STDIO_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if HAVE_SYS_IOCTL_H +# include +#endif +#if HAVE_FCNTL_H +# include +#endif + +#ifdef HAVE_LINUX_PPDEV_H +# include +# include +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H +# include +# include +#endif + +int lp_reset (int fd); +int lp_ptt (int fd, int onoff); + +#ifdef HAVE_SYS_STAT_H +# include +#endif +#if (defined(__unix__) || defined(unix)) && !defined(USG) +# include +#endif + +#include +/* parport functions */ + +int dev_is_parport(int fd); +int ptt_parallel(int fd, int *ntx, int *iptt); +int ptt_serial(int fd, int *ntx, int *iptt); + +int fd=-1; /* Used for both serial and parallel */ + +/* + * ptt_ + * + * generic unix PTT routine called from Fortran + * + * Inputs + * unused Unused, to satisfy old windows calling convention + * ptt_port device name serial or parallel + * ntx pointer to fortran command on or off + * iptt pointer to fortran command status on or off + * Returns - non 0 if error +*/ + +/* Tiny state machine */ +#define STATE_PORT_CLOSED 0 +#define STATE_PORT_OPEN_PARALLEL 1 +#define STATE_PORT_OPEN_SERIAL 2 + +//int ptt_(int *unused, char *ptt_port, int *ntx, int *iptt) +int ptt_(int *unused, int *ntx, int *iptt) +{ + static int state=0; + char *p; + +// ### Temporary: + char* ptt_port; + if(*unused != -99) { + *iptt=*ntx; + return 0; + } +// ### + + /* In the very unlikely event of a NULL pointer, just return. + * Yes, I realise this should not be possible in WSJT. + */ + if (ptt_port == NULL) { + *iptt = *ntx; + return (0); + } + + switch (state) { + case STATE_PORT_CLOSED: + + /* Remove trailing ' ' */ + if ((p = strchr(ptt_port, ' ')) != NULL) + *p = '\0'; + + /* If all that is left is a '\0' then also just return */ + if (*ptt_port == '\0') { + *iptt = *ntx; + return(0); + } + + if ((fd = open(ptt_port, O_RDWR|O_NONBLOCK)) < 0) { + fprintf(stderr, "Can't open %s.\n", ptt_port); + return (1); + } + + if (dev_is_parport(fd)) { + state = STATE_PORT_OPEN_PARALLEL; + lp_reset(fd); + ptt_parallel(fd, ntx, iptt); + } else { + state = STATE_PORT_OPEN_SERIAL; + ptt_serial(fd, ntx, iptt); + } + break; + + case STATE_PORT_OPEN_PARALLEL: + ptt_parallel(fd, ntx, iptt); + break; + + case STATE_PORT_OPEN_SERIAL: + ptt_serial(fd, ntx, iptt); + break; + + default: + close(fd); + fd = -1; + state = STATE_PORT_CLOSED; + break; + } + return(0); +} + +/* + * ptt_serial + * + * generic serial unix PTT routine called indirectly from Fortran + * + * fd - already opened file descriptor + * ntx - pointer to fortran command on or off + * iptt - pointer to fortran command status on or off + */ + +int +ptt_serial(int fd, int *ntx, int *iptt) +{ + int control = TIOCM_RTS | TIOCM_DTR; + +#if defined (TIOCMBIS) && defined (TIOCMBIS) + if(*ntx) { + ioctl(fd, TIOCMBIS, &control); /* Set DTR and RTS */ + *iptt = 1; + } else { + ioctl(fd, TIOCMBIC, &control); + *iptt = 0; + } +#else + unsigned y; + ioctl(fd, TIOCMGET, &y); + if (*ntx) { + y |= control; + } else { + y &= ~control; + } + ioctl(fd, TIOCMSET, &y); +#endif + return(0); +} + + +/* parport functions */ + +/* + * dev_is_parport(fd): + * + * inputs - Already open fd + * output - 1 if parallel port, 0 if not + * side effects - Unfortunately, this is platform specific. + */ + +#if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */ + +int +dev_is_parport(int fd) +{ + struct stat st; + int m; + + if ((fstat(fd, &st) == -1) || + ((st.st_mode & S_IFMT) != S_IFCHR) || + (ioctl(fd, PPGETMODE, &m) == -1)) + return(0); + + return(1); +} + +#elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */ + +int +dev_is_parport(int fd) +{ + struct stat st; + unsigned char c; + + if ((fstat(fd, &st) == -1) || + ((st.st_mode & S_IFMT) != S_IFCHR) || + (ioctl(fd, PPISSTATUS, &c) == -1)) + return(0); + + return(1); +} + +#else /* Fallback (nothing) */ + +int +dev_is_parport(int fd) +{ + return(0); +} + +#endif +/* Linux wrapper around PPFCONTROL */ +#ifdef HAVE_LINUX_PPDEV_H +static void +parport_control (int fd, unsigned char controlbits, int values) +{ + struct ppdev_frob_struct frob; + frob.mask = controlbits; + frob.val = values; + + if (ioctl (fd, PPFCONTROL, &frob) == -1) + { + fprintf(stderr, "Parallel port PPFCONTROL"); + exit (1); + } +} +#endif + +/* FreeBSD wrapper around PPISCTRL */ +#ifdef HAVE_DEV_PPBUS_PPI_H +static void +parport_control (int fd, unsigned char controlbits, int values) +{ + unsigned char val; + + if (ioctl (fd, PPIGCTRL, &val) == -1) + { + fprintf(stderr, "Parallel port PPIGCTRL"); + exit (1); + } + + val &= ~controlbits; + val |= values; + + if (ioctl (fd, PPISCTRL, &val) == -1) + { + fprintf(stderr, "Parallel port PPISCTRL"); + exit (1); + } +} +#endif + +/* Initialise a parallel port, given open fd */ +int +lp_init (int fd) +{ +#ifdef HAVE_LINUX_PPDEV_H + int mode; +#endif + +#ifdef HAVE_LINUX_PPDEV_H + mode = PARPORT_MODE_PCSPP; + + if (ioctl (fd, PPSETMODE, &mode) == -1) + { + fprintf(stderr, "Setting parallel port mode"); + close (fd); + return(-1); + } + + if (ioctl (fd, PPEXCL, NULL) == -1) + { + fprintf(stderr, "Parallel port is already in use.\n"); + close (fd); + return(-1); + } + if (ioctl (fd, PPCLAIM, NULL) == -1) + { + fprintf(stderr, "Claiming parallel port.\n"); + fprintf(stderr, "HINT: did you unload the lp kernel module?"); + close (fd); + return(-1); + } + + /* Enable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + parport_control (fd, STROBE, STROBE); +#endif + lp_reset (fd); + return(0); +} + +/* release ppdev and close port */ +int +lp_free (int fd) +{ +#ifdef HAVE_LINUX_PPDEV_H + lp_reset (fd); + + /* Disable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, PARPORT_CONTROL_STROBE, 0); + + ioctl (fd, PPRELEASE); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + /* Disable CW & PTT - /STROBE bit (pin 1) */ + parport_control (fd, STROBE, 0); +#endif + close (fd); + return(0); +} + +/* set to a known state */ +int +lp_reset (int fd) +{ +#if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) + lp_ptt (fd, 0); +#endif + return(0); +} + +/* SSB PTT keying - /INIT bit (pin 16) (inverted) */ +int +lp_ptt (int fd, int onoff) +{ +#ifdef HAVE_LINUX_PPDEV_H + if (onoff == 1) + parport_control (fd, PARPORT_CONTROL_INIT, + PARPORT_CONTROL_INIT); + else + parport_control (fd, PARPORT_CONTROL_INIT, 0); +#endif +#ifdef HAVE_DEV_PPBUS_PPI_H + if (onoff == 1) + parport_control (fd, nINIT, + nINIT); + else + parport_control (fd, nINIT, 0); +#endif + return(0); +} + +/* + * ptt_parallel + * + * generic parallel unix PTT routine called indirectly from Fortran + * + * fd - already opened file descriptor + * ntx - pointer to fortran command on or off + * iptt - pointer to fortran command status on or off + */ + +int +ptt_parallel(int fd, int *ntx, int *iptt) +{ + if(*ntx) { + lp_ptt(fd, 1); + *iptt=1; + } else { + lp_ptt(fd, 0); + *iptt=0; + } + return(0); +} diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 new file mode 100644 index 000000000..7cf455edf --- /dev/null +++ b/q65w/libm65/q65b.f90 @@ -0,0 +1,204 @@ +subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & + mycall0,mygrid,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & + max_drift,nhsym,ndop00,idec) + +! This routine provides an interface between MAP65 and the Q65 decoder +! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. +! Raw Rx data are available as the 96 kHz complex spectrum ca(MAXFFT1) +! in common/cacb. If xpol is true, we also have cb(MAXFFT1) for the +! orthogonal polarization. Decoded messages are sent back to the GUI +! on stdout. + +! use wavhdr + use q65_decode + use wideband_sync + use timer_module, only: timer + + parameter (MAXFFT1=5376000) !56*96000 + parameter (MAXFFT2=336000) !56*6000 (downsampled by 1/16) + parameter (NMAX=60*12000) + parameter (RAD=57.2957795) +! type(hdr) h !Header for the .wav file + integer*2 iwave(60*12000) + complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of raw x,y data + complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1),cz(0:MAXFFT2) + logical xpol,ldecoded + integer ipk1(1) + real*8 fcenter,freq0,freq1 + character*12 mycall0,hiscall0 + character*12 mycall,hiscall + character*6 mygrid,hisgrid + character*4 grid4 + character*28 msg00 + character*80 line + character*80 wsjtx_dir + character*1 cp,cmode*2 + common/cacb/ca,cb + common/early/nhsym1,nhsym2,ldecoded(32768) + common/decodes/ndecodes + data nutc00/-1/,msg00/' '/ + save + + if(newdat.eq.1) nutc00=-1 + open(9,file='wsjtx_dir.txt',status='old') + read(9,'(a)') wsjtx_dir !Establish the working directory + close(9) + + if(mycall0(1:1).ne.' ') mycall=mycall0 + if(hiscall0(1:1).ne.' ') hiscall=hiscall0 + if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) + +! Find best frequency and ipol from sync_dat, the "orange sync curve". + df3=96000.0/32768.0 + ifreq=nint((1000.0*f0)/df3) + ia=nint(ifreq-ntol/df3) + ib=nint(ifreq+ntol/df3) + ipk1=maxloc(sync(ia:ib)%ccfmax) + ipk=ia+ipk1(1)-1 + if(ldecoded(ipk)) go to 900 + snr1=sync(ipk)%ccfmax + ipol=1 + if(xpol) ipol=sync(ipk)%ipol + + nfft1=MAXFFT1 + nfft2=MAXFFT2 + df=96000.0/NFFT1 + if(nfsample.eq.95238) then + nfft1=5120000 + nfft2=322560 + df=96000.0/nfft1 + endif + nh=nfft2/2 + f_mouse=1000.0*(fqso+48.0) + mousedf + f_ipk=ipk*df3 + k0=nint((ipk*df3-1000.0)/df) + if(nagain.eq.1) k0=nint((f_mouse-1000.0)/df) + + if(k0.lt.nh .or. k0.gt.MAXFFT1-nfft2+1) go to 900 + if(snr1.lt.1.5) go to 900 !### Threshold needs work? ### + + fac=1.0/nfft2 + cx(0:nfft2-1)=ca(k0:k0+nfft2-1) + cx=fac*cx + if(xpol) then + cy(0:nfft2-1)=cb(k0:k0+nfft2-1) + cy=fac*cy + endif + +! Here cx and cy (if xpol) are frequency-domain data around the selected +! QSO frequency, taken from the full-length FFT computed in filbig(). +! Values for fsample, nfft1, nfft2, df, and the downsampled data rate +! are as follows: + +! fSample nfft1 df nfft2 fDownSampled +! (Hz) (Hz) (Hz) +!---------------------------------------------------- +! 96000 5376000 0.017857143 336000 6000.000 +! 95238 5120000 0.018601172 322560 5999.994 + + poldeg=0. + if(xpol) then + poldeg=sync(ipk)%pol + cz(0:MAXFFT2-1)=cos(poldeg/RAD)*cx + sin(poldeg/RAD)*cy + else + cz(0:MAXFFT2-1)=cx + endif + + cz(MAXFFT2)=0. +! Roll off below 500 Hz and above 2500 Hz. + ja=nint(500.0/df) + jb=nint(2500.0/df) + do i=0,ja + r=0.5*(1.0+cos(i*3.14159/ja)) + cz(ja-i)=r*cz(ja-i) + cz(jb+i)=r*cz(jb+i) + enddo + cz(ja+jb+1:)=0. + +!Transform to time domain (real), fsample=12000 Hz + call four2a(cz,2*nfft2,1,1,-1) + do i=0,nfft2-1 + j=nfft2-1-i + iwave(2*i+2)=nint(real(cz(j))) !Note the reversed order! + iwave(2*i+1)=nint(aimag(cz(j))) + enddo + iwave(2*nfft2+1:)=0 + +! open(30,file='000000_0001.wav',status='unknown',access='stream') +! h=default_header(12000,NMAX) +! write(30) h,iwave +! close(30) + + nsubmode=mode_q65-1 + nfa=990 !Tight limits around ipk for the wideband decode + nfb=1010 + if(nagain.eq.1) then !For nagain=1, use limits of +/- ntol + nfa=max(100,1000-ntol) + nfb=min(2500,1000+ntol) + endif + nsnr0=-99 !Default snr for no decode + +! NB: Frequency of ipk is now shifted to 1000 Hz. + call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & + newdat,nagain,max_drift,mycall,hiscall,hisgrid) + + MHz=fcenter + freq0=MHz + 0.001d0*ikhz + + if(nsnr0.gt.-99) then + ldecoded(ipk)=.true. + nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal + nq65df=nq65df + nfreq0 - 1000 + npol=nint(poldeg) + if(nxant.ne.0) then + npol=npol-45 + if(npol.lt.0) npol=npol+180 + endif + call txpol(xpol,msg0(1:22),mygrid,npol,nxant,ntxpol,cp) + ikhz1=ikhz + ndf=nq65df + if(ndf.gt.500) ikhz1=ikhz + (nq65df+500)/1000 + if(ndf.lt.-500) ikhz1=ikhz + (nq65df-500)/1000 + ndf=nq65df - 1000*(ikhz1-ikhz) + if(nqd.eq.1 .and. abs(nq65df-mousedf).lt.ntol) then + write(line,1020) ikhz1,ndf,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0, & + ntxpol,cp +1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3,i4,1x,a1) + write(*,1100) trim(line) +1100 format(a) + endif + +! Write to lu 26, for Messages and Band Map windows + cmode=': ' + cmode(2:2)=char(ichar('A') + mode_q65-1) + freq1=freq0 + 0.001d0*(ikhz1-ikhz) + write(26,1014) freq1,ndf,0,0,0,xdt0,npol,0,nsnr0,nutc,msg0(1:22), & + ':',cp,cmode +1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,1x,2a1,2x,a2) + +! Suppress writing duplicates (same time, decoded message, and frequency) +! to map65_rx.log + if(nutc.ne.nutc00 .or. msg0(1:28).ne.msg00 .or. freq1.ne.freq1_00) then +! Write to file map65_rx.log: + ndecodes=ndecodes+1 + write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28), & + cmode(2:2),cq0 +1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': ',a1,2x,a3) + nutc00=nutc + msg00=msg0(1:28) + freq1_00=freq1 + frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal + fsked=frx - 0.001*ndop00/2.0 - 1.5 + write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) +1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) + endif + endif + +900 close(13) + close(17) + call flush(6) + idec=-1 + read(cq0(2:2),*) idec + + return +end subroutine q65b diff --git a/q65w/libm65/recvpkt.f90 b/q65w/libm65/recvpkt.f90 new file mode 100644 index 000000000..88d51cc59 --- /dev/null +++ b/q65w/libm65/recvpkt.f90 @@ -0,0 +1,73 @@ +subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) + +! Reformat timf2 data from Linrad and stuff data into r*4 array dd(). + + include 'njunk.f90' + parameter (NSMAX=60*96000) !Total sample intervals per minute + parameter (NFFT=32768) + integer*1 userx_no + real*4 d4,buf4(*) !(348) + real*8 d8,buf8(*) !(174) + complex*16 c16,buf16(*) !(87) + integer*2 jd(4),kd(2),nblock2 + real*4 xd(4),yd(2) + real*8 fcenter + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc, & + junk(NJUNK) + equivalence (kd,d4) + equivalence (jd,d8,yd) + equivalence (xd,c16) + + if(nblock2.eq.-9999) nblock2=-9998 !Silence a compiler warning + if(nsam.eq.-1) then +! Move data from the UDP packet buffer into array dd(). + if(userx_no.eq.-1) then + do i=1,174 !One RF channel, r*4 data + k=k+1 + d8=buf8(i) + dd(1,k)=yd(1) + dd(2,k)=yd(2) + enddo + else if(userx_no.eq.1) then + do i=1,348 !One RF channel, i*2 data + k=k+1 + d4=buf4(i) + dd(1,k)=kd(1) + dd(2,k)=kd(2) + enddo + else if(userx_no.eq.-2) then + do i=1,87 !Two RF channels, r*4 data + k=k+1 + c16=buf16(i) + dd(1,k)=xd(1) + dd(2,k)=xd(2) + dd(3,k)=xd(3) + dd(4,k)=xd(4) + enddo + else if(userx_no.eq.2) then + do i=1,174 !Two RF channels, i*2 data + k=k+1 + d8=buf8(i) + dd(1,k)=jd(1) + dd(2,k)=jd(2) + dd(3,k)=jd(3) + dd(4,k)=jd(4) + enddo + endif + else + if(userx_no.eq.1) then + do i=1,nsam !One RF channel, r*4 data + k=k+1 + d4=buf4(i) + dd(1,k)=kd(1) + dd(2,k)=kd(2) + + k=k+1 + dd(1,k)=kd(1) + dd(2,k)=kd(2) + enddo + endif + endif + + return +end subroutine recvpkt diff --git a/q65w/libm65/rfile3a.f90 b/q65w/libm65/rfile3a.f90 new file mode 100644 index 000000000..7e2266513 --- /dev/null +++ b/q65w/libm65/rfile3a.f90 @@ -0,0 +1,14 @@ +subroutine rfile3a(infile,ibuf,n,fcenter,ierr) + + character*(*) infile + integer*8 ibuf(n) + real*8 fcenter + + open(10,file=infile,access='stream',status='old',err=998) + read(10,end=998) (ibuf(i),i=1,n/8),fcenter + ierr=0 + go to 999 +998 ierr=1002 +999 close(10) + return +end subroutine rfile3a diff --git a/q65w/libm65/rs.h b/q65w/libm65/rs.h new file mode 100644 index 000000000..06cbe344f --- /dev/null +++ b/q65w/libm65/rs.h @@ -0,0 +1,35 @@ +/* User include file for the Reed-Solomon codec + * Copyright 2002, Phil Karn KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ + +/* General purpose RS codec, 8-bit symbols */ +void encode_rs_char(void *rs,unsigned char *data,unsigned char *parity); +int decode_rs_char(void *rs,unsigned char *data,int *eras_pos, + int no_eras); +void *init_rs_char(int symsize,int gfpoly, + int fcr,int prim,int nroots, + int pad); +void free_rs_char(void *rs); + +/* General purpose RS codec, integer symbols */ +void encode_rs_int(void *rs,int *data,int *parity); +int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras); +void *init_rs_int(int symsize,int gfpoly,int fcr, + int prim,int nroots,int pad); +void free_rs_int(void *rs); + +/* CCSDS standard (255,223) RS codec with conventional (*not* dual-basis) + * symbol representation + */ +void encode_rs_8(unsigned char *data,unsigned char *parity,int pad); +int decode_rs_8(unsigned char *data,int *eras_pos,int no_eras,int pad); + +/* CCSDS standard (255,223) RS codec with dual-basis symbol representation */ +void encode_rs_ccsds(unsigned char *data,unsigned char *parity,int pad); +int decode_rs_ccsds(unsigned char *data,int *eras_pos,int no_eras,int pad); + +/* Tables to map from conventional->dual (Taltab) and + * dual->conventional (Tal1tab) bases + */ +extern unsigned char Taltab[],Tal1tab[]; diff --git a/q65w/libm65/rs2.h b/q65w/libm65/rs2.h new file mode 100644 index 000000000..c2b807d15 --- /dev/null +++ b/q65w/libm65/rs2.h @@ -0,0 +1,16 @@ +/* User include file for the Reed-Solomon codec + * Copyright 2002, Phil Karn KA9Q + * May be used under the terms of the GNU General Public License (GPL) + */ + +/* General purpose RS codec, integer symbols */ +void encode_rs_int(void *rs,int *data,int *parity); +int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras, int calc_syn); +void *init_rs_int(int symsize,int gfpoly,int fcr, + int prim,int nroots,int pad); +void free_rs_int(void *rs); + +/* Tables to map from conventional->dual (Taltab) and + * dual->conventional (Tal1tab) bases + */ +extern unsigned char Taltab[],Tal1tab[]; diff --git a/q65w/libm65/s3avg.f90 b/q65w/libm65/s3avg.f90 new file mode 100644 index 000000000..9d76637c4 --- /dev/null +++ b/q65w/libm65/s3avg.f90 @@ -0,0 +1,60 @@ +subroutine s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) + +! Save the current synchronized spectra, s3(64,63), for possible +! decoding of average. + + real s3(64,63) !Synchronized spectra for 63 symbols + real s3a(64,63,64) !Saved spectra + real s3b(64,63) !Average spectra + integer iutc(64),ihz(64),ipol(64) + real dt(64) + character*22 decoded + logical ltext,first + data first/.true./ + save + + if(first) then + iutc=-1 + ihz=0 + ipol=0 + first=.false. + ihzdiff=min(100,ntol) + dtdiff=0.2 + endif + + do i=1,64 + if(nutc.eq.iutc(i) .and. abs(nhz-ihz(i)).lt.ihzdiff) then + nsave=mod(nsave-1+64,64)+1 + go to 10 + endif + enddo + + iutc(nsave)=nutc !Save UTC + ihz(nsave)=nhz !Save freq in Hz + ipol(nsave)=npol !Save pol + dt(nsave)=xdt !Save DT + s3a(1:64,1:63,nsave)=s3 !Save the spectra + +10 s3b=0. + do i=1,64 !Accumulate avg spectra + if(iutc(i).lt.0) cycle + if(mod(iutc(i),2).ne.mod(nutc,2)) cycle !Use only same sequence + if(abs(nhz-ihz(i)).gt.ihzdiff) cycle !Freq must match + if(abs(xdt-dt(i)).gt.dtdiff) cycle !DT must match + s3b=s3b + s3a(1:64,1:63,i) + nsum=nsum+1 + enddo + + decoded=' ' + if(nsum.ge.2) then !Try decoding the sverage + nadd=mode65*nsum + call extract(s3b,nadd,ncount,nhist,decoded,ltext) !Extract the message + nkv=nsum + if(ncount.lt.0) then + nkv=0 + decoded=' ' + endif + endif + + return +end subroutine s3avg diff --git a/q65w/libm65/sec_midn.f90 b/q65w/libm65/sec_midn.f90 new file mode 100644 index 000000000..0bbe62c2c --- /dev/null +++ b/q65w/libm65/sec_midn.f90 @@ -0,0 +1,11 @@ +real function sec_midn() + sec_midn=secnds(0.0) + return +end function sec_midn + +subroutine sleep_msec(n) + + call usleep(1000*n) + + return +end subroutine sleep_msec diff --git a/q65w/libm65/set.f90 b/q65w/libm65/set.f90 new file mode 100644 index 000000000..ff7679889 --- /dev/null +++ b/q65w/libm65/set.f90 @@ -0,0 +1,31 @@ +subroutine set(a,y,n) + real y(n) + do i=1,n + y(i)=a + enddo + return +end subroutine set + +subroutine move(x,y,n) + real x(n),y(n) + do i=1,n + y(i)=x(i) + enddo + return +end subroutine move + +subroutine zero(x,n) + real x(n) + do i=1,n + x(i)=0.0 + enddo + return +end subroutine zero + +subroutine add(a,b,c,n) + real a(n),b(n),c(n) + do i=1,n + c(i)=a(i)+b(i) + enddo + return +end subroutine add diff --git a/q65w/libm65/setup65.f90 b/q65w/libm65/setup65.f90 new file mode 100644 index 000000000..b1a867d18 --- /dev/null +++ b/q65w/libm65/setup65.f90 @@ -0,0 +1,96 @@ +subroutine setup65 + +! Defines arrays related to the JT65 pseudo-random synchronizing pattern. +! Executed at program start. + + integer nprc(126) + common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) + +! JT65 + data nprc/ & + 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + data mr2/0/ !Silence compiler warning + +! Put the appropriate pseudo-random sequence into pr + nsym=126 + do i=1,nsym + pr(i)=2*nprc(i)-1 + enddo + +! Determine locations of data and reference symbols + k=0 + mr1=0 + do i=1,nsym + if(pr(i).lt.0.0) then + k=k+1 + mdat(k)=i + else + mr2=i + if(mr1.eq.0) mr1=i + endif + enddo + nsig=k + +! Determine the reference symbols for each data symbol. + do k=1,nsig + m=mdat(k) + mref(k,1)=mr1 + do n=1,10 !Get ref symbol before data + if((m-n).gt.0) then + if (pr(m-n).gt.0.0) go to 10 + endif + enddo + go to 12 +10 mref(k,1)=m-n +12 mref(k,2)=mr2 + do n=1,10 !Get ref symbol after data + if((m+n).le.nsym) then + if (pr(m+n).gt.0.0) go to 20 + endif + enddo + go to 22 +20 mref(k,2)=m+n +22 enddo + +! Now do it all again, using opposite logic on pr(i) + k=0 + mr1=0 + do i=1,nsym + if(pr(i).gt.0.0) then + k=k+1 + mdat2(k)=i + else + mr2=i + if(mr1.eq.0) mr1=i + endif + enddo + nsig=k + + do k=1,nsig + m=mdat2(k) + mref2(k,1)=mr1 + do n=1,10 + if((m-n).gt.0) then + if (pr(m-n).lt.0.0) go to 110 + endif + enddo + go to 112 +110 mref2(k,1)=m-n +112 mref2(k,2)=mr2 + do n=1,10 + if((m+n).le.nsym) then + if (pr(m+n).lt.0.0) go to 120 + endif + enddo + go to 122 +120 mref2(k,2)=m+n +122 enddo + + return +end subroutine setup65 diff --git a/q65w/libm65/shell.f90 b/q65w/libm65/shell.f90 new file mode 100644 index 000000000..d7365bfc9 --- /dev/null +++ b/q65w/libm65/shell.f90 @@ -0,0 +1,27 @@ +subroutine shell(n,a) + integer n + real a(n) + integer i,j,inc + real v + + inc=1 +1 inc=3*inc+1 + if(inc.le.n) go to 1 +2 inc=inc/3 + + do i=inc+1,n + v=a(i) + j=i +3 if(a(j-inc).gt.v) then + a(j)=a(j-inc) + j=j-inc + if(j.le.inc) go to 4 + go to 3 + endif +4 a(j)=v + enddo + + if(inc.gt.1) go to 2 + + return +end subroutine shell diff --git a/q65w/libm65/sleep.h b/q65w/libm65/sleep.h new file mode 100644 index 000000000..df60bc92a --- /dev/null +++ b/q65w/libm65/sleep.h @@ -0,0 +1,32 @@ +/* + * sleep.h 1.0 02/03/10 + * + * Defines cross-platform sleep, usleep, etc. + * + * By Wu Yongwei + * + */ + +#ifndef _SLEEP_H +#define _SLEEP_H + +#ifdef _WIN32 +# if defined(_NEED_SLEEP_ONLY) && (defined(_MSC_VER) || defined(__MINGW32__)) +# include +# define sleep(t) _sleep((t) * 1000) +# else +# include +# define sleep(t) Sleep((t) * 1000) +# endif +# ifndef _NEED_SLEEP_ONLY +# define msleep(t) Sleep(t) +# define usleep(t) Sleep((t) / 1000) +# endif +#else +# include +# ifndef _NEED_SLEEP_ONLY +# define msleep(t) usleep((t) * 1000) +# endif +#endif + +#endif /* _SLEEP_H */ diff --git a/q65w/libm65/sleep_msec.f90 b/q65w/libm65/sleep_msec.f90 new file mode 100644 index 000000000..1a8dbe4f9 --- /dev/null +++ b/q65w/libm65/sleep_msec.f90 @@ -0,0 +1,4 @@ +subroutine sleep_msec(n) + call usleep(n*1000) + return +end subroutine sleep_msec diff --git a/q65w/libm65/smo.f90 b/q65w/libm65/smo.f90 new file mode 100644 index 000000000..c42de7c60 --- /dev/null +++ b/q65w/libm65/smo.f90 @@ -0,0 +1,19 @@ +subroutine smo(x,npts,y,nadd) + + real x(npts) + real y(npts) + + nh=nadd/2 + do i=1+nh,npts-nh + sum=0. + do j=-nh,nh + sum=sum + x(i+j) + enddo + y(i)=sum + enddo + x=y + x(:nh)=0. + x(npts-nh+1:)=0. + + return +end subroutine smo diff --git a/q65w/libm65/sort.f90 b/q65w/libm65/sort.f90 new file mode 100644 index 000000000..8a05da288 --- /dev/null +++ b/q65w/libm65/sort.f90 @@ -0,0 +1,6 @@ +subroutine sort(n,arr) + + call ssort(arr,tmp,n,1) + + return +end subroutine sort diff --git a/q65w/libm65/ssort.f b/q65w/libm65/ssort.f new file mode 100644 index 000000000..fa508ace6 --- /dev/null +++ b/q65w/libm65/ssort.f @@ -0,0 +1,287 @@ + subroutine ssort (x,y,n,kflag) +c***purpose sort an array and optionally make the same interchanges in +c an auxiliary array. the array may be sorted in increasing +c or decreasing order. a slightly modified quicksort +c algorithm is used. +c +c ssort sorts array x and optionally makes the same interchanges in +c array y. the array x may be sorted in increasing order or +c decreasing order. a slightly modified quicksort algorithm is used. +c +c description of parameters +c x - array of values to be sorted +c y - array to be (optionally) carried along +c n - number of values in array x to be sorted +c kflag - control parameter +c = 2 means sort x in increasing order and carry y along. +c = 1 means sort x in increasing order (ignoring y) +c = -1 means sort x in decreasing order (ignoring y) +c = -2 means sort x in decreasing order and carry y along. + + integer kflag, n +! real x(n), y(n) +! real r, t, tt, tty, ty + integer x(n), y(n) + integer r, t, tt, tty, ty + integer i, ij, j, k, kk, l, m, nn + integer il(21), iu(21) + + nn = n + if (nn .lt. 1) then +! print*,'ssort: The number of sort elements is not positive.' +! print*,'ssort: n = ',nn,' kflag = ',kflag + return + endif +c + kk = abs(kflag) + if (kk.ne.1 .and. kk.ne.2) then + print *, + + 'the sort control parameter, k, is not 2, 1, -1, or -2.' + return + endif +c +c alter array x to get decreasing order if needed +c + if (kflag .le. -1) then + do 10 i=1,nn + x(i) = -x(i) + 10 continue + endif +c + if (kk .eq. 2) go to 100 +c +c sort x only +c + m = 1 + i = 1 + j = nn + r = 0.375e0 +c + 20 if (i .eq. j) go to 60 + if (r .le. 0.5898437e0) then + r = r+3.90625e-2 + else + r = r-0.21875e0 + endif +c + 30 k = i +c +c select a central element of the array and save it in location t +c + ij = i + int((j-i)*r) + t = x(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + endif + l = j +c +c if last element of array is less than than t, interchange with t +c + if (x(j) .lt. t) then + x(ij) = x(j) + x(j) = t + t = x(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + endif + endif +c +c find an element in the second half of the array which is smaller +c than t +c + 40 l = l-1 + if (x(l) .gt. t) go to 40 +c +c find an element in the first half of the array which is greater +c than t +c + 50 k = k+1 + if (x(k) .lt. t) go to 50 +c +c interchange these elements +c + if (k .le. l) then + tt = x(l) + x(l) = x(k) + x(k) = tt + go to 40 + endif +c +c save upper and lower subscripts of the array yet to be sorted +c + if (l-i .gt. j-k) then + il(m) = i + iu(m) = l + i = k + m = m+1 + else + il(m) = k + iu(m) = j + j = l + m = m+1 + endif + go to 70 +c +c begin again on another portion of the unsorted array +c + 60 m = m-1 + if (m .eq. 0) go to 190 + i = il(m) + j = iu(m) +c + 70 if (j-i .ge. 1) go to 30 + if (i .eq. 1) go to 20 + i = i-1 +c + 80 i = i+1 + if (i .eq. j) go to 60 + t = x(i+1) + if (x(i) .le. t) go to 80 + k = i +c + 90 x(k+1) = x(k) + k = k-1 + if (t .lt. x(k)) go to 90 + x(k+1) = t + go to 80 +c +c sort x and carry y along +c + 100 m = 1 + i = 1 + j = nn + r = 0.375e0 +c + 110 if (i .eq. j) go to 150 + if (r .le. 0.5898437e0) then + r = r+3.90625e-2 + else + r = r-0.21875e0 + endif +c + 120 k = i +c +c select a central element of the array and save it in location t +c + ij = i + int((j-i)*r) + t = x(ij) + ty = y(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + y(ij) = y(i) + y(i) = ty + ty = y(ij) + endif + l = j +c +c if last element of array is less than t, interchange with t +c + if (x(j) .lt. t) then + x(ij) = x(j) + x(j) = t + t = x(ij) + y(ij) = y(j) + y(j) = ty + ty = y(ij) +c +c if first element of array is greater than t, interchange with t +c + if (x(i) .gt. t) then + x(ij) = x(i) + x(i) = t + t = x(ij) + y(ij) = y(i) + y(i) = ty + ty = y(ij) + endif + endif +c +c find an element in the second half of the array which is smaller +c than t +c + 130 l = l-1 + if (x(l) .gt. t) go to 130 +c +c find an element in the first half of the array which is greater +c than t +c + 140 k = k+1 + if (x(k) .lt. t) go to 140 +c +c interchange these elements +c + if (k .le. l) then + tt = x(l) + x(l) = x(k) + x(k) = tt + tty = y(l) + y(l) = y(k) + y(k) = tty + go to 130 + endif +c +c save upper and lower subscripts of the array yet to be sorted +c + if (l-i .gt. j-k) then + il(m) = i + iu(m) = l + i = k + m = m+1 + else + il(m) = k + iu(m) = j + j = l + m = m+1 + endif + go to 160 +c +c begin again on another portion of the unsorted array +c + 150 m = m-1 + if (m .eq. 0) go to 190 + i = il(m) + j = iu(m) +c + 160 if (j-i .ge. 1) go to 120 + if (i .eq. 1) go to 110 + i = i-1 +c + 170 i = i+1 + if (i .eq. j) go to 150 + t = x(i+1) + ty = y(i+1) + if (x(i) .le. t) go to 170 + k = i +c + 180 x(k+1) = x(k) + y(k+1) = y(k) + k = k-1 + if (t .lt. x(k)) go to 180 + x(k+1) = t + y(k+1) = ty + go to 170 +c +c clean up +c + 190 if (kflag .le. -1) then + do 200 i=1,nn + x(i) = -x(i) + 200 continue + endif + return + end diff --git a/q65w/libm65/sun.f90 b/q65w/libm65/sun.f90 new file mode 100644 index 000000000..ec011b66c --- /dev/null +++ b/q65w/libm65/sun.f90 @@ -0,0 +1,88 @@ +subroutine sun(y,m,DD,UT,lon,lat,RA,Dec,LST,Az,El,mjd,day) + + implicit none + + integer y !Year + integer m !Month + integer DD !Day + integer mjd !Modified Julian Date + real UT !UTC in hours + real RA,Dec !RA and Dec of sun + +! NB: Double caps here are single caps in the writeup. + +! Orbital elements of the Sun (also N=0, i=0, a=1): + real w !Argument of perihelion + real e !Eccentricity + real MM !Mean anomaly + real Ls !Mean longitude + +! Other standard variables: + real v !True anomaly + real EE !Eccentric anomaly + real ecl !Obliquity of the ecliptic + real d !Ephemeris time argument in days + real r !Distance to sun, AU + real xv,yv !x and y coords in ecliptic + real lonsun !Ecliptic long and lat of sun +! Ecliptic coords of sun (geocentric) + real xs,ys +! Equatorial coords of sun (geocentric) + real xe,ye,ze + real lon,lat + real GMST0,LST,HA + real xx,yy,zz + real xhor,yhor,zhor + real Az,El + + real day + real rad + data rad/57.2957795/ + +! Time in days, with Jan 0, 2000 equal to 0.0: + d=367*y - 7*(y+(m+9)/12)/4 + 275*m/9 + DD - 730530 + UT/24.0 + mjd=d + 51543 + ecl = 23.4393 - 3.563e-7 * d + +! Compute updated orbital elements for Sun: + w = 282.9404 + 4.70935e-5 * d + e = 0.016709 - 1.151e-9 * d + MM = mod(356.0470d0 + 0.9856002585d0 * d + 360000.d0,360.d0) + Ls = mod(w+MM+720.0,360.0) + + EE = MM + e*rad*sin(MM/rad) * (1.0 + e*cos(M/rad)) + EE = EE - (EE - e*rad*sin(EE/rad)-MM) / (1.0 - e*cos(EE/rad)) + + xv = cos(EE/rad) - e + yv = sqrt(1.0-e*e) * sin(EE/rad) + v = rad*atan2(yv,xv) + r = sqrt(xv*xv + yv*yv) + lonsun = mod(v + w + 720.0,360.0) +! Ecliptic coordinates of sun (rectangular): + xs = r * cos(lonsun/rad) + ys = r * sin(lonsun/rad) + +! Equatorial coordinates of sun (rectangular): + xe = xs + ye = ys * cos(ecl/rad) + ze = ys * sin(ecl/rad) + +! RA and Dec in degrees: + RA = rad*atan2(ye,xe) + Dec = rad*atan2(ze,sqrt(xe*xe + ye*ye)) + + GMST0 = (Ls + 180.0)/15.0 + LST = mod(GMST0+UT+lon/15.0+48.0,24.0) !LST in hours + HA = 15.0*LST - RA !HA in degrees + xx = cos(HA/rad)*cos(Dec/rad) + yy = sin(HA/rad)*cos(Dec/rad) + zz = sin(Dec/rad) + xhor = xx*sin(lat/rad) - zz*cos(lat/rad) + yhor = yy + zhor = xx*cos(lat/rad) + zz*sin(lat/rad) + Az = mod(rad*atan2(yhor,xhor) + 180.0 + 360.0,360.0) + El = rad*asin(zhor) + day=d-1.5 + + return +end subroutine sun diff --git a/q65w/libm65/symspec.f90 b/q65w/libm65/symspec.f90 new file mode 100644 index 000000000..e4160cfd1 --- /dev/null +++ b/q65w/libm65/symspec.f90 @@ -0,0 +1,224 @@ +subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & + fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, & + pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) + +! k pointer to the most recent new data +! nxpol 0/1 to indicate single- or dual-polarization +! ndiskdat 0/1 to indicate if data from disk +! nb 0/1 status of noise blanker +! idphi Phase correction for Y channel, degrees +! nfsample sample rate (Hz) +! fgreen Frequency of green marker in I/Q calibrate mode (-48.0 to +48.0 kHz) +! iqadjust 0/1 to indicate whether IQ adjustment is active +! iqapply 0/1 to indicate whether to apply I/Q calibration +! pxdb power in x channel (0-60 dB) +! pydb power in y channel (0-60 dB) +! ssz5a polarized spectrum, for waterfall display +! nkhz integer kHz portion of center frequency, e.g., 125 for 144.125 +! ihsym index number of this half-symbol (1-322) +! nzap number of samples zero'ed by noise blanker + + include 'njunk.f90' + parameter (NSMAX=60*96000) !Total sample intervals per minute + parameter (NFFT=32768) !Length of FFTs + real*8 ts,hsym + real*8 fcenter + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc, & + junk(NJUNK) + real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) + complex z,zfac + complex zsumx,zsumy + complex cx(NFFT),cy(NFFT) + complex cx00(NFFT),cy00(NFFT) + complex cx0(0:1023),cx1(0:1023) + complex cy0(0:1023),cy1(0:1023) + logical*1 lstrong(0:1023) + data rms/999.0/,k0/99999999/,nadjx/0/,nadjy/0/ + save + + nfast=1 + if(k.gt.5751000) go to 999 + if(k.lt.NFFT) then + ihsym=0 + go to 999 !Wait for enough samples to start + endif + if(k0.eq.99999999) then + pi=4.0*atan(1.0) + w2a=0. + w2b=0. + do i=1,NFFT + w(i)=(sin(i*pi/NFFT))**2 !Window for nfast=1 + if(i.lt.17833) w2a(i)=(sin(i*pi/17832.925))**2 !Window a for nfast=2 + j=i-8916 + if(j.gt.0 .and. j.lt.17833) w2b(i)=(sin(j*pi/17832.925))**2 ! b + enddo + w2a=sqrt(2.0)*w2a + w2b=sqrt(2.0)*w2b + endif + + hsym=2048.d0*96000.d0/11025.d0 !Samples per JT65 half-symbol + if(nfsample.eq.95238) hsym=2048.d0*95238.1d0/11025.d0 + + if(k.lt.k0) then + ts=1.d0 - hsym + savg=0. + ihsym=0 + k1=0 + if(ndiskdat.eq.0) dd(1:4,k+1:5760000)=0. !### Should not be needed ??? ### + endif + k0=k + + nzap=0 + sigmas=1.5*(10.0**(0.01*nbslider)) + 0.7 + peaklimit=sigmas*max(10.0,rms) + faclim=3.0 + px=0. + py=0. + + iqapply0=0 + iqadjust0=0 + if(iqadjust.ne.0) iqapply0=0 + nwindow=2 +! nwindow=0 !### No windowing ### + nfft2=1024 + kstep=nfft2 + if(nwindow.ne.0) kstep=nfft2/2 + nblks=(k-k1)/kstep + do nblk=1,nblks + j=k1+1 + do i=0,nfft2-1 + cx0(i)=cmplx(dd(1,j+i),dd(2,j+i)) + if(nxpol.ne.0) cy0(i)=cmplx(dd(3,j+i),dd(4,j+i)) + enddo + call timf2(k,nxpol,nfft2,nwindow,nb,peaklimit,iqadjust0,iqapply0, & + faclim,cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong, & + px,py,nzap) + + do i=0,kstep-1 + dd(1,j+i)=real(cx1(i)) + dd(2,j+i)=aimag(cx1(i)) + if(nxpol.ne.0) then + dd(3,j+i)=real(cy1(i)) + dd(4,j+i)=aimag(cy1(i)) + endif + enddo + k1=k1+kstep + enddo + + npts=NFFT !Samples used in each half-symbol FFT + + ts=ts+hsym + ja=ts !Index of first sample + jb=ja+npts-1 !Last sample + + i=0 + fac=0.0002 + dphi=idphi/57.2957795 + zfac=fac*cmplx(cos(dphi),sin(dphi)) + do j=ja,jb !Copy data into cx, cy + x1=dd(1,j) + x2=dd(2,j) + if(nxpol.ne.0) then + x3=dd(3,j) + x4=dd(4,j) + else + x3=0. + x4=0. + endif + i=i+1 + cx(i)=fac*cmplx(x1,x2) + cy(i)=zfac*cmplx(x3,x4) !NB: cy includes dphi correction + enddo + + if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then + nsum=nblks*kstep - nzap + if(nsum.le.0) nsum=1 + rmsx=sqrt(0.5*px/nsum) + rmsy=sqrt(0.5*py/nsum) + rms=rmsx + if(nxpol.ne.0) rms=sqrt((px+py)/(4.0*nsum)) + endif + pxdb=0. + pydb=0. + if(rmsx.gt.1.0) pxdb=20.0*log10(rmsx) + if(rmsy.gt.1.0) pydb=20.0*log10(rmsy) + if(pxdb.gt.60.0) pxdb=60.0 + if(pydb.gt.60.0) pydb=60.0 + + cx00=cx + if(nxpol.ne.0) cy00=cy + + do mm=1,nfast + ihsym=ihsym+1 + if(nfast.eq.1) then + cx=w*cx00 !Apply window for 2nd forward FFT + if(nxpol.ne.0) cy=w*cy00 + else + if(mm.eq.1) then + cx=w2a*cx00 + if(nxpol.ne.0) cy=w2a*cy00 + else + cx=w2b*cx00 + if(nxpol.ne.0) cy=w2b*cy00 + endif + endif + + call four2a(cx,NFFT,1,1,1) !Second forward FFT (X) + if(iqadjust.eq.0) nadjx=0 + if(iqadjust.ne.0 .and. nadjx.lt.50) call iqcal(nadjx,cx,NFFT, & + gainx,phasex,zsumx,ipkx,rejectx0) + if(iqapply.ne.0) call iqfix(cx,NFFT,gainx,phasex) + + if(nxpol.ne.0) then + call four2a(cy,NFFT,1,1,1) !Second forward FFT (Y) + if(iqadjust.eq.0) nadjy=0 + if(iqadjust.ne.0 .and. nadjy.lt.50) call iqcal(nadjy,cy,NFFT, & + gainy,phasey,zsumy,ipky,rejecty) + if(iqapply.ne.0) call iqfix(cy,NFFT,gainy,phasey) + endif + + n=min(322,ihsym) + do i=1,NFFT + sx=real(cx(i))**2 + aimag(cx(i))**2 + ss(1,n,i)=sx ! Pol = 0 + savg(1,i)=savg(1,i) + sx + + if(nxpol.ne.0) then + z=cx(i) + cy(i) + s45=0.5*(real(z)**2 + aimag(z)**2) + ss(2,n,i)=s45 ! Pol = 45 + savg(2,i)=savg(2,i) + s45 + + sy=real(cy(i))**2 + aimag(cy(i))**2 + ss(3,n,i)=sy ! Pol = 90 + savg(3,i)=savg(3,i) + sy + + z=cx(i) - cy(i) + s135=0.5*(real(z)**2 + aimag(z)**2) + ss(4,n,i)=s135 ! Pol = 135 + savg(4,i)=savg(4,i) + s135 + + z=cx(i)*conjg(cy(i)) + q=sx - sy + u=2.0*real(z) + ssz5a(i)=0.707*sqrt(q*q + u*u) !Spectrum of linear polarization +! Leif's formula: +! ssz5a(i)=0.5*(sx+sy) + (real(z)**2 + aimag(z)**2 - sx*sy)/(sx+sy) + else + ssz5a(i)=sx + endif + enddo + enddo + + if(ihsym.eq.278) then + if(iqadjust.ne.0 .and. ipkx.ne.0 .and. ipky.ne.0) then + rejectx=10.0*log10(savg(1,1+nfft-ipkx)/savg(1,1+ipkx)) + rejecty=10.0*log10(savg(3,1+nfft-ipky)/savg(3,1+ipky)) + endif + endif + + nkhz=nint(1000.d0*(fcenter-int(fcenter))) + if(fcenter.eq.0.d0) nkhz=125 + +999 return +end subroutine symspec diff --git a/q65w/libm65/synctest.f90 b/q65w/libm65/synctest.f90 new file mode 100644 index 000000000..a710daa13 --- /dev/null +++ b/q65w/libm65/synctest.f90 @@ -0,0 +1,57 @@ +program synctest + + ! Program to test an algorithm for detecting sync signals for both + ! JT65 and Q65-60x signals and rejecting birdies in MAP65 data. + ! The important work is done in module wideband_sync. + + use timer_module, only: timer + use timer_impl, only: init_timer, fini_timer + use wideband_sync + + real ss(4,322,NFFT),savg(4,NFFT) +! real candidate(MAX_CANDIDATES,5) !snr1,f0,xdt0,ipol,flip + character*8 arg + type(candidate) :: cand(MAX_CANDIDATES) + + nargs=iargc() + if(nargs.ne.5) then + print*,'Usage: synctest iutc nfa nfb nts_jt65 nts_q65' + print*,'Example: synctest 1814 23 83 2 1' + go to 999 + endif + call getarg(1,arg) + read (arg,*) iutc + call getarg(2,arg) + read (arg,*) nfa + call getarg(3,arg) + read (arg,*) nfb + call getarg(4,arg) + read (arg,*) nts_jt65 + call getarg(5,arg) + read (arg,*) nts_q65 + + open(50,file='50.a',form='unformatted',status='old') + do ifile=1,9999 + read(50,end=998) nutc,npol,ss(1:npol,:,:),savg(1:npol,:) + if(nutc.eq.iutc) exit + enddo + close(50) + + call init_timer('timer.out') + call timer('synctest',0) + + call timer('get_cand',0) + call get_candidates(ss,savg,302,.true.,nfa,nfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + + do k=1,ncand + write(*,1010) k,cand(k)%snr,cand(k)%f,cand(k)%f+77,cand(k)%xdt, & + cand(k)%ipol,cand(k)%iflip +1010 format(i3,4f10.3,2i3) + enddo + +998 call timer('synctest',1) + call timer('synctest',101) + call fini_timer() + +999 end program synctest diff --git a/q65w/libm65/synctst.f90 b/q65w/libm65/synctst.f90 new file mode 100644 index 000000000..248c7e197 --- /dev/null +++ b/q65w/libm65/synctst.f90 @@ -0,0 +1,84 @@ +program synctst + +! Tests JT65B2 sync patterns + + parameter (LAGMAX=20) + real ccf0(0:LAGMAX),ccf2(0:LAGMAX),ccf3(0:LAGMAX) + character*12 arg + integer npr(126),np0(126),np1(126),npr2(126) + data npr/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: synctst iters' + go to 999 + endif + call getarg(1,arg) + read(arg,*) iters + + worst=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr(i)*npr(lag+i) + enddo + ccf0(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf0(lag).gt.worst) worst=ccf0(lag) + enddo + + best2=1.0 + do iter=1,iters + +10 np0=0 + np1=0 + n0=0 + do i=1,126 + if(npr(i).eq.1) then + call random_number(r) + if(r.lt.0.5) then + np0(i)=1 + n0=n0+1 + else + np1(i)=1 + endif + endif + enddo + if(n0.ne.31 .and. n0.ne.32) go to 10 + + worst2=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + np0(i)*np0(lag+i) + np1(i)*np1(lag+i) + enddo + ccf2(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf2(lag).gt.worst2) then + worst2=ccf2(lag) + lagbad=lag + endif + enddo + if(worst2.lt.best2) then + best2=worst2 + lagbest=lagbad + n0best=n0 + ccf3=ccf2 + npr2=np0 + 2*np1 + endif + enddo + + do lag=0,LAGMAX + write(13,1100) lag,ccf0(lag),ccf3(lag) +1100 format(i3,2f10.3) + enddo + + print*,worst,best2,n0best,lagbest + write(*,1110) npr2 +1110 format((8x,20(i1,','))) + +999 end program synctst diff --git a/q65w/libm65/synctst2.f90 b/q65w/libm65/synctst2.f90 new file mode 100644 index 000000000..8ff4971a3 --- /dev/null +++ b/q65w/libm65/synctst2.f90 @@ -0,0 +1,91 @@ +program synctst2 + +! Tests JT65B2 sync patterns + + parameter (LAGMAX=20) + real ccf0(0:LAGMAX),ccf1(0:LAGMAX),ccf2(0:LAGMAX),ccf3(0:LAGMAX) + character arg*12,line*64 + integer*8 n8 + integer npr(126),np0(126),np1(126),npr1(126),npr2(126) + data npr/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + + data npr2/1,0,0,1,2,0,0,0,2,1,1,2,2,2,0,2,0,2,0,0, & + 0,1,0,2,1,0,0,1,0,0,0,2,1,1,0,0,1,1,2,2, & + 0,2,2,0,2,1,1,1,0,0,0,1,2,0,1,0,2,0,1,1, & + 0,0,2,2,0,1,0,1,0,2,0,0,2,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,2,0,2,0,0,2,0,2,1,0,1, & + 0,2,0,1,0,0,2,2,0,0,1,0,0,2,0,0,0,0,1,1, & + 1,2,1,2,1,2/ + + data n8/x'4314f4725bb357e0'/ + + write(*,1102) n8 + write(line,1102) n8 +1102 format(b63) + read(line,1104) npr1(1:63) +1104 format(63i1) + npr1(64:126)=npr1(1:63) + + worst=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr(i)*npr(lag+i) + enddo + ccf0(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf0(lag).gt.worst) worst=ccf0(lag) + enddo + + + worst1=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + npr1(i)*npr1(lag+i) + enddo + ccf1(lag)=(63.0/64.0)*2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf1(lag).gt.worst1) worst1=ccf1(lag) + enddo + ccf1=ccf1/ccf1(0) + worst1=worst1/ccf1(0) + + np0=0 + np1=0 + n0=0 + do i=1,126 + if(npr2(i).eq.1) then + np0(i)=1 + n0=n0+1 + else if(npr2(i).eq.2) then + np1(i)=1 + endif + enddo + + worst2=0. + do lag=0,LAGMAX + nsum=0 + do i=1,126-lag + nsum=nsum + np0(i)*np0(lag+i) + np1(i)*np1(lag+i) + enddo + ccf2(lag)=2.0*nsum/(126.0-lag) + if(lag.ge.1 .and. ccf2(lag).gt.worst2) then + worst2=ccf2(lag) + lagbad=lag + endif + enddo + + do lag=0,LAGMAX + write(13,1100) lag,ccf0(lag),ccf1(lag),ccf2(lag) +1100 format(i3,3f10.3) + enddo + + print*,worst,worst1,worst2,n0,lagbad + + +999 end program synctst2 diff --git a/q65w/libm65/tastro.f90 b/q65w/libm65/tastro.f90 new file mode 100644 index 000000000..fac5c8003 --- /dev/null +++ b/q65w/libm65/tastro.f90 @@ -0,0 +1,35 @@ +program tastro + + implicit real*8 (a-h,o-z) + + character grid*6 + character*9 cauxra,cauxdec + + character*12 clock(3) + integer nt(8) + equivalence (nt(1),nyear) + + grid='FN20qi' + nfreq=144 + cauxra='00:00:00' + +10 call date_and_time(clock(1),clock(2),clock(3),nt) + ih=ihour-ntz/60 + if(ih.le.0) then + ih=ih+24 + nday=nday+1 + endif + uth8=ih + imin/60.d0 + isec/3600.d0 + ims/3600000.d0 + call astro0(nyear,month,nday,uth8,nfreq,grid,cauxra,cauxdec, & + AzSun8,ElSun8,AzMoon8,ElMoon8,AzMoonB8,ElMoonB8,ntsky,ndop,ndop00, & + dbMoon8,RAMoon8,DecMoon8,HA8,Dgrd8,sd8,poloffset8,xnr8,dfdt,dfdt0, & + RaAux8,DecAux8,AzAux8,ElAux8,width1,width2,w501,w502,xlst8) + + write(*,1010) nyear,month,nday,ih,imin,isec,AzMoon8,ElMoon8, & + AzSun8,ElSun8,ndop,dgrd8,ntsky +1010 format(i4,i3,i3,i4.2,':',i2.2,':',i2.2,4f8.1,i6,f6.1,i6) + + call system('sleep 1') + go to 10 + +end program tastro diff --git a/q65w/libm65/timeval.h b/q65w/libm65/timeval.h new file mode 100644 index 000000000..83c77d5a1 --- /dev/null +++ b/q65w/libm65/timeval.h @@ -0,0 +1,76 @@ +/* + * timeval.h 1.0 01/12/19 + * + * Defines gettimeofday, timeval, etc. for Win32 + * + * By Wu Yongwei + * + */ + +#ifndef _TIMEVAL_H +#define _TIMEVAL_H + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#include +#include + +#ifndef __GNUC__ +#define EPOCHFILETIME (116444736000000000i64) +#else +#define EPOCHFILETIME (116444736000000000LL) +#endif + +//struct timeval { +// long tv_sec; /* seconds */ +// long tv_usec; /* microseconds */ +//}; + +/* +struct timezone { + int tz_minuteswest; // minutes W of Greenwich +int tz_dsttime; // type of dst correction +}; +*/ + +__inline int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + LARGE_INTEGER li; + __int64 t; + static int tzflag; + + if (tv) + { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + t = li.QuadPart; /* In 100-nanosecond intervals */ + t -= EPOCHFILETIME; /* Offset to the Epoch time */ + t /= 10; /* In microseconds */ + tv->tv_sec = (long)(t / 1000000); + tv->tv_usec = (long)(t % 1000000); + } + + if (tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} + +#else /* _WIN32 */ + +#include + +#endif /* _WIN32 */ + +#endif /* _TIMEVAL_H */ diff --git a/q65w/libm65/timf2.f90 b/q65w/libm65/timf2.f90 new file mode 100644 index 000000000..4873d0e95 --- /dev/null +++ b/q65w/libm65/timf2.f90 @@ -0,0 +1,215 @@ +subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & + cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong,px,py,nzap) + +! Sequential processing of time-domain I/Q data, using Linrad-like +! "first FFT" and "first backward FFT". + +! cx0,cy0 - complex input data +! nfft - length of FFTs +! nwindow - 0 for no window, 2 for sin^2 window +! iqapply - 0/1 determines if I/Q phase and amplitude corrections applied +! gainx,y - gain error in Q channel, relative to I +! phasex,y - phase error +! cx1,cy1 - output data + +! Non-windowed processing means no overlap, so kstep=nfft. +! Sin^2 window has 50% overlap, kstep=nfft/2. + +! Frequencies with strong signals are identified and separated. The back +! transforms are done separately for weak and strong signals, so that +! noise blanking can be applied to the weak-signal portion. Strong and +! weak are finally re-combined in the time domain. + + parameter (MAXFFT=1024,MAXNH=MAXFFT/2) + parameter (MAXSIGS=100) + complex cx0(0:nfft-1),cx1(0:nfft-1) + complex cy0(0:nfft-1),cy1(0:nfft-1) + complex cx(0:MAXFFT-1),cxt(0:MAXFFT-1) + complex cy(0:MAXFFT-1),cyt(0:MAXFFT-1) + complex cxs(0:MAXFFT-1),covxs(0:MAXNH-1) !Strong X signals + complex cys(0:MAXFFT-1),covys(0:MAXNH-1) !Strong Y signals + complex cxw(0:MAXFFT-1),covxw(0:MAXNH-1) !Weak X signals + complex cyw(0:MAXFFT-1),covyw(0:MAXNH-1) !Weak Y signals + real*4 w(0:MAXFFT-1) + real*4 s(0:MAXFFT-1) + logical*1 lstrong(0:MAXFFT-1),lprev + integer ia(MAXSIGS),ib(MAXSIGS) + complex h,u,v + logical first + data first/.true./ + data k0/99999999/ + save + + if(faclim+iqadjust.eq.-9999.0) iqadjust=0 !Silence compiler warning. + if(first) then + pi=4.0*atan(1.0) + do i=0,nfft-1 + w(i)=(sin(i*pi/nfft))**2 + enddo + s=0. + nh=nfft/2 + kstep=nfft + if(nwindow.eq.2) kstep=nh + fac=1.0/nfft + slimit=1.e30 + first=.false. + endif + + if(k.lt.k0) then + covxs=0. + covxw=0. + covys=0. + covyw=0. + endif + k0=k + + cx(0:nfft-1)=cx0 + if(nwindow.eq.2) cx(0:nfft-1)=w(0:nfft-1)*cx(0:nfft-1) + call four2a(cx,nfft,1,1,1) !First forward FFT (X) + + if(nxpol.ne.0) then + cy(0:nfft-1)=cy0 + if(nwindow.eq.2) cy(0:nfft-1)=w(0:nfft-1)*cy(0:nfft-1) + call four2a(cy,nfft,1,1,1) !First forward FFT (Y) + endif + + if(iqapply.ne.0) then !Apply I/Q corrections (X) + h=gainx*cmplx(cos(phasex),sin(phasex)) + v=0. + do i=0,nfft-1 + u=cx(i) + if(i.gt.0) v=cx(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + cxt(i)=0.5*cmplx(x,y) + enddo + else + cxt(0:nfft-1)=cx(0:nfft-1) + endif + + if(nxpol.ne.0) then + if(iqapply.ne.0) then !Apply I/Q corrections (Y) + h=gainy*cmplx(cos(phasey),sin(phasey)) + v=0. + do i=0,nfft-1 + u=cy(i) + if(i.gt.0) v=cy(nfft-i) + x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & + (real(u) - real(v))*real(h) + y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & + (real(u) - real(v))*aimag(h) + cyt(i)=0.5*cmplx(x,y) + enddo + else + cyt(0:nfft-1)=cy(0:nfft-1) + endif + endif + +! Identify frequencies with strong signals, copy frequency-domain +! data into array cs (strong) or cw (weak). + + do i=0,nfft-1 + p=real(cxt(i))**2 + aimag(cxt(i))**2 + if(nxpol.ne.0) p=p + real(cyt(i))**2 + aimag(cyt(i))**2 + s(i)=p + enddo + ave=sum(s(0:nfft-1))/nfft + lstrong(0:nfft-1)=s(0:nfft-1).gt.10.0*ave + + nsigs=0 + lprev=.false. + iwid=1 + ib=-99 + do i=0,nfft-1 + if(lstrong(i) .and. (.not.lprev)) then + if(nsigs.lt.MAXSIGS) nsigs=nsigs+1 + ia(nsigs)=i-iwid + if(ia(nsigs).lt.0) ia(nsigs)=0 + endif + if(.not.lstrong(i) .and. lprev) then + ib(nsigs)=i-1+iwid + if(ib(nsigs).gt.nfft-1) ib(nsigs)=nfft-1 + endif + lprev=lstrong(i) + enddo + + if(nsigs.gt.0) then + do i=1,nsigs + ja=ia(i) + jb=ib(i) + if(ja.lt.0 .or. ja.gt.nfft-1 .or. jb.lt.0 .or. jb.gt.nfft-1) then + cycle + endif + if(jb.eq.-99) jb=ja + min(2*iwid,nfft-1) + lstrong(ja:jb)=.true. + enddo + endif + + do i=0,nfft-1 + if(lstrong(i)) then + cxs(i)=fac*cxt(i) + cxw(i)=0. + if(nxpol.ne.0) then + cys(i)=fac*cyt(i) + cyw(i)=0. + endif + else + cxw(i)=fac*cxt(i) + cxs(i)=0. + if(nxpol.ne.0) then + cyw(i)=fac*cyt(i) + cys(i)=0. + endif + endif + enddo + + call four2a(cxw,nfft,1,-1,1) !Transform weak and strong X + call four2a(cxs,nfft,1,-1,1) !back to time domain, separately + + if(nxpol.ne.0) then + call four2a(cyw,nfft,1,-1,1) !Transform weak and strong Y + call four2a(cys,nfft,1,-1,1) !back to time domain, separately + endif + + if(nwindow.eq.2) then + cxw(0:nh-1)=cxw(0:nh-1)+covxw(0:nh-1) !Add previous segment's 2nd half + covxw(0:nh-1)=cxw(nh:nfft-1) !Save 2nd half + cxs(0:nh-1)=cxs(0:nh-1)+covxs(0:nh-1) !Ditto for strong signals + covxs(0:nh-1)=cxs(nh:nfft-1) + + if(nxpol.ne.0) then + cyw(0:nh-1)=cyw(0:nh-1)+covyw(0:nh-1) !Add previous segment's 2nd half + covyw(0:nh-1)=cyw(nh:nfft-1) !Save 2nd half + cys(0:nh-1)=cys(0:nh-1)+covys(0:nh-1) !Ditto for strong signals + covys(0:nh-1)=cys(nh:nfft-1) + endif + endif + +! Apply noise blanking to weak data + if(nb.ne.0) then + do i=0,kstep-1 + peak=abs(cxw(i)) + if(nxpol.ne.0) peak=max(peak,abs(cyw(i))) + if(peak.gt.peaklimit) then + cxw(i)=0. + if(nxpol.ne.0) cyw(i)=0. + nzap=nzap+1 + endif + enddo + endif + +! Compute power levels from weak data only + do i=0,kstep-1 + px=px + real(cxw(i))**2 + aimag(cxw(i))**2 + if(nxpol.ne.0) py=py + real(cyw(i))**2 + aimag(cyw(i))**2 + enddo + + cx1(0:kstep-1)=cxw(0:kstep-1) + cxs(0:kstep-1) !Weak + strong (X) + if(nxpol.ne.0) then + cy1(0:kstep-1)=cyw(0:kstep-1) + cys(0:kstep-1) !Weak + strong (Y) + endif + + return +end subroutine timf2 diff --git a/q65w/libm65/tm2.f90 b/q65w/libm65/tm2.f90 new file mode 100644 index 000000000..fb831fab6 --- /dev/null +++ b/q65w/libm65/tm2.f90 @@ -0,0 +1,14 @@ +subroutine tm2(day,xlat4,xlon4,xl4,b4) + + implicit real*8 (a-h,o-z) + parameter (RADS=0.0174532925199433d0) + + real*4 xlat4,xlon4,xl4,b4 + + glat=xlat4*RADS + glong=xlon4*RADS + call tmoonsub(day,glat,glong,el,rv,xl,b,pax) + xl4=xl + b4=b + +end subroutine tm2 diff --git a/q65w/libm65/tmoonsub.c b/q65w/libm65/tmoonsub.c new file mode 100644 index 000000000..29ac28b49 --- /dev/null +++ b/q65w/libm65/tmoonsub.c @@ -0,0 +1,514 @@ +#include +#include +#include + +#define RADS 0.0174532925199433 +#define DEGS 57.2957795130823 +#define TPI 6.28318530717959 +#define PI 3.1415927 + +/* ratio of earth radius to astronomical unit */ +#define ER_OVER_AU 0.0000426352325194252 + +/* all prototypes here */ + +double getcoord(int coord); +void getargs(int argc, char *argv[], int *y, int *m, double *tz, double *glong, double *glat); +double range(double y); +double rangerad(double y); +double days(int y, int m, int dn, double hour); +double days_(int *y, int *m, int *dn, double *hour); +void moonpos(double, double *, double *, double *); +void sunpos(double , double *, double *, double *); +double moontransit(int y, int m, int d, double timezone, double glat, double glong, int *nt); +double atan22(double y, double x); +double epsilon(double d); +void equatorial(double d, double *lon, double *lat, double *r); +void ecliptic(double d, double *lon, double *lat, double *r); +double gst(double d); +void topo(double lst, double glat, double *alp, double *dec, double *r); +double alt(double glat, double ha, double dec); +void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p); +void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill); +int daysinmonth(int y, int m); +int isleap(int y); +void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, + double *mrv, double *l, double *b, double *paxis); + +static const char +*usage = " Usage: tmoon date[yyyymm] timz[+/-h.hh] long[+/-dddmm] lat[+/-ddmm]\n" + "example: tmoon 200009 0 -00155 5230\n"; + +/* + getargs() gets the arguments from the command line, does some basic error + checking, and converts arguments into numerical form. Arguments are passed + back in pointers. Error messages print to stderr so re-direction of output + to file won't leave users blind. Error checking prints list of all errors + in a command line before quitting. +*/ +void getargs(int argc, char *argv[], int *y, int *m, double *tz, + double *glong, double *glat) { + + int date, latitude, longitude; + int mflag = 0, yflag = 0, longflag = 0, latflag = 0, tzflag = 0; + int longminflag = 0, latminflag = 0, dflag = 0; + + /* if not right number of arguments, then print example command line */ + + if (argc !=5) { + fprintf(stderr, usage); + exit(EXIT_FAILURE); + } + + date = atoi(argv[1]); + *y = date / 100; + *m = date - *y * 100; + *tz = (double) atof(argv[2]); + longitude = atoi(argv[3]); + latitude = atoi(argv[4]); + *glong = RADS * getcoord(longitude); + *glat = RADS * getcoord(latitude); + + /* set a flag for each error found */ + + if (*m > 12 || *m < 1) mflag = 1; + if (*y > 2500) yflag = 1; + if (date < 150001) dflag = 1; + if (fabs((float) *glong) > 180 * RADS) longflag = 1; + if (abs(longitude) % 100 > 59) longminflag = 1; + if (fabs((float) *glat) > 90 * RADS) latflag = 1; + if (abs(latitude) % 100 > 59) latminflag = 1; + if (fabs((float) *tz) > 12) tzflag = 1; + + /* print all the errors found */ + + if (dflag == 1) { + fprintf(stderr, "date: dates must be in form yyyymm, gregorian, and later than 1500 AD\n"); + } + if (yflag == 1) { + fprintf(stderr, "date: too far in future - accurate from 1500 to 2500\n"); + } + if (mflag == 1) { + fprintf(stderr, "date: month must be in range 0 to 12, eg - August 2000 is entered as 200008\n"); + } + if (tzflag == 1) { + fprintf(stderr, "timz: must be in range +/- 12 hours, eg -6 for Chicago\n"); + } + if (longflag == 1) { + fprintf(stderr, "long: must be in range +/- 180 degrees\n"); + } + if (longminflag == 1) { + fprintf(stderr, "long: last two digits are arcmin - max 59\n"); + } + if (latflag == 1) { + fprintf(stderr, " lat: must be in range +/- 90 degrees\n"); + } + if (latminflag == 1) { + fprintf(stderr, " lat: last two digits are arcmin - max 59\n"); + } + + /* quits if one or more flags set */ + + if (dflag + mflag + yflag + longflag + latflag + tzflag + longminflag + latminflag > 0) { + exit(EXIT_FAILURE); + } + +} + +/* + returns coordinates in decimal degrees given the + coord as a ddmm value stored in an integer. +*/ +double getcoord(int coord) { + int west = 1; + double glg, deg; + if (coord < 0) west = -1; + glg = fabs((double) coord/100); + deg = floor(glg); + glg = west* (deg + (glg - deg)*100 / 60); + return(glg); +} + +/* + days() takes the year, month, day in the month and decimal hours + in the day and returns the number of days since J2000.0. + Assumes Gregorian calendar. +*/ +double days(int y, int m, int d, double h) { + int a, b; + double day; + + /* + The lines below work from 1900 march to feb 2100 + a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9 + d; + day = (double)a - 730531.5 + hour / 24; + */ + + /* These lines work for any Gregorian date since 0 AD */ + if (m ==1 || m==2) { + m +=12; + y -= 1; + } + a = y / 100; + b = 2 - a + a/4; + day = floor(365.25*(y + 4716)) + floor(30.6001*(m + 1)) + + d + b - 1524.5 - 2451545 + h/24; + return(day); +} +double days_(int *y0, int *m0, int *d0, double *h0) +{ + return days(*y0,*m0,*d0,*h0); +} + +/* +Returns 1 if y a leap year, and 0 otherwise, according +to the Gregorian calendar +*/ +int isleap(int y) { + int a = 0; + if(y % 4 == 0) a = 1; + if(y % 100 == 0) a = 0; + if(y % 400 == 0) a = 1; + return(a); +} + +/* +Given the year and the month, function returns the +number of days in the month. Valid for Gregorian +calendar. +*/ +int daysinmonth(int y, int m) { + int b = 31; + if(m == 2) { + if(isleap(y) == 1) b= 29; + else b = 28; + } + if(m == 4 || m == 6 || m == 9 || m == 11) b = 30; + return(b); +} + +/* +moonpos() takes days from J2000.0 and returns ecliptic coordinates +of moon in the pointers. Note call by reference. +This function is within a couple of arcminutes most of the time, +and is truncated from the Meeus Ch45 series, themselves truncations of +ELP-2000. Returns moon distance in earth radii. +Terms have been written out explicitly rather than using the +table based method as only a small number of terms is +retained. +*/ +void moonpos(double d, double *lambda, double *beta, double *rvec) { + double dl, dB, dR, L, D, M, M1, F, e, lm, bm, rm, t; + + t = d / 36525; + + L = range(218.3164591 + 481267.88134236 * t) * RADS; + D = range(297.8502042 + 445267.1115168 * t) * RADS; + M = range(357.5291092 + 35999.0502909 * t) * RADS; + M1 = range(134.9634114 + 477198.8676313 * t - .008997 * t * t) * RADS; + F = range(93.27209929999999 + 483202.0175273 * t - .0034029*t*t)*RADS; + e = 1 - .002516 * t; + + dl = 6288774 * sin(M1); + dl += 1274027 * sin(2 * D - M1); + dl += 658314 * sin(2 * D); + dl += 213618 * sin(2 * M1); + dl -= e * 185116 * sin(M); + dl -= 114332 * sin(2 * F) ; + dl += 58793 * sin(2 * D - 2 * M1); + dl += e * 57066 * sin(2 * D - M - M1) ; + dl += 53322 * sin(2 * D + M1); + dl += e * 45758 * sin(2 * D - M); + dl -= e * 40923 * sin(M - M1); + dl -= 34720 * sin(D) ; + dl -= e * 30383 * sin(M + M1) ; + dl += 15327 * sin(2 * D - 2 * F) ; + dl -= 12528 * sin(M1 + 2 * F); + dl += 10980 * sin(M1 - 2 * F); + lm = rangerad(L + dl / 1000000 * RADS); + + dB = 5128122 * sin(F); + dB += 280602 * sin(M1 + F); + dB += 277693 * sin(M1 - F); + dB += 173237 * sin(2 * D - F); + dB += 55413 * sin(2 * D - M1 + F); + dB += 46271 * sin(2 * D - M1 - F); + dB += 32573 * sin(2 * D + F); + dB += 17198 * sin(2 * M1 + F); + dB += 9266 * sin(2 * D + M1 - F); + dB += 8822 * sin(2 * M1 - F); + dB += e * 8216 * sin(2 * D - M - F); + dB += 4324 * sin(2 * D - 2 * M1 - F); + bm = dB / 1000000 * RADS; + + dR = -20905355 * cos(M1); + dR -= 3699111 * cos(2 * D - M1); + dR -= 2955968 * cos(2 * D); + dR -= 569925 * cos(2 * M1); + dR += e * 48888 * cos(M); + dR -= 3149 * cos(2 * F); + dR += 246158 * cos(2 * D - 2 * M1); + dR -= e * 152138 * cos(2 * D - M - M1) ; + dR -= 170733 * cos(2 * D + M1); + dR -= e * 204586 * cos(2 * D - M); + dR -= e * 129620 * cos(M - M1); + dR += 108743 * cos(D); + dR += e * 104755 * cos(M + M1); + dR += 79661 * cos(M1 - 2 * F); + rm = 385000.56 + dR / 1000; + + *lambda = lm; + *beta = bm; + /* distance to Moon must be in Earth radii */ + *rvec = rm / 6378.14; +} + +/* +topomoon() takes the local siderial time, the geographical +latitude of the observer, and pointers to the geocentric +equatorial coordinates. The function overwrites the geocentric +coordinates with topocentric coordinates on a simple spherical +earth model (no polar flattening). Expects Moon-Earth distance in +Earth radii. Formulas scavenged from Astronomical Almanac 'low +precision formulae for Moon position' page D46. +*/ + +void topo(double lst, double glat, double *alp, double *dec, double *r) { + double x, y, z, r1; + x = *r * cos(*dec) * cos(*alp) - cos(glat) * cos(lst); + y = *r * cos(*dec) * sin(*alp) - cos(glat) * sin(lst); + z = *r * sin(*dec) - sin(glat); + r1 = sqrt(x*x + y*y + z*z); + *alp = atan22(y, x); + *dec = asin(z / r1); + *r = r1; +} + +/* +moontransit() takes date, the time zone and geographic longitude +of observer and returns the time (decimal hours) of lunar transit +on that day if there is one, and sets the notransit flag if there +isn't. See Explanatory Supplement to Astronomical Almanac +section 9.32 and 9.31 for the method. +*/ + +double moontransit(int y, int m, int d, double tz, double glat, double glong, int *notransit) { + double hm, ht, ht1, lon, lat, rv, dnew, lst; + int itcount; + + ht1 = 180 * RADS; + ht = 0; + itcount = 0; + *notransit = 0; + do { + ht = ht1; + itcount++; + dnew = days(y, m, d, ht * DEGS/15) - tz/24; + lst = gst(dnew) + glong; + /* find the topocentric Moon ra (hence hour angle) and dec */ + moonpos(dnew, &lon, &lat, &rv); + equatorial(dnew, &lon, &lat, &rv); + topo(lst, glat, &lon, &lat, &rv); + hm = rangerad(lst - lon); + ht1 = rangerad(ht - hm); + /* if no convergence, then no transit on that day */ + if (itcount > 30) { + *notransit = 1; + break; + } + } + while (fabs(ht - ht1) > 0.04 * RADS); + return(ht1); +} + +/* + Calculates the selenographic coordinates of either the sub Earth point + (optical libration) or the sub-solar point (selen. coords of centre of + bright hemisphere). Based on Meeus chapter 51 but neglects physical + libration and nutation, with some simplification of the formulas. +*/ +void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p) { + double i, f, omega, w, y, x, a, t, eps; + t = day / 36525; + i = 1.54242 * RADS; + eps = epsilon(day); + f = range(93.2720993 + 483202.0175273 * t - .0034029 * t * t) * RADS; + omega = range(125.044555 - 1934.1361849 * t + .0020762 * t * t) * RADS; + w = lambda - omega; + y = sin(w) * cos(beta) * cos(i) - sin(beta) * sin(i); + x = cos(w) * cos(beta); + a = atan22(y, x); + *l = a - f; + + /* kludge to catch cases of 'round the back' angles */ + if (*l < -90 * RADS) *l += TPI; + if (*l > 90 * RADS) *l -= TPI; + *b = asin(-sin(w) * cos(beta) * sin(i) - sin(beta) * cos(i)); + + /* pa pole axis - not used for Sun stuff */ + x = sin(i) * sin(omega); + y = sin(i) * cos(omega) * cos(eps) - cos(i) * sin(eps); + w = atan22(x, y); + *p = rangerad(asin(sqrt(x*x + y*y) * cos(alpha - w) / cos(*b))); +} + +/* + Takes: days since J2000.0, eq coords Moon, ratio of moon to sun distance, + eq coords Sun + Returns: position angle of bright limb wrt NCP, percentage illumination + of Sun +*/ +void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill) { + double x, y, phi, i; + y = cos(sdec) * sin(sra - lra); + x = sin(sdec) * cos(ldec) - cos(sdec) * sin(ldec) * cos (sra - lra); + *pabl = atan22(y, x); + phi = acos(sin(sdec) * sin(ldec) + cos(sdec) * cos(ldec) * cos(sra-lra)); + i = atan22(sin(phi) , (dr - cos(phi))); + *ill = 0.5*(1 + cos(i)); +} + +/* +sunpos() takes days from J2000.0 and returns ecliptic longitude +of Sun in the pointers. Latitude is zero at this level of precision, +but pointer left in for consistency in number of arguments. +This function is within 0.01 degree (1 arcmin) almost all the time +for a century either side of J2000.0. This is from the 'low precision +fomulas for the Sun' from C24 of Astronomical Alamanac +*/ +void sunpos(double d, double *lambda, double *beta, double *rvec) { + double L, g, ls, bs, rs; + + L = range(280.461 + .9856474 * d) * RADS; + g = range(357.528 + .9856003 * d) * RADS; + ls = L + (1.915 * sin(g) + .02 * sin(2 * g)) * RADS; + bs = 0; + rs = 1.00014 - .01671 * cos(g) - .00014 * cos(2 * g); + *lambda = ls; + *beta = bs; + *rvec = rs; +} + +/* +this routine returns the altitude given the days since J2000.0 +the hour angle and declination of the object and the latitude +of the observer. Used to find the Sun's altitude to put a letter +code on the transit time, and to find the Moon's altitude at +transit just to make sure that the Moon is visible. +*/ +double alt(double glat, double ha, double dec) { + return(asin(sin(dec) * sin(glat) + cos(dec) * cos(glat) * cos(ha))); +} + +/* returns an angle in degrees in the range 0 to 360 */ +double range(double x) { + double a, b; + b = x / 360; + a = 360 * (b - floor(b)); + if (a < 0) + a = 360 + a; + return(a); +} + +/* returns an angle in rads in the range 0 to two pi */ +double rangerad(double x) { + double a, b; + b = x / TPI; + a = TPI * (b - floor(b)); + if (a < 0) + a = TPI + a; + return(a); +} + +/* +gets the atan2 function returning angles in the right +order and range +*/ +double atan22(double y, double x) { + double a; + + a = atan2(y, x); + if (a < 0) a += TPI; + return(a); +} + +/* +returns mean obliquity of ecliptic in radians given days since +J2000.0. +*/ +double epsilon(double d) { + double t = d/ 36525; + return((23.4392911111111 - (t* (46.8150 + 0.00059*t)/3600)) *RADS); +} + +/* +replaces ecliptic coordinates with equatorial coordinates +note: call by reference destroys original values +R is unchanged. +*/ +void equatorial(double d, double *lon, double *lat, double *r) { + double eps, ceps, seps, l, b; + + l = *lon; + b = * lat; + eps = epsilon(d); + ceps = cos(eps); + seps = sin(eps); + *lon = atan22(sin(l)*ceps - tan(b)*seps, cos(l)); + *lat = asin(sin(b)*ceps + cos(b)*seps*sin(l)); +} + +/* +replaces equatorial coordinates with ecliptic ones. Inverse +of above, but used to find topocentric ecliptic coords. +*/ +void ecliptic(double d, double *lon, double *lat, double *r) { + double eps, ceps, seps, alp, dec; + alp = *lon; + dec = *lat; + eps = epsilon(d); + ceps = cos(eps); + seps = sin(eps); + *lon = atan22(sin(alp)*ceps + tan(dec)*seps, cos(alp)); + *lat = asin(sin(dec)*ceps - cos(dec)*seps*sin(alp)); +} + +/* +returns the siderial time at greenwich meridian as +an angle in radians given the days since J2000.0 +*/ +double gst( double d) { + double t = d / 36525; + double theta; + theta = range(280.46061837 + 360.98564736629 * d + 0.000387933 * t * t); + return(theta * RADS); +} + +void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, + double *mrv, double *l, double *b, double *paxis) +{ + double mlambda, mbeta; + double malpha, mdelta; + double lst, mhr; + double tlambda, tbeta, trv; + + lst = gst(*day) + *glong; + + /* find Moon topocentric coordinates for libration calculations */ + + moonpos(*day, &mlambda, &mbeta, mrv); + malpha = mlambda; + mdelta = mbeta; + equatorial(*day, &malpha, &mdelta, mrv); + topo(lst, *glat, &malpha, &mdelta, mrv); + mhr = rangerad(lst - malpha); + *moonalt = alt(*glat, mhr, mdelta); + + /* Optical libration and Position angle of the Pole */ + + tlambda = malpha; + tbeta = mdelta; + trv = *mrv; + ecliptic(*day, &tlambda, &tbeta, &trv); + libration(*day, tlambda, tbeta, malpha, l, b, paxis); +} diff --git a/q65w/libm65/toxyz.f90 b/q65w/libm65/toxyz.f90 new file mode 100644 index 000000000..aef160c9d --- /dev/null +++ b/q65w/libm65/toxyz.f90 @@ -0,0 +1,25 @@ +subroutine toxyz(alpha,delta,r,vec) + + implicit real*8 (a-h,o-z) + real*8 vec(3) + + vec(1)=r*cos(delta)*cos(alpha) + vec(2)=r*cos(delta)*sin(alpha) + vec(3)=r*sin(delta) + + return +end subroutine toxyz + +subroutine fromxyz(vec,alpha,delta,r) + + implicit real*8 (a-h,o-z) + real*8 vec(3) + data twopi/6.283185307d0/ + + r=sqrt(vec(1)**2 + vec(2)**2 + vec(3)**2) + alpha=atan2(vec(2),vec(1)) + if(alpha.lt.0.d0) alpha=alpha+twopi + delta=asin(vec(3)/r) + + return +end subroutine fromxyz diff --git a/q65w/libm65/trimlist.f90 b/q65w/libm65/trimlist.f90 new file mode 100644 index 000000000..9e8a36e69 --- /dev/null +++ b/q65w/libm65/trimlist.f90 @@ -0,0 +1,28 @@ +subroutine trimlist(sig,km,ftol,indx,nsiz,nz) + + parameter (MAXMSG=1000) !Size of decoded message list + real sig(MAXMSG,30) + integer indx(MAXMSG),nsiz(MAXMSG) + +! 1 2 3 4 5 6 7 8 +! nfile nutc freq snr dt ipol flip sync + + call indexx(sig(1,3),km,indx) !Sort list by frequency + + n=1 + i0=1 + do i=2,km + j0=indx(i-1) + j=indx(i) + if(sig(j,3)-sig(j0,3).gt.ftol) then + nsiz(n)=i-i0 + i0=i + n=n+1 + endif + enddo + nz=n + nsiz(nz)=km+1-i0 + nsiz(nz+1)=-1 + + return +end subroutine trimlist diff --git a/q65w/libm65/twkfreq.f90 b/q65w/libm65/twkfreq.f90 new file mode 100644 index 000000000..be1fef0fe --- /dev/null +++ b/q65w/libm65/twkfreq.f90 @@ -0,0 +1,26 @@ +subroutine twkfreq(c3,c4,npts,fsample,a) + + complex c3(npts) + complex c4(npts) + complex w,wstep + real a(3) + data twopi/6.283185307/ + +! Mix the complex signal + w=1.0 + wstep=1.0 + x0=0.5*(npts+1) + s=2.0/npts + do i=1,npts + x=s*(i-x0) + p2=1.5*x*x - 0.5 +! p3=2.5*(x**3) - 1.5*x +! p4=4.375*(x**4) - 3.75*(x**2) + 0.375 + dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) + wstep=cmplx(cos(dphi),sin(dphi)) + w=w*wstep + c4(i)=w*c3(i) + enddo + + return +end subroutine twkfreq diff --git a/q65w/libm65/twkfreq_xy.f90 b/q65w/libm65/twkfreq_xy.f90 new file mode 100644 index 000000000..a5cc3769a --- /dev/null +++ b/q65w/libm65/twkfreq_xy.f90 @@ -0,0 +1,29 @@ +subroutine twkfreq_xy(c4aa,c4bb,n5,a) + + complex c4aa(n5) + complex c4bb(n5) + real a(5) + complex w,wstep + data twopi/6.283185307/ + +! Apply AFC corrections to the c4aa and c4bb data + w=1.0 + wstep=1.0 + x0=0.5*(n5+1) + s=2.0/n5 + do i=1,n5 + x=s*(i-x0) + if(mod(i,1000).eq.1) then + p2=1.5*x*x - 0.5 +! p3=2.5*(x**3) - 1.5*x +! p4=4.375*(x**4) - 3.75*(x**2) + 0.375 + dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/1378.125) + wstep=cmplx(cos(dphi),sin(dphi)) + endif + w=w*wstep + c4aa(i)=w*c4aa(i) + c4bb(i)=w*c4bb(i) + enddo + + return +end subroutine twkfreq_xy diff --git a/q65w/libm65/txpol.f90 b/q65w/libm65/txpol.f90 new file mode 100644 index 000000000..042d3e549 --- /dev/null +++ b/q65w/libm65/txpol.f90 @@ -0,0 +1,33 @@ +subroutine txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) + +! If Tx station's grid is in decoded message, compute optimum TxPol + character*22 decoded + character*6 mygrid,grid + character*1 cp + logical xpol + + ntxpol=0 + i1=index(decoded,' ') + i2=index(decoded(i1+1:),' ') + i1 + grid=' ' + if(i2.ge.8 .and. i2.le.18) grid=decoded(i2+1:i2+4)//'mm' + ntxpol=0 + cp=' ' + if(xpol .and.grid(1:4).ne.'RR73') then + if(grid(1:1).ge.'A' .and. grid(1:1).le.'R' .and. & + grid(2:2).ge.'A' .and. grid(2:2).le.'R' .and. & + grid(3:3).ge.'0' .and. grid(3:3).le.'9' .and. & + grid(4:4).ge.'0' .and. grid(4:4).le.'9') then + ntxpol=mod(npol-nint(2.0*dpol(mygrid,grid))+720,180) + if(nxant.eq.0) then + cp='H' + if(ntxpol.gt.45 .and. ntxpol.le.135) cp='V' + else + cp='/' + if(ntxpol.ge.90 .and. ntxpol.lt.180) cp='\' + endif + endif + endif + + return +end subroutine txpol diff --git a/q65w/libm65/usleep.c b/q65w/libm65/usleep.c new file mode 100644 index 000000000..21d242a68 --- /dev/null +++ b/q65w/libm65/usleep.c @@ -0,0 +1,7 @@ +#include + +/* usleep(3) */ +void usleep_(unsigned long *microsec) +{ + usleep(*microsec); +} diff --git a/q65w/libm65/wavhdr.f90 b/q65w/libm65/wavhdr.f90 new file mode 100644 index 000000000..6568c1fa6 --- /dev/null +++ b/q65w/libm65/wavhdr.f90 @@ -0,0 +1,110 @@ +module wavhdr + type hdr + character*4 ariff + integer*4 lenfile + character*4 awave + character*4 afmt + integer*4 lenfmt + integer*2 nfmt2 + integer*2 nchan2 + integer*4 nsamrate + integer*4 nbytesec + integer*2 nbytesam2 + integer*2 nbitsam2 + character*4 adata + integer*4 ndata + end type hdr + + contains + + function default_header(nsamrate,npts) + type(hdr) default_header,h + h%ariff='RIFF' + h%awave='WAVE' + h%afmt='fmt ' + h%lenfmt=16 + h%nfmt2=1 + h%nchan2=1 + h%nsamrate=nsamrate + h%nbitsam2=16 + h%nbytesam2=h%nbitsam2 * h%nchan2 / 8 + h%adata='data' + h%nbytesec=h%nsamrate * h%nbitsam2 * h%nchan2 / 8 + h%ndata=2*npts + h%lenfile=h%ndata + 44 - 8 + default_header=h + end function default_header + + subroutine set_wsjtx_wav_params(fMHz,mode,nsubmode,ntrperiod,id2) + + parameter (NBANDS=23,NMODES=13) + character*8 mode,modes(NMODES) + integer*2 id2(4) + integer iperiod(8) + real fband(NBANDS) + data fband/0.137,0.474,1.8,3.5,5.1,7.0,10.14,14.0,18.1,21.0,24.9, & + 28.0,50.0,144.0,222.0,432.0,902.0,1296.0,2304.0,3400.0, & + 5760.0,10368.0,24048.0/ + data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & + 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ + data iperiod/5,10,15,30,60,120,900,0/ + + dmin=1.e30 + iband=0 + do i=1,NBANDS + if(abs(fMHz-fband(i)).lt.dmin) then + dmin=abs(fMHz-fband(i)) + iband=i + endif + enddo + + imode=0 + do i=1,NMODES + if(mode.eq.modes(i)) imode=i + enddo + + ip=0 + do i=1,8 + if(ntrperiod.eq.iperiod(i)) ip=i + enddo + + id2(1)=iband + id2(2)=imode + id2(3)=nsubmode + id2(4)=ip + + return + end subroutine set_wsjtx_wav_params + + subroutine get_wsjtx_wav_params(id2,band,mode,nsubmode,ntrperiod,ok) + + parameter (NBANDS=23,NMODES=13) + character*8 mode,modes(NMODES) + character*6 band,bands(NBANDS) + integer*2 id2(4) + integer iperiod(8) + logical ok + data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & + 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ + data iperiod/5,10,15,30,60,120,900,0/ + data bands/'2190m','630m','160m','80m','60m','40m','30m','20m', & + '17m','15m','12m','10m','6m','2m','1.25m','70cm','33cm', & + '23cm','13cm','9cm','6cm','3cm','1.25cm'/ + + ok=.true. + if(id2(1).lt.1 .or. id2(1).gt.NBANDS) ok=.false. + if(id2(2).lt.1 .or. id2(2).gt.NMODES) ok=.false. + if(id2(3).lt.1 .or. id2(3).gt.8) ok=.false. + if(id2(4).lt.1 .or. id2(4).gt.8) ok=.false. + + if(ok) then + band=bands(id2(1)) + mode=modes(id2(2)) + nsubmode=id2(3) + ntrperiod=iperiod(id2(4)) + endif + + return + end subroutine get_wsjtx_wav_params + +end module wavhdr diff --git a/q65w/libm65/wideband_sync.f90 b/q65w/libm65/wideband_sync.f90 new file mode 100644 index 000000000..31a96d2cb --- /dev/null +++ b/q65w/libm65/wideband_sync.f90 @@ -0,0 +1,281 @@ +module wideband_sync + + type candidate + real :: snr !Relative S/N of sync detection + real :: f !Freq of sync tone, 0 to 96000 Hz + real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s + real :: pol !Polarization angle, degrees + integer :: ipol !Polarization angle, 1 to 4 ==> 0, 45, 90, 135 deg + integer :: iflip !Sync type: JT65 = +/- 1, Q65 = 0 + integer :: indx + end type candidate + type sync_dat + real :: ccfmax + real :: xdt + real :: pol + integer :: ipol + integer :: iflip + logical :: birdie + end type sync_dat + + parameter (NFFT=32768) + parameter (MAX_CANDIDATES=50) + parameter (SNR1_THRESHOLD=4.5) + type(sync_dat) :: sync(NFFT) + integer nkhz_center + + contains + +subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) + +! Search symbol spectra ss() over frequency range nfa to nfb (in kHz) for +! JT65 and Q65 sync patterns. The nts_* variables are the submode tone +! spacings: 1 2 4 8 16 for A B C D E. Birdies are detected and +! excised. Candidates are returned in the structure array cand(). + + parameter (MAX_PEAKS=100) + real ss(4,322,NFFT),savg(4,NFFT) + real pavg(-20:20) + integer indx(NFFT) + logical xpol,skip,ldecoded + type(candidate) :: cand(MAX_CANDIDATES) + common/early/nhsym1,nhsym2,ldecoded(32768) + + call wb_sync(ss,savg,xpol,jz,nfa,nfb) !Output to sync() array + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + df3=96000.0/NFFT + ia=nint(1000*nfa/df3) + 1 + ib=nint(1000*nfb/df3) + 1 + if(ia.lt.1) ia=1 + if(ib.gt.NFFT-1) ib=NFFT-1 + iz=ib-ia+1 + + call indexx(sync(ia:ib)%ccfmax,iz,indx) !Sort by relative snr + + k=0 + do i=1,MAX_PEAKS + n=indx(iz+1-i) + ia - 1 + f0=0.001*(n-1)*df3 + snr1=sync(n)%ccfmax + if(snr1.lt.SNR1_THRESHOLD) exit + flip=sync(n)%iflip + if(flip.ne.0.0 .and. nts_jt65.eq.0) cycle + if(flip.eq.0.0 .and. nts_q65.eq.0) cycle + if(sync(n)%birdie) cycle + +! Test for signal outside of TxT range and set bw for this signal type + j1=(sync(n)%xdt + 1.0)/tstep - 1.0 + j2=(sync(n)%xdt + 52.0)/tstep + 1.0 + if(flip.ne.0) j2=(sync(n)%xdt + 47.811)/tstep + 1.0 + ipol=sync(n)%ipol + pavg=0. + do j=1,j1 + pavg=pavg + ss(ipol,j,n-20:n+20) + enddo + do j=j2,jz + pavg=pavg + ss(ipol,j,n-20:n+20) + enddo + jsum=j1 + (jz-j2+1) + pmax=maxval(pavg(-2:2)) !### Why not just pavg(0) ? + base=(sum(pavg)-pmax)/jsum + pmax=pmax/base + if(pmax.gt.5.0) cycle + skip=.false. + do m=1,k !Skip false syncs within signal bw + diffhz=1000.0*(f0-cand(m)%f) + bw=nts_q65*110.0 + if(cand(m)%iflip.ne.0) bw=nts_jt65*178.0 + if(diffhz.gt.-0.03*bw .and. diffhz.lt.1.03*bw) skip=.true. + enddo + if(skip) cycle + k=k+1 + cand(k)%snr=snr1 + cand(k)%f=f0 + cand(k)%xdt=sync(n)%xdt + cand(k)%pol=sync(n)%pol + cand(k)%ipol=sync(n)%ipol + cand(k)%iflip=nint(flip) + cand(k)%indx=n +! write(50,3050) i,k,m,f0+32.0,diffhz,bw,snr1,db(snr1) +!3050 format(3i5,f8.3,2f8.0,2f8.2) + if(k.ge.MAX_CANDIDATES) exit + enddo + ncand=k + + return +end subroutine get_candidates + +subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) + +! Compute "orange sync curve" using the Q65 sync pattern + + use timer_module, only: timer + parameter (NFFT=32768) + parameter (LAGMAX=30) + real ss(4,322,NFFT) + real savg(4,NFFT) + real savg_med(4) + real ccf4(4),ccf4best(4),a(3) + logical first,xpol + integer isync(22) + integer jsync0(63),jsync1(63) + integer ip(1) + +! Q65 sync symbols + data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ + data jsync0/ & + 1, 4, 5, 9, 10, 11, 12, 13, 14, 16, 18, 22, 24, 25, 28, 32, & + 33, 34, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 52, 53, 55, 57, & + 59, 60, 63, 64, 66, 68, 70, 73, 80, 81, 89, 90, 92, 95, 97, 98, & + 100,102,104,107,108,111,114,119,120,121,122,123,124,125,126/ + data jsync1/ & + 2, 3, 6, 7, 8, 15, 17, 19, 20, 21, 23, 26, 27, 29, 30, 31, & + 35, 36, 41, 44, 49, 50, 51, 54, 56, 58, 61, 62, 65, 67, 69, 71, & + 72, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87, 88, 91, 93, & + 94, 96, 99,101,103,105,106,109,110,112,113,115,116,117,118/ + data first/.true./ + save first,isync,jsync0,jsync1 + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + if(first) then + fac=0.6/tstep + do i=1,22 !Expand the Q65 sync stride + isync(i)=nint((isync(i)-1)*fac) + 1 + enddo + do i=1,63 + jsync0(i)=2*(jsync0(i)-1) + 1 + jsync1(i)=2*(jsync1(i)-1) + 1 + enddo + first=.false. + endif + + df3=96000.0/NFFT + ia=nint(1000*nfa/df3) + 1 !Flat frequency range for WSE converters + ib=nint(1000*nfb/df3) + 1 + if(ia.lt.1) ia=1 + if(ib.gt.NFFT-1) ib=NFFT-1 + npol=1 + if(xpol) npol=4 + + do i=1,npol + call pctile(savg(i,ia:ib),ib-ia+1,50,savg_med(i)) + enddo +! do i=ia,ib +! write(14,3014) 0.001*(i-1)*df3,savg(1:npol,i) +!3014 format(5f10.3) +! enddo + + lagbest=0 + ipolbest=1 + flip=0. + + do i=ia,ib + ccfmax=0. + do lag=0,LAGMAX + + ccf=0. + ccf4=0. + do j=1,22 !Test for Q65 sync + k=isync(j) + lag + ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + & + ss(1:npol,k+1,i+1) + ss(1:npol,k+2,i+1) + enddo + ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*3*22/float(jz) + ccf=maxval(ccf4) + ip=maxloc(ccf4) + ipol=ip(1) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + ccf4best=ccf4 + flip=0. + endif + + ccf=0. + ccf4=0. + do j=1,63 !Test for JT65 sync, std msg + k=jsync0(j) + lag + ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + ss(1:npol,k+1,i+1) + enddo + ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*2*63/float(jz) + ccf=maxval(ccf4) + ip=maxloc(ccf4) + ipol=ip(1) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + ccf4best=ccf4 + flip=1.0 + endif + + ccf=0. + ccf4=0. + do j=1,63 !Test for JT65 sync, OOO msg + k=jsync1(j) + lag + ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + ss(1:npol,k+1,i+1) + enddo + ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*2*63/float(jz) + ccf=maxval(ccf4) + ip=maxloc(ccf4) + ipol=ip(1) + if(ccf.gt.ccfmax) then + ipolbest=ipol + lagbest=lag + ccfmax=ccf + ccf4best=ccf4 + flip=-1.0 + endif + + enddo ! lag + + poldeg=0. + if(xpol .and. ccfmax.ge.SNR1_THRESHOLD) then + call polfit(ccf4best,4,a) + poldeg=a(3) + endif + sync(i)%ccfmax=ccfmax + sync(i)%xdt=lagbest*tstep-1.0 + sync(i)%pol=poldeg + sync(i)%ipol=ipolbest + sync(i)%iflip=flip + sync(i)%birdie=.false. + if(ccfmax/(savg(ipolbest,i)/savg_med(ipolbest)).lt.3.0) sync(i)%birdie=.true. +! if(sync(i)%iflip.eq.0 .and. sync(i)%ccfmax .gt. 20.0) then +! write(50,3050) i,lagbest,sync(i)%ccfmax,sync(i)%xdt,sync(i)%ipol, & +! sync(i)%birdie,ccf4best +!3050 format(2i5,f10.3,f8.2,i5,1x,L3,4f7.1) +! endif + + enddo ! i (frequency bin) + + call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) + sync(ia:ib)%ccfmax=sync(ia:ib)%ccfmax/base + + bw=65*4*1.66666667 !Q65-60C bandwidth + nbw=bw/df3 + 1 !Number of bins to blank + syncmin=2.0 + nguard=10 + do i=ia,ib + if(sync(i)%ccfmax.lt.syncmin) cycle + spk=maxval(sync(i:i+nbw)%ccfmax) + ip =maxloc(sync(i:i+nbw)%ccfmax) + i0=ip(1)+i-1 + ja=min(i,i0-nguard) + jb=i0+nbw+nguard + sync(ja:jb)%ccfmax=0. + sync(i0)%ccfmax=spk + enddo + +! do i=ia,ib +! write(15,3015) 0.001*(i-1)*df3+32.0,sync(i)%ccfmax,sync(i)%xdt, & +! sync(i)%ipol,sync(i)%iflip,sync(i)%birdie +!3015 format(3f10.3,2i6,L5) +! enddo + + return +end subroutine wb_sync + +end module wideband_sync diff --git a/q65w/libm65/wrapkarn.c b/q65w/libm65/wrapkarn.c new file mode 100644 index 000000000..9e0a51caf --- /dev/null +++ b/q65w/libm65/wrapkarn.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include "rs.h" + +static void *rs; +static int first=1; + +void rs_encode_(int *dgen, int *sent) +// Encode JT65 data dgen[12], producing sent[63]. +{ + int dat1[12]; + int b[51]; + int i; + + if(first) { + // Initialize the JT65 codec + rs=init_rs_int(6,0x43,3,1,51,0); + first=0; + } + + // Reverse data order for the Karn codec. + for(i=0; i<12; i++) { + dat1[i]=dgen[11-i]; + } + // Compute the parity symbols + encode_rs_int(rs,dat1,b); + + // Move parity symbols and data into sent[] array, in reverse order. + for (i = 0; i < 51; i++) sent[50-i] = b[i]; + for (i = 0; i < 12; i++) sent[i+51] = dat1[11-i]; +} + +void rs_decode_(int *recd0, int *era0, int *numera0, int *decoded, int *nerr) +// Decode JT65 received data recd0[63], producing decoded[12]. +// Erasures are indicated in era0[numera]. The number of corrected +// errors is *nerr. If the data are uncorrectable, *nerr=-1 is returned. +{ + int numera; + int i; + int era_pos[50]; + int recd[63]; + + if(first) { + rs=init_rs_int(6,0x43,3,1,51,0); + first=0; + } + + numera=*numera0; + for(i=0; i<12; i++) recd[i]=recd0[62-i]; + for(i=0; i<51; i++) recd[12+i]=recd0[50-i]; + if(numera) + for(i=0; i +#ifdef QT5 +#include +#else +#include +#endif +#include + +#include "revision_utils.hpp" +#include "mainwindow.h" + +extern "C" { + // Fortran procedures we need + void four2a_ (_Complex float *, int * nfft, int * ndim, int * isign, int * iform, int len); +} + +int main(int argc, char *argv[]) +{ + QApplication a {argc, argv}; + // Override programs executable basename as application name. + a.setApplicationName ("MAP65"); + a.setApplicationVersion ("3.0.1"); + // switch off as we share an Info.plist file with WSJT-X + a.setAttribute (Qt::AA_DontUseNativeMenuBar); + MainWindow w; + w.show (); + QObject::connect (&a, &QApplication::lastWindowClosed, &a, &QApplication::quit); + auto result = a.exec (); + + // clean up lazily initialized FFTW3 resources + { + int nfft {-1}; + int ndim {1}; + int isign {1}; + int iform {1}; + // free FFT plan resources + four2a_ (nullptr, &nfft, &ndim, &isign, &iform, 0); + } + fftwf_forget_wisdom (); + fftwf_cleanup (); + + return result; +} diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp new file mode 100644 index 000000000..98a34a164 --- /dev/null +++ b/q65w/mainwindow.cpp @@ -0,0 +1,2409 @@ +//------------------------------------------------------------------ MainWindow +#include "mainwindow.h" +#include +#include +#include +#include +#include +#include "revision_utils.hpp" +#include "qt_helpers.hpp" +#include "SettingsGroup.hpp" +#include "widgets/MessageBox.hpp" +#include "ui_mainwindow.h" +#include "devsetup.h" +#include "plotter.h" +#include "about.h" +#include "astro.h" +#include "widegraph.h" +#include "messages.h" +#include "bandmap.h" +#include "txtune.h" +#include "sleep.h" +#include + +#define NFFT 32768 + +short int iwave[2*60*12000]; //Wave file for Tx audio +int nwave; //Length of Tx waveform +bool btxok; //True if OK to transmit +bool bTune; +bool bIQxt; +double outputLatency; //Latency in seconds +int txPower; +int iqAmp; +int iqPhase; +qint16 id[4*60*96000]; + +TxTune* g_pTxTune = NULL; +QSharedMemory mem_m65("mem_m65"); + +extern const int RxDataFrequency = 96000; +extern const int TxDataFrequency = 11025; + +//-------------------------------------------------- MainWindow constructor +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + m_appDir {QApplication::applicationDirPath ()}, + m_settings_filename {m_appDir + "/map65.ini"}, + m_astro_window {new Astro {m_settings_filename}}, + m_band_map_window {new BandMap {m_settings_filename}}, + m_messages_window {new Messages {m_settings_filename}}, + m_wide_graph_window {new WideGraph {m_settings_filename}}, + m_gui_timer {new QTimer {this}} +{ + ui->setupUi(this); + on_EraseButton_clicked(); + ui->labUTC->setStyleSheet( \ + "QLabel { background-color : black; color : yellow; }"); + ui->labTol1->setStyleSheet( \ + "QLabel { background-color : white; color : black; }"); + ui->labTol1->setFrameStyle(QFrame::Panel | QFrame::Sunken); + ui->dxStationGroupBox->setStyleSheet("QFrame{border: 5px groove red}"); + + QActionGroup* paletteGroup = new QActionGroup(this); + ui->actionCuteSDR->setActionGroup(paletteGroup); + ui->actionLinrad->setActionGroup(paletteGroup); + ui->actionAFMHot->setActionGroup(paletteGroup); + ui->actionBlue->setActionGroup(paletteGroup); + + QActionGroup* modeGroup = new QActionGroup(this); + ui->actionNoJT65->setActionGroup(modeGroup); + ui->actionJT65A->setActionGroup(modeGroup); + ui->actionJT65B->setActionGroup(modeGroup); + ui->actionJT65C->setActionGroup(modeGroup); + + QActionGroup* modeGroup2 = new QActionGroup(this); + ui->actionNoQ65->setActionGroup(modeGroup2); + ui->actionQ65A->setActionGroup(modeGroup2); + ui->actionQ65B->setActionGroup(modeGroup2); + ui->actionQ65C->setActionGroup(modeGroup2); + ui->actionQ65D->setActionGroup(modeGroup2); + ui->actionQ65E->setActionGroup(modeGroup2); + + QActionGroup* saveGroup = new QActionGroup(this); + ui->actionSave_all->setActionGroup(saveGroup); + ui->actionNone->setActionGroup(saveGroup); + + QActionGroup* DepthGroup = new QActionGroup(this); + ui->actionNo_Deep_Search->setActionGroup(DepthGroup); + ui->actionNormal_Deep_Search->setActionGroup(DepthGroup); + ui->actionAggressive_Deep_Search->setActionGroup(DepthGroup); + + QButtonGroup* txMsgButtonGroup = new QButtonGroup; + txMsgButtonGroup->addButton(ui->txrb1,1); + txMsgButtonGroup->addButton(ui->txrb2,2); + txMsgButtonGroup->addButton(ui->txrb3,3); + txMsgButtonGroup->addButton(ui->txrb4,4); + txMsgButtonGroup->addButton(ui->txrb5,5); + txMsgButtonGroup->addButton(ui->txrb6,6); + connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int))); + connect(ui->decodedTextBrowser,SIGNAL(selectCallsign(bool)),this, + SLOT(selectCall2(bool))); + + setWindowTitle (program_title ()); + + connect(&soundInThread, SIGNAL(readyForFFT(int)), + this, SLOT(dataSink(int))); + connect(&soundInThread, SIGNAL(error(QString)), this, + SLOT(showSoundInError(QString))); + connect(&soundInThread, SIGNAL(status(QString)), this, + SLOT(showStatusMessage(QString))); + createStatusBar(); + + connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); + connect(&proc_m65, &QProcess::errorOccurred, this, &MainWindow::m65_error); + connect(&proc_m65, static_cast (&QProcess::finished), + [this] (int exitCode, QProcess::ExitStatus status) { + if (subProcessFailed (&proc_m65, exitCode, status)) + { + QTimer::singleShot (0, this, SLOT (close ())); + } + }); + + connect(&proc_editor, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(editor_error())); + + connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); + + m_auto=false; + m_waterfallAvg = 1; + m_network = true; + m_txFirst=false; + m_txMute=false; + btxok=false; + m_restart=false; + m_transmitting=false; + m_widebandDecode=false; + m_ntx=1; + m_myCall="K1JT"; + m_myGrid="FN20qi"; + m_saveDir="/users/joe/map65/install/save"; + m_azelDir="/users/joe/map65/install/"; + m_editorCommand="notepad"; + m_txFreq=125; + m_setftx=0; + m_loopall=false; + m_startAnother=false; + m_saveAll=false; + m_onlyEME=false; + m_sec0=-1; + m_hsym0=-1; + m_palette="CuteSDR"; + m_map65RxLog=1; //Write Date and Time to all65.txt + m_nutc0=9999; + m_kb8rq=false; + m_NB=false; + m_mode="JT65B"; + m_mode65=2; + m_fs96000=true; + m_udpPort=50004; + m_adjustIQ=0; + m_applyIQcal=0; + m_colors="000066ff0000ffff00969696646464"; + m_nsave=0; + m_modeJT65=0; + m_modeQ65=0; + m_TRperiod=60; + m_modeTx="JT65"; + bTune=false; + txPower=100; + iqAmp=0; + iqPhase=0; + + xSignalMeter = new SignalMeter(ui->xMeterFrame); + xSignalMeter->resize(50, 160); + ySignalMeter = new SignalMeter(ui->yMeterFrame); + ySignalMeter->resize(50, 160); + +#ifdef WIN32 + while(true) { + int iret=killbyname("m65.exe"); + if(iret == 603) break; + if(iret != 0) msgBox("KillByName return code: " + + QString::number(iret)); + } +#endif + + if(!mem_m65.attach()) { + if (!mem_m65.create(sizeof(datcom_))) { + msgBox("Unable to create shared memory segment."); + } + } + char *to = (char*)mem_m65.data(); + int size=sizeof(datcom_); + if(datcom_.newdat==0) { + int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; + to += noffset; + size -= noffset; + } + memset(to,0,size); //Zero all decoding params in shared memory + + fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + + PaError paerr=Pa_Initialize(); //Initialize Portaudio + if(paerr!=paNoError) { + msgBox("Unable to initialize PortAudio."); + } + readSettings(); //Restore user's setup params + QFile lockFile(m_appDir + "/.lock"); //Create .lock so m65 will wait + lockFile.open(QIODevice::ReadWrite); + QFile quitFile(m_appDir + "/.quit"); + quitFile.remove(); + proc_m65.start(QDir::toNativeSeparators(m_appDir + "/m65"), {"-s", }); + + m_pbdecoding_style1="QPushButton{background-color: cyan; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + m_pbmonitor_style="QPushButton{background-color: #00ff00; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + m_pbAutoOn_style="QPushButton{background-color: red; \ + border-style: outset; border-width: 1px; border-radius: 5px; \ + border-color: black; min-width: 5em; padding: 3px;}"; + + genStdMsgs(""); + + on_actionAstro_Data_triggered(); //Create the other windows + on_actionWide_Waterfall_triggered(); + on_actionMessages_triggered(); + on_actionBand_Map_triggered(); + if (m_messages_window) m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); + if (m_astro_window) m_astro_window->setFontSize (m_astroFont); + + if(m_modeQ65==0) on_actionNoQ65_triggered(); + if(m_modeQ65==1) on_actionQ65A_triggered(); + if(m_modeQ65==2) on_actionQ65B_triggered(); + if(m_modeQ65==3) on_actionQ65C_triggered(); + if(m_modeQ65==4) on_actionQ65D_triggered(); + if(m_modeQ65==5) on_actionQ65E_triggered(); + + if(m_modeJT65==0) on_actionNoJT65_triggered(); + if(m_modeJT65==1) on_actionJT65A_triggered(); + if(m_modeJT65==2) on_actionJT65B_triggered(); + if(m_modeJT65==3) on_actionJT65C_triggered(); + future1 = new QFuture; + watcher1 = new QFutureWatcher; + connect(watcher1, SIGNAL(finished()),this,SLOT(diskDat())); + + future2 = new QFuture; + watcher2 = new QFutureWatcher; + connect(watcher2, SIGNAL(finished()),this,SLOT(diskWriteFinished())); + +// Assign input device and start input thread + soundInThread.setInputDevice(m_paInDevice); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setBufSize(10*7056); + soundInThread.setNetwork(m_network); + soundInThread.setPort(m_udpPort); + if(!m_xpol) soundInThread.setNrx(1); + if(m_xpol) soundInThread.setNrx(2); + soundInThread.start(QThread::HighestPriority); + + // Assign output device and start output thread + soundOutThread.setOutputDevice(m_paOutDevice); +// soundOutThread.start(QThread::HighPriority); + + m_monitoring=true; // Start with Monitoring ON + soundInThread.setMonitoring(m_monitoring); + m_diskData=false; + m_tol=500; + m_wide_graph_window->setTol(m_tol); + m_wide_graph_window->setFcal(m_fCal); + if(m_fs96000) m_wide_graph_window->setFsample(96000); + if(!m_fs96000) m_wide_graph_window->setFsample(95238); + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; + m_wide_graph_window->m_TxOffset=m_TxOffset; + if(m_initIQplus) m_wide_graph_window->initIQplus(); + +// Create "m_worked", a dictionary of all calls in wsjt.log + QFile f("wsjt.log"); + f.open(QIODevice::ReadOnly); + if(f.isOpen()) { + QTextStream in(&f); + QString line,t,callsign; + for(int i=0; i<99999; i++) { + line=in.readLine(); + if(line.length()<=0) break; + t=line.mid(18,12); + callsign=t.mid(0,t.indexOf(",")); + m_worked[callsign]=true; + } + f.close(); + } + + if(ui->actionLinrad->isChecked()) on_actionLinrad_triggered(); + if(ui->actionCuteSDR->isChecked()) on_actionCuteSDR_triggered(); + if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); + if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); + + connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); + connect (m_wide_graph_window.get (), &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); + connect (m_wide_graph_window.get (), &WideGraph::f11f12, this, &MainWindow::bumpDF); + + // only start the guiUpdate timer after this constructor has finished + QTimer::singleShot (0, [=] { + m_gui_timer->start(100); //Don't change the 100 ms! + }); +} + + //--------------------------------------------------- MainWindow destructor +MainWindow::~MainWindow() +{ + writeSettings(); + if (soundInThread.isRunning()) { + soundInThread.quit(); + soundInThread.wait(3000); + } + if (soundOutThread.isRunning()) { + soundOutThread.quitExecution=true; + soundOutThread.wait(3000); + } + Pa_Terminate(); + fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + if(!m_decoderBusy) { + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); + } + delete ui; +} + +//-------------------------------------------------------- writeSettings() +void MainWindow::writeSettings() +{ + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue("geometry", saveGeometry()); + settings.setValue("MRUdir", m_path); + settings.setValue("TxFirst",m_txFirst); + settings.setValue("DXcall",ui->dxCallEntry->text()); + settings.setValue("DXgrid",ui->dxGridEntry->text()); + } + + SettingsGroup g {&settings, "Common"}; + settings.setValue("MyCall",m_myCall); + settings.setValue("MyGrid",m_myGrid); + settings.setValue("IDint",m_idInt); + settings.setValue("PTTport",m_pttPort); + settings.setValue("AstroFont",m_astroFont); + settings.setValue("Xpol",m_xpol); + settings.setValue("XpolX",m_xpolx); + settings.setValue("SaveDir",m_saveDir); + settings.setValue("AzElDir",m_azelDir); + settings.setValue("Editor",m_editorCommand); + settings.setValue("DXCCpfx",m_dxccPfx); + settings.setValue("Timeout",m_timeout); + settings.setValue("TxPower",txPower); + settings.setValue("IQamp",iqAmp); + settings.setValue("IQphase",iqPhase); + settings.setValue("ApplyIQcal",m_applyIQcal); + settings.setValue("dPhi",m_dPhi); + settings.setValue("Fcal",m_fCal); + settings.setValue("Fadd",m_fAdd); + settings.setValue("NetworkInput", m_network); + settings.setValue("FSam96000", m_fs96000); + settings.setValue("SoundInIndex",m_nDevIn); + settings.setValue("paInDevice",m_paInDevice); + settings.setValue("SoundOutIndex",m_nDevOut); + settings.setValue("paOutDevice",m_paOutDevice); + settings.setValue("IQswap",m_IQswap); + settings.setValue("Scale_dB",m_dB); + settings.setValue("IQxt",m_bIQxt); + settings.setValue("InitIQplus",m_initIQplus); + settings.setValue("UDPport",m_udpPort); + settings.setValue("PaletteCuteSDR",ui->actionCuteSDR->isChecked()); + settings.setValue("PaletteLinrad",ui->actionLinrad->isChecked()); + settings.setValue("PaletteAFMHot",ui->actionAFMHot->isChecked()); + settings.setValue("PaletteBlue",ui->actionBlue->isChecked()); + settings.setValue("Mode",m_mode); + settings.setValue("nModeJT65",m_modeJT65); + settings.setValue("nModeQ65",m_modeQ65); + settings.setValue("TxMode",m_modeTx); + settings.setValue("SaveNone",ui->actionNone->isChecked()); + settings.setValue("SaveAll",ui->actionSave_all->isChecked()); + settings.setValue("NDepth",m_ndepth); + settings.setValue("NEME",m_onlyEME); + settings.setValue("KB8RQ",m_kb8rq); + settings.setValue("NB",m_NB); + settings.setValue("NBslider",m_NBslider); + settings.setValue("GainX",(double)m_gainx); + settings.setValue("GainY",(double)m_gainy); + settings.setValue("PhaseX",(double)m_phasex); + settings.setValue("PhaseY",(double)m_phasey); + settings.setValue("Mult570",m_mult570); + settings.setValue("Mult570Tx",m_mult570Tx); + settings.setValue("Cal570",m_cal570); + settings.setValue("TxOffset",m_TxOffset); + settings.setValue("Colors",m_colors); + settings.setValue("MaxDrift",ui->sbMaxDrift->value()); +} + +//---------------------------------------------------------- readSettings() +void MainWindow::readSettings() +{ + QSettings settings(m_settings_filename, QSettings::IniFormat); + { + SettingsGroup g {&settings, "MainWindow"}; + restoreGeometry(settings.value("geometry").toByteArray()); + ui->dxCallEntry->setText(settings.value("DXcall","").toString()); + ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); + m_path = settings.value("MRUdir", m_appDir + "/save").toString(); + m_txFirst = settings.value("TxFirst",false).toBool(); + ui->txFirstCheckBox->setChecked(m_txFirst); + } + + SettingsGroup g {&settings, "Common"}; + m_myCall=settings.value("MyCall","").toString(); + m_myGrid=settings.value("MyGrid","").toString(); + m_idInt=settings.value("IDint",0).toInt(); + m_pttPort=settings.value("PTTport",0).toInt(); + m_astroFont=settings.value("AstroFont",20).toInt(); + m_xpol=settings.value("Xpol",false).toBool(); + ui->actionFind_Delta_Phi->setEnabled(m_xpol); + m_xpolx=settings.value("XpolX",false).toBool(); + m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); + m_azelDir=settings.value("AzElDir",m_appDir).toString(); + m_editorCommand=settings.value("Editor","notepad").toString(); + m_dxccPfx=settings.value("DXCCpfx","").toString(); + m_timeout=settings.value("Timeout",20).toInt(); + txPower=settings.value("TxPower",100).toInt(); + iqAmp=settings.value("IQamp",0).toInt(); + iqPhase=settings.value("IQphase",0).toInt(); + m_applyIQcal=settings.value("ApplyIQcal",0).toInt(); + ui->actionApply_IQ_Calibration->setChecked(m_applyIQcal!=0); + m_dPhi=settings.value("dPhi",0).toInt(); + m_fCal=settings.value("Fcal",0).toInt(); + m_fAdd=settings.value("FAdd",0).toDouble(); + soundInThread.setFadd(m_fAdd); + m_network = settings.value("NetworkInput",true).toBool(); + m_fs96000 = settings.value("FSam96000",true).toBool(); + m_nDevIn = settings.value("SoundInIndex", 0).toInt(); + m_paInDevice = settings.value("paInDevice",0).toInt(); + m_nDevOut = settings.value("SoundOutIndex", 0).toInt(); + m_paOutDevice = settings.value("paOutDevice",0).toInt(); + m_IQswap = settings.value("IQswap",false).toBool(); + m_dB = settings.value("Scale_dB",0).toInt(); + m_initIQplus = settings.value("InitIQplus",false).toBool(); + m_bIQxt = settings.value("IQxt",false).toBool(); + m_udpPort = settings.value("UDPport",50004).toInt(); + soundInThread.setSwapIQ(m_IQswap); + soundInThread.setScale(m_dB); + soundInThread.setPort(m_udpPort); + ui->actionCuteSDR->setChecked(settings.value( + "PaletteCuteSDR",true).toBool()); + ui->actionLinrad->setChecked(settings.value( + "PaletteLinrad",false).toBool()); + m_mode=settings.value("Mode","JT65B").toString(); + m_modeJT65=settings.value("nModeJT65",2).toInt(); + if(m_modeJT65==0) ui->actionNoJT65->setChecked(true); + if(m_modeJT65==1) ui->actionJT65A->setChecked(true); + if(m_modeJT65==2) ui->actionJT65B->setChecked(true); + if(m_modeJT65==3) ui->actionJT65C->setChecked(true); + + m_modeQ65=settings.value("nModeQ65",2).toInt(); + m_modeTx=settings.value("TxMode","JT65").toString(); + if(m_modeQ65==0) ui->actionNoQ65->setChecked(true); + if(m_modeQ65==1) ui->actionQ65A->setChecked(true); + if(m_modeQ65==2) ui->actionQ65B->setChecked(true); + if(m_modeQ65==3) ui->actionQ65C->setChecked(true); + if(m_modeQ65==4) ui->actionQ65D->setChecked(true); + if(m_modeQ65==5) ui->actionQ65E->setChecked(true); + if(m_modeTx=="JT65") ui->pbTxMode->setText("Tx JT65 #"); + if(m_modeTx=="Q65") ui->pbTxMode->setText("Tx Q65 :"); + + ui->actionNone->setChecked(settings.value("SaveNone",true).toBool()); + ui->actionSave_all->setChecked(settings.value("SaveAll",false).toBool()); + m_saveAll=ui->actionSave_all->isChecked(); + m_ndepth=settings.value("NDepth",0).toInt(); + m_onlyEME=settings.value("NEME",false).toBool(); + ui->actionOnly_EME_calls->setChecked(m_onlyEME); + m_kb8rq=settings.value("KB8RQ",false).toBool(); + ui->actionF4_sets_Tx6->setChecked(m_kb8rq); + m_NB=settings.value("NB",false).toBool(); + ui->NBcheckBox->setChecked(m_NB); + ui->sbMaxDrift->setValue(settings.value("MaxDrift",0).toInt()); + m_NBslider=settings.value("NBslider",40).toInt(); + ui->NBslider->setValue(m_NBslider); + m_gainx=settings.value("GainX",1.0).toFloat(); + m_gainy=settings.value("GainY",1.0).toFloat(); + m_phasex=settings.value("PhaseX",0.0).toFloat(); + m_phasey=settings.value("PhaseY",0.0).toFloat(); + m_mult570=settings.value("Mult570",2).toInt(); + m_mult570Tx=settings.value("Mult570Tx",1).toInt(); + m_cal570=settings.value("Cal570",0.0).toDouble(); + m_TxOffset=settings.value("TxOffset",130.9).toDouble(); + m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); + + if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && + !ui->actionAFMHot->isChecked() && !ui->actionBlue->isChecked()) { + on_actionLinrad_triggered(); + ui->actionLinrad->setChecked(true); + } + if(m_ndepth==0) ui->actionNo_Deep_Search->setChecked(true); + if(m_ndepth==1) ui->actionNormal_Deep_Search->setChecked(true); + if(m_ndepth==2) ui->actionAggressive_Deep_Search->setChecked(true); +} + +//-------------------------------------------------------------- dataSink() +void MainWindow::dataSink(int k) +{ + static float s[NFFT],splot[NFFT]; + static int n=0; + static int ihsym=0; + static int nzap=0; + static int ntrz=0; + static int nkhz; + static int nfsample=96000; + static int nxpol=0; + static int nsec0=0; + static int nsum=0; + static float fgreen; + static int ndiskdat; + static int nb; + static int nadj=0; + static float px=0.0,py=0.0; + static uchar lstrong[1024]; + static float rejectx; + static float rejecty; + static float slimit; + static double xsum=0.0; + + if(m_diskData) { + ndiskdat=1; + datcom_.ndiskdat=1; + } else { + ndiskdat=0; + datcom_.ndiskdat=0; + } +// Get x and y power, polarized spectrum, nkhz, and ihsym + nb=0; + if(m_NB) nb=1; + nfsample=96000; + if(!m_fs96000) nfsample=95238; + nxpol=0; + if(m_xpol) nxpol=1; + fgreen=m_wide_graph_window->fGreen(); + nadj++; + if(m_adjustIQ==0) nadj=0; + symspec_(&k, &nxpol, &ndiskdat, &nb, &m_NBslider, &m_dPhi, + &nfsample, &fgreen, &m_adjustIQ, &m_applyIQcal, + &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, + &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); + + int nsec=QDateTime::currentSecsSinceEpoch(); + if(nsec==nsec0) { + xsum+=pow(10.0,0.1*px); + nsum+=1; + } else { + m_xavg=0.0; + if(nsum>0) m_xavg=xsum/nsum; + xsum=pow(10.0,0.1*px); + nsum=1; + } + nsec0=nsec; + + QString t; + m_pctZap=nzap/178.3; + ui->yMeterFrame->setVisible(m_xpol); + if(m_xpol) { + lab4->setText ( + QString {" Rx noise: %1 %2 %3 %% "} + .arg (px, 5, 'f', 1) + .arg (py, 5, 'f', 1) + .arg (m_pctZap, 5, 'f', 1) + ); + } else { + lab4->setText ( + QString {" Rx noise: %1 %2 %% "} + .arg (px, 5, 'f', 1) + .arg (m_pctZap, 5, 'f', 1) + ); + } + xSignalMeter->setValue(px); // Update the signal meters + ySignalMeter->setValue(py); + if(m_monitoring || m_diskData) { + m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); + } + + if(nadj == 10) { + if(m_xpol) { + ui->decodedTextBrowser->append ( + QString {"Amp: %1 %2 Phase: %3 %4"} + .arg (m_gainx, 6, 'f', 4).arg (m_gainy, 6, 'f', 4) + .arg (m_phasex, 6, 'f', 4) + .arg (m_phasey, 6, 'f', 4) + ); + } else { + ui->decodedTextBrowser->append( + QString {"Amp: %1 Phase: %1"} + .arg (m_gainx, 6, 'f', 4) + .arg (m_phasex, 6, 'f', 4) + ); + } + ui->decodedTextBrowser->append(t); + m_adjustIQ=0; + } + + //Average over specified number of spectra + if (n==0) { + for (int i=0; i=m_waterfallAvg) { + for (int i=0; i=280 and !m_diskData) { //Early decode, t=52 s + m_RxState=1; + datcom_.newdat=1; + datcom_.nagain=0; + datcom_.nhsym=ihsym; + QDateTime t = QDateTime::currentDateTimeUtc(); + m_dateTime=t.toString("yyyy-MMM-dd hh:mm"); + decode(); //Start the decoder + } + + if(m_RxState<=1 and ihsym>=302) { //Decode at t=56 s (for Q65 and data from disk) + m_RxState=2; + datcom_.newdat=1; + datcom_.nagain=0; + datcom_.nhsym=ihsym; + QDateTime t = QDateTime::currentDateTimeUtc(); + m_dateTime=t.toString("yyyy-MMM-dd hh:mm"); + decode(); //Start the decoder + if(m_saveAll and !m_diskData) { + QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + + t.time().toString("hhmm"); + if(m_xpol) fname += ".tf2"; + if(!m_xpol) fname += ".iq"; + *future2 = QtConcurrent::run(savetf2, fname, m_xpol); + watcher2->setFuture(*future2); + } + } + + soundInThread.m_dataSinkBusy=false; +} + +void MainWindow::showSoundInError(const QString& errorMsg) + {QMessageBox::critical(this, tr("Error in SoundIn"), errorMsg);} + +void MainWindow::showStatusMessage(const QString& statusMsg) + {statusBar()->showMessage(statusMsg);} + +void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog +{ + DevSetup dlg(this); + dlg.m_myCall=m_myCall; + dlg.m_myGrid=m_myGrid; + dlg.m_idInt=m_idInt; + dlg.m_pttPort=m_pttPort; + dlg.m_astroFont=m_astroFont; + dlg.m_xpol=m_xpol; + dlg.m_xpolx=m_xpolx; + dlg.m_saveDir=m_saveDir; + dlg.m_azelDir=m_azelDir; + dlg.m_editorCommand=m_editorCommand; + dlg.m_dxccPfx=m_dxccPfx; + dlg.m_timeout=m_timeout; + dlg.m_dPhi=m_dPhi; + dlg.m_fCal=m_fCal; + dlg.m_fAdd=m_fAdd; + dlg.m_network=m_network; + dlg.m_fs96000=m_fs96000; + dlg.m_nDevIn=m_nDevIn; + dlg.m_nDevOut=m_nDevOut; + dlg.m_udpPort=m_udpPort; + dlg.m_IQswap=m_IQswap; + dlg.m_dB=m_dB; + dlg.m_initIQplus=m_initIQplus; + dlg.m_bIQxt=m_bIQxt; + dlg.m_cal570=m_cal570; + dlg.m_TxOffset=m_TxOffset; + dlg.m_mult570=m_mult570; + dlg.m_mult570Tx=m_mult570Tx; + dlg.m_colors=m_colors; + + dlg.initDlg(); + if(dlg.exec() == QDialog::Accepted) { + m_myCall=dlg.m_myCall; + m_myGrid=dlg.m_myGrid; + m_idInt=dlg.m_idInt; + m_pttPort=dlg.m_pttPort; + m_astroFont=dlg.m_astroFont; + if(m_astro_window && m_astro_window->isVisible()) m_astro_window->setFontSize(m_astroFont); + m_xpol=dlg.m_xpol; + ui->actionFind_Delta_Phi->setEnabled(m_xpol); + m_xpolx=dlg.m_xpolx; + m_saveDir=dlg.m_saveDir; + m_azelDir=dlg.m_azelDir; + m_editorCommand=dlg.m_editorCommand; + m_dxccPfx=dlg.m_dxccPfx; + m_timeout=dlg.m_timeout; + m_dPhi=dlg.m_dPhi; + m_fCal=dlg.m_fCal; + m_fAdd=dlg.m_fAdd; + m_wide_graph_window->setFcal(m_fCal); + m_fs96000=dlg.m_fs96000; + m_network=dlg.m_network; + m_nDevIn=dlg.m_nDevIn; + m_paInDevice=dlg.m_paInDevice; + m_nDevOut=dlg.m_nDevOut; + m_paOutDevice=dlg.m_paOutDevice; + m_udpPort=dlg.m_udpPort; + m_IQswap=dlg.m_IQswap; + m_dB=dlg.m_dB; + m_initIQplus=dlg.m_initIQplus; + m_bIQxt=dlg.m_bIQxt; + m_colors=dlg.m_colors; + m_messages_window->setColors(m_colors); + m_band_map_window->setColors(m_colors); + m_cal570=dlg.m_cal570; + m_TxOffset=dlg.m_TxOffset; + m_mult570Tx=dlg.m_mult570Tx; + m_wide_graph_window->m_mult570=m_mult570; + m_wide_graph_window->m_mult570Tx=m_mult570Tx; + m_wide_graph_window->m_cal570=m_cal570; + soundInThread.setSwapIQ(m_IQswap); + soundInThread.setScale(m_dB); + + if(dlg.m_restartSoundIn) { + soundInThread.quit(); + soundInThread.wait(1000); + soundInThread.setNetwork(m_network); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setFadd(m_fAdd); + if(!m_xpol) soundInThread.setNrx(1); + if(m_xpol) soundInThread.setNrx(2); + soundInThread.setInputDevice(m_paInDevice); + soundInThread.start(QThread::HighestPriority); + } + + if(dlg.m_restartSoundOut) { + soundOutThread.quitExecution=true; + soundOutThread.wait(1000); + soundOutThread.setOutputDevice(m_paOutDevice); +// soundOutThread.start(QThread::HighPriority); + } + } +} + +void MainWindow::on_monitorButton_clicked() //Monitor +{ + m_monitoring=true; + soundInThread.setMonitoring(true); + m_diskData=false; +} +void MainWindow::on_actionLinrad_triggered() //Linrad palette +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("Linrad"); +} + +void MainWindow::on_actionCuteSDR_triggered() //CuteSDR palette +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("CuteSDR"); +} + +void MainWindow::on_actionAFMHot_triggered() +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("AFMHot"); +} + +void MainWindow::on_actionBlue_triggered() +{ + if(m_wide_graph_window) m_wide_graph_window->setPalette("Blue"); +} + +void MainWindow::on_actionAbout_triggered() //Display "About" +{ + CAboutDlg dlg(this); + dlg.exec(); +} + +void MainWindow::on_autoButton_clicked() //Auto +{ + m_auto = !m_auto; + if(m_auto) { + ui->autoButton->setStyleSheet(m_pbAutoOn_style); + ui->autoButton->setText("Auto is ON"); + } else { + btxok=false; + ui->autoButton->setStyleSheet(""); + ui->autoButton->setText("Auto is OFF"); + on_monitorButton_clicked(); + } +} + +void MainWindow::on_stopTxButton_clicked() //Stop Tx +{ + if(m_auto) on_autoButton_clicked(); + btxok=false; +} + +void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent +{ + switch(e->key()) + { + case Qt::Key_F3: + m_txMute=!m_txMute; + break; + case Qt::Key_F4: + ui->dxCallEntry->setText(""); + ui->dxGridEntry->setText(""); + if(m_kb8rq) { + m_ntx=6; + ui->txrb6->setChecked(true); + } + break; + case Qt::Key_F6: + if(e->modifiers() & Qt::ShiftModifier) { + on_actionDecode_remaining_files_in_directory_triggered(); + } + break; + case Qt::Key_F11: + if(e->modifiers() & Qt::ShiftModifier) { + } else { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0-n); + } + break; + case Qt::Key_F12: + if(e->modifiers() & Qt::ShiftModifier) { + } else { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0+n); + } + break; + case Qt::Key_G: + if(e->modifiers() & Qt::AltModifier) { + genStdMsgs(""); + } + break; + case Qt::Key_L: + if(e->modifiers() & Qt::ControlModifier) { + lookup(); + genStdMsgs(""); + break; + } + } +} + +void MainWindow::bumpDF(int n) //bumpDF() +{ + if(n==11) { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0-n); + } + if(n==12) { + int n0=m_wide_graph_window->DF(); + int n=(n0 + 10000) % 5; + if(n==0) n=5; + m_wide_graph_window->setDF(n0+n); + } +} + +bool MainWindow::eventFilter(QObject *object, QEvent *event) //eventFilter() +{ + if (event->type() == QEvent::KeyPress) { + //Use the event in parent using its keyPressEvent() + QKeyEvent *keyEvent = static_cast(event); + MainWindow::keyPressEvent(keyEvent); + return QObject::eventFilter(object, event); + } + return QObject::eventFilter(object, event); +} + +void MainWindow::createStatusBar() //createStatusBar +{ + lab1 = new QLabel("Receiving"); + lab1->setAlignment(Qt::AlignHCenter); + lab1->setMinimumSize(QSize(80,10)); + lab1->setStyleSheet("QLabel{background-color: #00ff00}"); + lab1->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab1); + + lab2 = new QLabel("QSO freq: 125"); + lab2->setAlignment(Qt::AlignHCenter); + lab2->setMinimumSize(QSize(90,10)); + lab2->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab2); + + lab3 = new QLabel("QSO DF: 0"); + lab3->setAlignment(Qt::AlignHCenter); + lab3->setMinimumSize(QSize(80,10)); + lab3->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab3); + + lab4 = new QLabel(""); + lab4->setAlignment(Qt::AlignHCenter); + lab4->setMinimumSize(QSize(80,10)); + lab4->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab4); + + lab5 = new QLabel(""); + lab5->setAlignment(Qt::AlignHCenter); + lab5->setMinimumSize(QSize(50,10)); + lab5->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab5); + + lab6 = new QLabel(""); + lab6->setAlignment(Qt::AlignHCenter); + lab6->setMinimumSize(QSize(50,10)); + lab6->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab6); + + lab7 = new QLabel("Avg: 0"); + lab7->setAlignment(Qt::AlignHCenter); + lab7->setMinimumSize(QSize(50,10)); + lab7->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab7); +} + +void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox +{ + static int ntol[] = {10,20,50,100,200,500,1000}; + m_tol=ntol[i]; + m_wide_graph_window->setTol(m_tol); + ui->labTol1->setText(QString::number(ntol[i])); +} + +void MainWindow::on_actionExit_triggered() //Exit() +{ + close (); +} + +void MainWindow::closeEvent (QCloseEvent * e) +{ + if (m_gui_timer) m_gui_timer->stop (); + m_wide_graph_window->saveSettings(); + QFile quitFile(m_appDir + "/.quit"); + quitFile.open(QIODevice::ReadWrite); + QFile lockFile(m_appDir + "/.lock"); + lockFile.remove(); // Allow m65 to terminate + + // close pipes + proc_m65.closeReadChannel (QProcess::StandardOutput); + proc_m65.closeReadChannel (QProcess::StandardError); + + // flush all input + proc_m65.setReadChannel (QProcess::StandardOutput); + proc_m65.readAll (); + proc_m65.setReadChannel (QProcess::StandardError); + proc_m65.readAll (); + + proc_m65.disconnect (); + if (!proc_m65.waitForFinished (1000)) proc_m65.kill(); + quitFile.remove(); + mem_m65.detach(); + if (m_astro_window) m_astro_window->close (); + if (m_band_map_window) m_band_map_window->close (); + if (m_messages_window) m_messages_window->close (); + if (m_wide_graph_window) m_wide_graph_window->close (); + QMainWindow::closeEvent (e); +} + +void MainWindow::on_stopButton_clicked() //stopButton +{ + m_monitoring=false; + soundInThread.setMonitoring(m_monitoring); + m_loopall=false; +} + +void MainWindow::msgBox(QString t) //msgBox +{ + msgBox0.setText(t); + msgBox0.exec(); +} + +void MainWindow::stub() //stub() +{ + msgBox("Not yet implemented."); +} + +void MainWindow::on_actionRelease_Notes_triggered() +{ + QDesktopServices::openUrl(QUrl( + "https://www.physics.princeton.edu/pulsar/K1JT/Release_Notes.txt", + QUrl::TolerantMode)); +} + +void MainWindow::on_actionOnline_Users_Guide_triggered() //Display manual +{ + QDesktopServices::openUrl(QUrl( + "https://www.physics.princeton.edu/pulsar/K1JT/MAP65_Users_Guide.pdf", + QUrl::TolerantMode)); +} + +void MainWindow::on_actionQSG_Q65_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Quick_Start.pdf"}); +} + +void MainWindow::on_actionQSG_MAP65_v3_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/WSJTX_2.5.0_MAP65_3.0_Quick_Start.pdf"}); +} + +void MainWindow::on_actionQ65_Sensitivity_in_MAP65_3_0_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Sensitivity_in_MAP65.pdf"}); +} + +void MainWindow::on_actionAstro_Data_triggered() //Display Astro +{ + if (m_astro_window ) m_astro_window->show(); +} + +void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls +{ + m_wide_graph_window->show(); +} + +void MainWindow::on_actionBand_Map_triggered() //Display BandMap +{ + m_band_map_window->show (); +} + +void MainWindow::on_actionMessages_triggered() //Display Messages +{ + m_messages_window->show(); +} + +void MainWindow::on_actionOpen_triggered() //Open File +{ + m_monitoring=false; + soundInThread.setMonitoring(m_monitoring); + QString fname; + if(m_xpol) { + fname=QFileDialog::getOpenFileName(this, "Open File", m_path, + "MAP65 Files (*.tf2)"); + } else { + fname=QFileDialog::getOpenFileName(this, "Open File", m_path, + "MAP65 Files (*.iq)"); + } + if(fname != "") { + m_path=fname; + int i; + i=fname.indexOf(".iq") - 11; + if(m_xpol) i=fname.indexOf(".tf2") - 11; + if(i>=0) { + lab1->setStyleSheet("QLabel{background-color: #66ff66}"); + lab1->setText(" " + fname.mid(i,15) + " "); + } + on_stopButton_clicked(); + m_diskData=true; + int dbDgrd=0; + if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; + *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + watcher1->setFuture(*future1); + } +} + +void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next +{ + int i,len; + QFileInfo fi(m_path); + QStringList list; + if(m_xpol) { + list= fi.dir().entryList().filter(".tf2"); + } else { + list= fi.dir().entryList().filter(".iq"); + } + for (i = 0; i < list.size()-1; ++i) { + if(i==list.size()-2) m_loopall=false; + len=list.at(i).length(); + if(list.at(i)==m_path.right(len)) { + int n=m_path.length(); + QString fname=m_path.replace(n-len,len,list.at(i+1)); + m_path=fname; + int i; + i=fname.indexOf(".iq") - 11; + if(m_xpol) i=fname.indexOf(".tf2") - 11; + if(i>=0) { + lab1->setStyleSheet("QLabel{background-color: #66ff66}"); + lab1->setText(" " + fname.mid(i,len) + " "); + } + m_diskData=true; + int dbDgrd=0; + if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; + *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + watcher1->setFuture(*future1); + return; + } + } +} + //Open all remaining files +void MainWindow::on_actionDecode_remaining_files_in_directory_triggered() +{ + m_loopall=true; + on_actionOpen_next_in_directory_triggered(); +} + +void MainWindow::diskDat() //diskDat() +{ + double hsym; + //These may be redundant?? + m_diskData=true; + datcom_.newdat=1; + if(m_wide_graph_window->m_bForceCenterFreq) { + datcom_.fcenter=m_wide_graph_window->m_dForceCenterFreq; + } + + if(m_fs96000) hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol + if(!m_fs96000) hsym=2048.0*95238.1/11025.0; + for(int i=0; i<304; i++) { // Do the half-symbol FFTs + int k = i*hsym + 2048.5; + dataSink(k); + qApp->processEvents(); // Allow the waterfall to update + } +} + +void MainWindow::diskWriteFinished() //diskWriteFinished +{ +// qDebug() << "diskWriteFinished"; +} + //Delete ../save/*.tf2 +void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() +{ + int i; + QString fname; + int ret = QMessageBox::warning(this, "Confirm Delete", + "Are you sure you want to delete all *.tf2 and *.iq files in\n" + + QDir::toNativeSeparators(m_saveDir) + " ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + QDir dir(m_saveDir); + QStringList files=dir.entryList(QDir::Files); + QList::iterator f; + for(f=files.begin(); f!=files.end(); ++f) { + fname=*f; + i=(fname.indexOf(".tf2")); + if(i==11) dir.remove(fname); + i=(fname.indexOf(".iq")); + if(i==11) dir.remove(fname); + } + } +} + //Clear BandMap and Messages windows +void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() +{ + m_band_map_window->setText(""); + m_messages_window->setText("",""); + m_map65RxLog |= 4; +} + +void MainWindow::on_actionFind_Delta_Phi_triggered() //Find dPhi +{ + m_map65RxLog |= 8; + on_DecodeButton_clicked(); +} + +void MainWindow::on_actionF4_sets_Tx6_triggered() //F4 sets Tx6 +{ + m_kb8rq = !m_kb8rq; +} + +void MainWindow::on_actionOnly_EME_calls_triggered() //EME calls only +{ + m_onlyEME = ui->actionOnly_EME_calls->isChecked(); +} + +void MainWindow::on_actionNo_shorthands_if_Tx1_triggered() +{ + stub(); +} + +void MainWindow::on_actionNo_Deep_Search_triggered() //No Deep Search +{ + m_ndepth=0; +} + +void MainWindow::on_actionNormal_Deep_Search_triggered() //Normal DS +{ + m_ndepth=1; +} + +void MainWindow::on_actionAggressive_Deep_Search_triggered() //Aggressive DS +{ + m_ndepth=2; +} + +void MainWindow::on_actionNone_triggered() //Save None +{ + m_saveAll=false; +} + +// ### Implement "Save Last" here? ### + +void MainWindow::on_actionSave_all_triggered() //Save All +{ + m_saveAll=true; +} + //Display list of keyboard shortcuts +void MainWindow::on_actionKeyboard_shortcuts_triggered() +{ + stub(); +} + //Display list of mouse commands +void MainWindow::on_actionSpecial_mouse_commands_triggered() +{ + stub(); +} + //Diaplay list of Add-On pfx/sfx +void MainWindow::on_actionAvailable_suffixes_and_add_on_prefixes_triggered() +{ + stub(); +} + +void MainWindow::on_DecodeButton_clicked() //Decode request +{ + int n=m_sec0%m_TRperiod; + if(m_monitoring and n>47 and (n<52 or m_decoderBusy)) return; + if(!m_decoderBusy) { + datcom_.newdat=0; + datcom_.nagain=1; + decode(); + } +} + +void MainWindow::freezeDecode(int n) //freezeDecode() +{ + if(n==2) { + ui->tolSpinBox->setValue(5); + datcom_.ntol=m_tol; + datcom_.mousedf=0; + } else { + ui->tolSpinBox->setValue(qMin(3,ui->tolSpinBox->value())); + datcom_.ntol=m_tol; + } + if(!m_decoderBusy) { + datcom_.nagain=1; + datcom_.newdat=0; + decode(); + } +} + +void MainWindow::decode() //decode() +{ + ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); + +// QFile f("mockRTfiles.txt"); +// if(datcom_.nagain==0 && (!m_diskData) && !f.exists()) { + if(datcom_.nagain==0 && (!m_diskData)) { + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int imin=ms/60000; + int ihr=imin/60; + imin=imin % 60; + datcom_.nutc=100*ihr + imin; + } + + datcom_.idphi=m_dPhi; + datcom_.mousedf=m_wide_graph_window->DF(); + datcom_.mousefqso=m_wide_graph_window->QSOfreq(); + datcom_.ndepth=m_ndepth; + datcom_.ndiskdat=0; + if(m_diskData) { + datcom_.ndiskdat=1; + int i0=m_path.indexOf(".tf2"); + if(i0<0) i0=m_path.indexOf(".iq"); + if(i0>0) { + // Compute self Doppler using the filename for Date and Time + int nyear=m_path.mid(i0-11,2).toInt()+2000; + int month=m_path.mid(i0-9,2).toInt(); + int nday=m_path.mid(i0-7,2).toInt(); + int nhr=m_path.mid(i0-4,2).toInt(); + int nmin=m_path.mid(i0-2,2).toInt(); + double uth=nhr + nmin/60.0; + int nfreq=(int)datcom_.fcenter; + int ndop00; + + astrosub00_(&nyear, &month, &nday, &uth, &nfreq, m_myGrid.toLatin1(),&ndop00,6); + datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom + } + } + datcom_.neme=0; + if(ui->actionOnly_EME_calls->isChecked()) datcom_.neme=1; + + int ispan=int(m_wide_graph_window->fSpan()); + if(ispan%2 == 1) ispan++; + int ifc=int(1000.0*(datcom_.fcenter - int(datcom_.fcenter))+0.5); + int nfa=m_wide_graph_window->nStartFreq(); + int nfb=nfa+ispan; + int nfshift=nfa + ispan/2 - ifc; + + datcom_.nfa=nfa; + datcom_.nfb=nfb; + datcom_.nfcal=m_fCal; + datcom_.nfshift=nfshift; + datcom_.mcall3=0; + if(m_call3Modified) datcom_.mcall3=1; + datcom_.ntimeout=m_timeout; + datcom_.ntol=m_tol; + datcom_.nxant=0; + if(m_xpolx) datcom_.nxant=1; + if(datcom_.nutc < m_nutc0) m_map65RxLog |= 1; //Date and Time to map65_rx.log + m_nutc0=datcom_.nutc; + datcom_.map65RxLog=m_map65RxLog; + datcom_.nfsample=96000; + if(!m_fs96000) datcom_.nfsample=95238; + datcom_.nxpol=0; + if(m_xpol) datcom_.nxpol=1; + datcom_.nmode=10*m_modeQ65 + m_modeJT65; +// datcom_.nfast=1; //No longer used + datcom_.nsave=m_nsave; + datcom_.max_drift=ui->sbMaxDrift->value(); + + QString mcall=(m_myCall+" ").mid(0,12); + QString mgrid=(m_myGrid+" ").mid(0,6); + QString hcall=(ui->dxCallEntry->text()+" ").mid(0,12); + QString hgrid=(ui->dxGridEntry->text()+" ").mid(0,6); + + memcpy(datcom_.mycall, mcall.toLatin1(), 12); + memcpy(datcom_.mygrid, mgrid.toLatin1(), 6); + memcpy(datcom_.hiscall, hcall.toLatin1(), 12); + memcpy(datcom_.hisgrid, hgrid.toLatin1(), 6); + memcpy(datcom_.datetime, m_dateTime.toLatin1(), 17); + datcom_.junk1=1234; + datcom_.junk2=5678; + + //newdat=1 ==> this is new data, must do the big FFT + //nagain=1 ==> decode only at fQSO +/- Tol + + char *to = (char*)mem_m65.data(); + char *from = (char*) datcom_.d4; + int size=sizeof(datcom_); + if(datcom_.newdat==0) { + int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; + to += noffset; + from += noffset; + size -= noffset; + } + memcpy(to, from, qMin(mem_m65.size(), size-8)); + datcom_.nagain=0; + datcom_.ndiskdat=0; + m_map65RxLog=0; + m_call3Modified=false; + + QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start + lockFile.remove(); + decodeBusy(true); +} + +bool MainWindow::subProcessFailed (QProcess * process, int exit_code, QProcess::ExitStatus status) +{ + if (exit_code || QProcess::NormalExit != status) + { + QStringList arguments; + for (auto argument: process->arguments ()) + { + if (argument.contains (' ')) argument = '"' + argument + '"'; + arguments << argument; + } + MessageBox::critical_message (this, tr ("Subprocess Error") + , tr ("Subprocess failed with exit code %1") + .arg (exit_code) + , tr ("Running: %1\n%2") + .arg (process->program () + ' ' + arguments.join (' ')) + .arg (QString {process->readAllStandardError()})); + return true; + } + return false; +} + +void MainWindow::m65_error (QProcess::ProcessError) +{ + msgBox("Error starting or running\n" + m_appDir + "/m65 -s\n\n" + + proc_m65.errorString ()); + QTimer::singleShot (0, this, SLOT (close ())); +} + +void MainWindow::editor_error() //editor_error +{ + msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); +} + +void MainWindow::readFromStdout() //readFromStdout +{ + while(proc_m65.canReadLine()) + { + QByteArray t=proc_m65.readLine(); + if(t.indexOf("") >= 0) { + m_nsum=t.mid(17,4).toInt(); + m_nsave=t.mid(21,4).toInt(); + lab7->setText (QString {"Avg: %1"}.arg (m_nsum)); + if(m_modeQ65>0) m_wide_graph_window->setDecodeFinished(); + } + + if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { + if(m_widebandDecode) { + m_messages_window->setText(m_messagesText,m_bandmapText); + m_band_map_window->setText(m_bandmapText); + m_widebandDecode=false; + } + QFile lockFile(m_appDir + "/.lock"); + lockFile.open(QIODevice::ReadWrite); + if(t.indexOf("") >= 0) { + int ndecodes=t.mid(40,5).toInt(); + lab5->setText(QString::number(ndecodes)); + m_map65RxLog=0; + m_startAnother=m_loopall; + } + ui->DecodeButton->setStyleSheet(""); + decodeBusy(false); + return; + } + + read_log(); + + if(t.indexOf("!") >= 0) { + int n=t.length(); + int m=2; +#ifdef WIN32 + m=3; +#endif + if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m)); + n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); + ui->decodedTextBrowser->verticalScrollBar()->setValue(n); + m_messagesText=""; + m_bandmapText=""; + } + + if(t.indexOf("@") >= 0) { + m_messagesText += t.mid(1); + m_widebandDecode=true; + } + + if(t.indexOf("&") >= 0) { + QString q(t); + QString callsign=q.mid(5); + callsign=callsign.mid(0,callsign.indexOf(" ")); + if(callsign.length()>2) { + if(m_worked[callsign]) { + q=q.mid(1,4) + " " + q.mid(5); + } else { + q=q.mid(1,4) + " *" + q.mid(5); + } + m_bandmapText += q; + } + } + if(t.indexOf("=") >= 0) { + int n=t.size(); + qDebug() << t.mid(1,n-3).trimmed(); + } + } +} + +void MainWindow::on_EraseButton_clicked() +{ + qint64 ms=QDateTime::currentMSecsSinceEpoch(); + ui->decodedTextBrowser->clear(); + if((ms-m_msErase)<500) { + on_actionErase_Band_Map_and_Messages_triggered(); + } + m_msErase=ms; +} + + +void MainWindow::decodeBusy(bool b) //decodeBusy() +{ + m_decoderBusy=b; + ui->DecodeButton->setEnabled(!b); + ui->actionOpen->setEnabled(!b); + ui->actionOpen_next_in_directory->setEnabled(!b); + ui->actionDecode_remaining_files_in_directory->setEnabled(!b); +} + +//------------------------------------------------------------- //guiUpdate() +void MainWindow::guiUpdate() +{ + static int iptt0=0; + static int iptt=0; + static bool btxok0=false; + static bool bTune0=false; + static bool bMonitoring0=false; + static int nc0=1; + static int nc1=1; + static char msgsent[23]; + static int nsendingsh=0; + int khsym=0; + + double tx1=0.0; + double tx2=126.0*4096.0/11025.0 + 1.8; + if(m_modeTx=="Q65") tx2=85.0*7200.0/12000.0 + 1.8; + + if(!m_txFirst) { + tx1 += m_TRperiod; + tx2 += m_TRperiod; + } + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int nsec=ms/1000; + double tsec=0.001*ms; + double t2p=fmod(tsec,120.0); + bool bTxTime = (t2p >= tx1) and (t2p < tx2); + + if(bTune0 and !bTune) { + btxok=false; + m_monitoring=bMonitoring0; + soundInThread.setMonitoring(m_monitoring); + } + if(bTune and !bTune0) bMonitoring0=m_monitoring; + bTune0=bTune; + + if(m_auto or bTune) { + if((bTxTime or bTune) and iptt==0 and !m_txMute) { + int itx=1; + int ierr = ptt_(&m_pttPort,&itx,&iptt); // Raise PTT + if(ierr != 0) { + on_stopTxButton_clicked(); + char s[18]; + sprintf(s,"Cannot open COM%d",m_pttPort); + msgBox(s); + } + + if(m_bIQxt) m_wide_graph_window->tx570(); // Set Si570 to Tx Freq + + if(!soundOutThread.isRunning()) { + soundOutThread.start(QThread::HighPriority); + } + } + if((!bTxTime and !bTune) or m_txMute) { + btxok=false; + } + } + +// Calculate Tx waveform when needed + if((iptt==1 && iptt0==0) || m_restart) { + char message[23]; + QByteArray ba; + if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit(); + if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit(); + if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit(); + if(m_ntx == 4) ba=ui->tx4->text().toLocal8Bit(); + if(m_ntx == 5) ba=ui->tx5->text().toLocal8Bit(); + if(m_ntx == 6) ba=ui->tx6->text().toLocal8Bit(); + + ba2msg(ba,message); + int len1=22; + int mode65=m_mode65; + int ntxFreq=1000; + double samfac=1.0; + + if(m_modeTx=="JT65") { + gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, + &nwave,len1,len1); + } else { + if(m_modeQ65==5) ntxFreq=700; + gen_q65_wave_(message,&ntxFreq,&m_modeQ65,msgsent,iwave, + &nwave,len1,len1); + } + msgsent[22]=0; + + if(m_restart) { + QString t=" Tx " + m_modeTx + " "; + t=t.left(11); + QFile f("map65_tx.log"); + f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); + QTextStream out(&f); + out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") + << t << QString::fromLatin1(msgsent) +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f.close(); + } + + m_restart=false; + } + +// If PTT was just raised, start a countdown for raising TxOK: + if(iptt==1 && iptt0==0) nc1=-9; // TxDelay = 0.8 s + if(nc1 <= 0) nc1++; + if(nc1 == 0) { + xSignalMeter->setValue(0); + ySignalMeter->setValue(0); + m_monitoring=false; + soundInThread.setMonitoring(false); + btxok=true; + m_transmitting=true; + m_wide_graph_window->enableSetRxHardware(false); + + QString t=" Tx " + m_modeTx + " "; + t=t.left(11); + QFile f("map65_tx.log"); + f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); + QTextStream out(&f); + out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") + << t << QString::fromLatin1(msgsent) +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f.close(); + } + +// If btxok was just lowered, start a countdown for lowering PTT + if(!btxok && btxok0 && iptt==1) nc0=-11; //RxDelay = 1.0 s + btxok0=btxok; + if(nc0 <= 0) nc0++; + if(nc0 == 0) { + if(m_bIQxt) m_wide_graph_window->rx570(); // Set Si570 back to Rx Freq + int itx=0; + ptt_(&m_pttPort,&itx,&iptt); // Lower PTT + if(!m_txMute) { + soundOutThread.quitExecution=true;\ + } + m_transmitting=false; + m_wide_graph_window->enableSetRxHardware(true); + if(m_auto) { + m_monitoring=true; + soundInThread.setMonitoring(m_monitoring); + } + } + + if(iptt == 0 && !btxok) { + // sending="" + // nsendingsh=0 + } + + if(m_monitoring) { + ui->monitorButton->setStyleSheet(m_pbmonitor_style); + } else { + ui->monitorButton->setStyleSheet(""); + } + + lab2->setText("QSO Freq: " + QString::number(m_wide_graph_window->QSOfreq())); + lab3->setText("QSO DF: " + QString::number(m_wide_graph_window->DF())); + + m_wide_graph_window->updateFreqLabel(); + + if(m_startAnother) { + m_startAnother=false; + on_actionOpen_next_in_directory_triggered(); + } + if(m_modeQ65==0 and m_modeTx=="Q65") on_pbTxMode_clicked(); + if(m_modeJT65==0 and m_modeTx=="JT65") on_pbTxMode_clicked(); + + if(nsec != m_sec0) { //Once per second +// qDebug() << "A" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; + soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); + soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); + + if(m_pctZap>30.0 and !m_transmitting) { + lab4->setStyleSheet("QLabel{background-color: #ff0000}"); + } else { + lab4->setStyleSheet(""); + } + + if(m_transmitting) { + if(nsendingsh==1) { + lab1->setStyleSheet("QLabel{background-color: #66ffff}"); + } else if(nsendingsh==-1) { + lab1->setStyleSheet("QLabel{background-color: #ffccff}"); + } else { + lab1->setStyleSheet("QLabel{background-color: #ffff33}"); + } + char s[37]; + sprintf(s,"Tx: %s",msgsent); + lab1->setText(s); + } else if(m_monitoring) { + lab1->setStyleSheet("QLabel{background-color: #00ff00}"); + m_nrx=soundInThread.nrx(); + khsym=soundInThread.mhsym(); + QString t; + if(m_network) { + if(m_nrx==-1) t="F1"; + if(m_nrx==1) t="I1"; + if(m_nrx==-2) t="F2"; + if(m_nrx==+2) t="I2"; + } else { + if(m_nrx==1) t="S1"; + if(m_nrx==2) t="S2"; + } + if((abs(m_nrx)==1 and m_xpol) or (abs(m_nrx)==2 and !m_xpol)) + lab1->setStyleSheet("QLabel{background-color: #ff1493}"); + if(khsym==m_hsym0) { + t="Nil"; + lab1->setStyleSheet("QLabel{background-color: #ffc0cb}"); + } + lab1->setText("Receiving " + t); + } else if (!m_diskData) { + lab1->setStyleSheet(""); + lab1->setText(""); + } + + QDateTime t = QDateTime::currentDateTimeUtc(); + int fQSO=m_wide_graph_window->QSOfreq(); + m_astro_window->astroUpdate(t, m_myGrid, m_hisGrid, fQSO, m_setftx, + m_txFreq, m_azelDir, m_xavg); + m_setftx=0; + QString utc = t.date().toString(" yyyy MMM dd \n") + t.time().toString(); + ui->labUTC->setText(utc); + if((!m_monitoring and !m_diskData) or (khsym==m_hsym0)) { + xSignalMeter->setValue(0); + ySignalMeter->setValue(0); + lab4->setText(" Rx noise: 0.0 0.0 0.0% "); + } + m_hsym0=khsym; + m_sec0=nsec; + } + iptt0=iptt; + bIQxt=m_bIQxt; +} + +void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg() +{ + bool eom; + eom=false; + for(int i=0;i<22; i++) { + if (i >= ba.size () || !ba[i]) eom=true; + if(eom) { + message[i] = ' '; + } else { + message[i]=ba[i]; + } + } + message[22] = '\0'; +} + +void MainWindow::on_txFirstCheckBox_stateChanged(int nstate) //TxFirst +{ + m_txFirst = (nstate==2); +} + +void MainWindow::set_ntx(int n) //set_ntx() +{ + m_ntx=n; +} + +void MainWindow::on_txb1_clicked() //txb1 +{ + m_ntx=1; + ui->txrb1->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb2_clicked() //txb2 +{ + m_ntx=2; + ui->txrb2->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb3_clicked() //txb3 +{ + m_ntx=3; + ui->txrb3->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb4_clicked() //txb4 +{ + m_ntx=4; + ui->txrb4->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb5_clicked() //txb5 +{ + m_ntx=5; + ui->txrb5->setChecked(true); + m_restart=true; +} + +void MainWindow::on_txb6_clicked() //txb6 +{ + m_ntx=6; + ui->txrb6->setChecked(true); + m_restart=true; +} + +void MainWindow::selectCall2(bool ctrl) //selectCall2 +{ + QString t = ui->decodedTextBrowser->toPlainText(); //Full contents + int i=ui->decodedTextBrowser->textCursor().position(); + int i0=t.lastIndexOf(" ",i); + int i1=t.indexOf(" ",i); + QString hiscall=t.mid(i0+1,i1-i0-1); + if(hiscall!="") { + int n=hiscall.length(); + if( n>2 and n<13 and hiscall.toDouble()==0.0 and \ + hiscall.mid(2,-1).toInt()==0) doubleClickOnCall(hiscall, ctrl); + } +} + //doubleClickOnCall +void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl) +{ + if(m_worked[hiscall]) { + msgBox("Possible dupe: " + hiscall + " already in log."); + } + ui->dxCallEntry->setText(hiscall); + QString t = ui->decodedTextBrowser->toPlainText(); //Full contents + int i2=ui->decodedTextBrowser->textCursor().position(); + QString t1 = t.mid(0,i2); //contents up to text cursor + int i1=t1.lastIndexOf("\n") + 1; + QString t2 = t1.mid(i1,i2-i1); //selected line + int n = 60*t2.mid(14,2).toInt() + t2.mid(16,2).toInt(); + m_txFirst = ((n%2) == 1); + ui->txFirstCheckBox->setChecked(m_txFirst); + if((t2.indexOf("#")>0) and m_modeTx!="JT65") on_pbTxMode_clicked(); + if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); + + QString t3=t.mid(i1); + int i3=t3.indexOf("\n"); + if(i3<0) i3=t3.length(); + t3=t3.left(i3); + auto const& words = t3.mid(30).split(' ', SkipEmptyParts); + QString grid=words[2]; + if(isGrid4(grid) and hiscall==words[1]) { + ui->dxGridEntry->setText(grid); + } else { + lookup(); + } + + QString rpt=""; + if(ctrl or m_modeTx=="Q65") rpt=t2.mid(25,3); + genStdMsgs(rpt); + if(t2.indexOf(m_myCall)>0) { + m_ntx=2; + ui->txrb2->setChecked(true); + } else { + m_ntx=1; + ui->txrb1->setChecked(true); + } +} + //doubleClickOnMessages +void MainWindow::doubleClickOnMessages(QString hiscall, QString t2, bool ctrl) +{ + if(hiscall.length()<3) return; + if(m_worked[hiscall]) { + msgBox("Possible dupe: " + hiscall + " already in log."); + } + ui->dxCallEntry->setText(hiscall); + int n = 60*t2.mid(13,2).toInt() + t2.mid(15,2).toInt(); + m_txFirst = ((n%2) == 1); + ui->txFirstCheckBox->setChecked(m_txFirst); + + if((t2.indexOf(":")<0) and m_modeTx!="JT65") on_pbTxMode_clicked(); + if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); + + auto const& words = t2.mid(25).split(' ', SkipEmptyParts); + QString grid=words[2]; + if(isGrid4(grid) and hiscall==words[1]) { + ui->dxGridEntry->setText(grid); + } else { + lookup(); + } + + QString rpt=""; + if(ctrl or m_modeTx=="Q65") rpt=t2.mid(20,3); + genStdMsgs(rpt); + + if(t2.indexOf(m_myCall)>0) { + m_ntx=2; + ui->txrb2->setChecked(true); + } else { + m_ntx=1; + ui->txrb1->setChecked(true); + } +} + +void MainWindow::genStdMsgs(QString rpt) //genStdMsgs() +{ + if(rpt.left(2)==" -") rpt="-0"+rpt.mid(2,1); + if(rpt.left(2)==" +") rpt="+0"+rpt.mid(2,1); + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + ui->dxCallEntry->setText(hiscall); + QString t0=hiscall + " " + m_myCall + " "; + QString t=t0; + if(t0.indexOf("/")<0) t=t0 + m_myGrid.mid(0,4); + msgtype(t, ui->tx1); + if(rpt == "" and m_modeTx=="Q65") rpt="-24"; + if(rpt == "" and m_modeTx=="JT65") { + t=t+" OOO"; + msgtype(t, ui->tx2); + msgtype("RO", ui->tx3); + msgtype("RRR", ui->tx4); + msgtype("73", ui->tx5); + } else { + t=t0 + rpt; + msgtype(t, ui->tx2); + t=t0 + "R" + rpt; + msgtype(t, ui->tx3); + t=t0 + "RRR"; + msgtype(t, ui->tx4); + t=t0 + "73"; + msgtype(t, ui->tx5); + } + t="CQ " + m_myCall + " " + m_myGrid.mid(0,4); + msgtype(t, ui->tx6); + m_ntx=1; + ui->txrb1->setChecked(true); +} + +void MainWindow::lookup() //lookup() +{ + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + ui->dxCallEntry->setText(hiscall); + QString call3File = m_appDir + "/CALL3.TXT"; + QFile f(call3File); + if(!f.open(QIODevice::ReadOnly | QIODevice::Text)) { + msgBox("Cannot open " + call3File); + return; + } + char c[132]; + qint64 n=0; + for(int i=0; i<999999; i++) { + n=f.readLine(c,sizeof(c)); + if(n <= 0) { + ui->dxGridEntry->setText(""); + break; + } + QString t=QString(c); + if(t.indexOf(hiscall)==0) { + int i1=t.indexOf(","); + QString hisgrid=t.mid(i1+1,6); + i1=hisgrid.indexOf(","); + if(i1>0) { + hisgrid=hisgrid.mid(0,4); + } else { + hisgrid=hisgrid.mid(0,4) + hisgrid.mid(4,2).toLower(); + } + ui->dxGridEntry->setText(hisgrid); + break; + } + } + f.close(); +} + +void MainWindow::on_lookupButton_clicked() //Lookup button +{ + lookup(); +} + +void MainWindow::on_addButton_clicked() //Add button +{ + if(ui->dxGridEntry->text()=="") { + msgBox("Please enter a valid grid locator."); + return; + } + m_call3Modified=false; + QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); + QString hisgrid=ui->dxGridEntry->text().trimmed(); + QString newEntry=hiscall + "," + hisgrid; + + int ret = QMessageBox::warning(this, "Add", + newEntry + "\n" + "Is this station known to be active on EME?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + newEntry += ",EME,,"; + } else { + newEntry += ",,,"; + } + QString call3File = m_appDir + "/CALL3.TXT"; + QFile f1(call3File); + if(!f1.open(QIODevice::ReadWrite | QIODevice::Text)) { + msgBox("Cannot open " + call3File); + return; + } + + if(f1.size()==0) { + QTextStream out(&f1); + out << "ZZZZZZ" +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; + f1.seek (0); + } + + QString tmpFile = m_appDir + "/CALL3.TMP"; + QFile f2(tmpFile); + if(!f2.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) { + msgBox("Cannot open " + tmpFile); + return; + } + { + QTextStream in(&f1); + QTextStream out(&f2); + QString hc=hiscall; + QString hc1=""; + QString hc2="000000"; + QString s; + do { + s=in.readLine(); + hc1=hc2; + if(s.mid(0,2)=="//") { + out << s + "\n"; + } else { + int i1=s.indexOf(","); + hc2=s.mid(0,i1); + if(hc>hc1 && hchc1 && !m_call3Modified) out << newEntry + "\n"; + } + + if(m_call3Modified) { + auto const& old_path = m_appDir + "/CALL3.OLD"; + QFile f0 {old_path}; + if (f0.exists ()) f0.remove (); + f1.copy (old_path); // copying as we want to preserve + // symlinks + f1.open (QFile::WriteOnly | QFile::Text); // truncates + f2.seek (0); + f1.write (f2.readAll ()); // copy contents + f2.remove (); + } +} + +void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() +{ +// if(t.length()<1) return 0; + char message[23]; + char msgsent[23]; + int len1=22; + int mode65=0; //mode65 ==> check message but don't make wave() + double samfac=1.0; + int nsendingsh=0; + int mwave; + t=t.toUpper(); + int i1=t.indexOf(" OOO"); + QByteArray s=t.toUpper().toLocal8Bit(); + ba2msg(s,message); + gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, + &mwave,len1,len1); + + QPalette p(tx->palette()); + if(nsendingsh==1) { + p.setColor(QPalette::Base,"#66ffff"); + } else if(nsendingsh==-1) { + p.setColor(QPalette::Base,"#ffccff"); + } else { + p.setColor(QPalette::Base,Qt::white); + } + tx->setPalette(p); + int len=t.length(); + if(nsendingsh==-1) { + len=qMin(len,13); + if(i1>10) { + tx->setText(t.mid(0,len).toUpper() + " OOO"); + } else { + tx->setText(t.mid(0,len).toUpper()); + } + } else { + tx->setText(t); + } +} + +void MainWindow::on_tx1_editingFinished() //tx1 edited +{ + QString t=ui->tx1->text(); + msgtype(t, ui->tx1); +} + +void MainWindow::on_tx2_editingFinished() //tx2 edited +{ + QString t=ui->tx2->text(); + msgtype(t, ui->tx2); +} + +void MainWindow::on_tx3_editingFinished() //tx3 edited +{ + QString t=ui->tx3->text(); + msgtype(t, ui->tx3); +} + +void MainWindow::on_tx4_editingFinished() //tx4 edited +{ + QString t=ui->tx4->text(); + msgtype(t, ui->tx4); +} + +void MainWindow::on_tx5_editingFinished() //tx5 edited +{ + QString t=ui->tx5->text(); + msgtype(t, ui->tx5); +} + +void MainWindow::on_tx6_editingFinished() //tx6 edited +{ + QString t=ui->tx6->text(); + msgtype(t, ui->tx6); +} + +void MainWindow::on_setTxFreqButton_clicked() //Set Tx Freq +{ + m_setftx=1; + m_txFreq=m_wide_graph_window->QSOfreq(); +} + +void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed +{ + m_hisCall=t.toUpper().trimmed(); + ui->dxCallEntry->setText(m_hisCall); +} + +void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed +{ + int n=t.length(); + if(n!=4 and n!=6) return; + if(!t[0].isLetter() or !t[1].isLetter()) return; + if(!t[2].isDigit() or !t[3].isDigit()) return; + if(n==4) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2); + if(n==6) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2) + + t.mid(4,2).toLower(); + ui->dxGridEntry->setText(m_hisGrid); +} + +void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button +{ + genStdMsgs(""); +} + +void MainWindow::on_logQSOButton_clicked() //Log QSO button +{ + int nMHz=int(datcom_.fcenter); + QDateTime t = QDateTime::currentDateTimeUtc(); + QString qsoMode=lab5->text(); + if(m_modeTx.startsWith("Q65")) qsoMode=lab6->text(); + QString logEntry=t.date().toString("yyyy-MMM-dd,") + + t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," + + QString::number(nMHz) + "," + qsoMode + "\r\n"; + + int ret = QMessageBox::warning(this, "Log Entry", + "Please confirm log entry:\n\n" + logEntry + "\n", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::No) return; + QFile f("wsjt.log"); + if(!f.open(QFile::Append)) { + msgBox("Cannot open file \"wsjt.log\"."); + return; + } + QTextStream out(&f); + out << logEntry; + f.close(); + m_worked[m_hisCall]=true; +} + +void MainWindow::on_actionErase_map65_rx_log_triggered() //Erase Rx log +{ + int ret = QMessageBox::warning(this, "Confirm Erase", + "Are you sure you want to erase file map65_rx.log ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + m_map65RxLog |= 2; // Rewind map65_rx.log + } +} + +void MainWindow::on_actionErase_map65_tx_log_triggered() //Erase Tx log +{ + int ret = QMessageBox::warning(this, "Confirm Erase", + "Are you sure you want to erase file map65_tx.log ?", + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if(ret==QMessageBox::Yes) { + QFile f("map65_tx.log"); + f.remove(); + } +} + +void MainWindow::on_actionNoJT65_triggered() +{ + m_mode65=0; + m_modeJT65=0; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet(""); + lab5->setText(""); +} +void MainWindow::on_actionJT65A_triggered() +{ + m_mode="JT65A"; + m_modeJT65=1; + m_mode65=1; + m_modeJT65=1; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #ff6666}"); + lab5->setText("JT65A"); + ui->actionJT65A->setChecked(true); +} + +void MainWindow::on_actionJT65B_triggered() +{ + m_mode="JT65B"; + m_modeJT65=2; + m_mode65=2; + m_modeJT65=2; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #ffff66}"); + lab5->setText("JT65B"); + ui->actionJT65B->setChecked(true); +} + +void MainWindow::on_actionJT65C_triggered() +{ + m_mode="JT65C"; + m_modeJT65=3; + m_mode65=4; + m_TRperiod=60; + soundInThread.setPeriod(m_TRperiod); + soundOutThread.setPeriod(m_TRperiod); + m_wide_graph_window->setMode65(m_mode65); + m_wide_graph_window->setPeriod(m_TRperiod); + lab5->setStyleSheet("QLabel{background-color: #66ffb2}"); + lab5->setText("JT65C"); + ui->actionJT65C->setChecked(true); +} + +void MainWindow::on_actionNoQ65_triggered() +{ + m_modeQ65=0; + lab6->setStyleSheet(""); + lab6->setText(""); +} + +void MainWindow::on_actionQ65A_triggered() +{ + m_modeQ65=1; + lab6->setStyleSheet("QLabel{background-color: #ffb266}"); + lab6->setText("Q65A"); +} + +void MainWindow::on_actionQ65B_triggered() +{ + m_modeQ65=2; + lab6->setStyleSheet("QLabel{background-color: #b2ff66}"); + lab6->setText("Q65B"); +} + + +void MainWindow::on_actionQ65C_triggered() +{ + m_modeQ65=3; + lab6->setStyleSheet("QLabel{background-color: #66ffff}"); + lab6->setText("Q65C"); +} + +void MainWindow::on_actionQ65D_triggered() +{ + m_modeQ65=4; + lab6->setStyleSheet("QLabel{background-color: #b266ff}"); + lab6->setText("Q65D"); +} + +void MainWindow::on_actionQ65E_triggered() +{ + m_modeQ65=5; + lab6->setStyleSheet("QLabel{background-color: #ff66ff}"); + lab6->setText("Q65E"); +} + + +void MainWindow::on_NBcheckBox_toggled(bool checked) +{ + m_NB=checked; + ui->NBslider->setEnabled(m_NB); +} + +void MainWindow::on_NBslider_valueChanged(int n) +{ + m_NBslider=n; +} + +void MainWindow::on_actionAdjust_IQ_Calibration_triggered() +{ + m_adjustIQ=1; +} + +void MainWindow::on_actionApply_IQ_Calibration_triggered() +{ + m_applyIQcal= 1-m_applyIQcal; +} + +void MainWindow::on_actionFUNcube_Dongle_triggered() +{ + proc_qthid.start (QDir::toNativeSeparators(m_appDir + "/qthid"), QStringList {}); +} + +void MainWindow::on_actionEdit_wsjt_log_triggered() +{ + proc_editor.start (QDir::toNativeSeparators (m_editorCommand), {QDir::toNativeSeparators (m_appDir + "/wsjt.log"), }); +} + +void MainWindow::on_actionTx_Tune_triggered() +{ + if(g_pTxTune==NULL) { + g_pTxTune = new TxTune(0); + } + g_pTxTune->set_iqAmp(iqAmp); + g_pTxTune->set_iqPhase(iqPhase); + g_pTxTune->set_txPower(txPower); + g_pTxTune->show(); +} + +void MainWindow::on_pbTxMode_clicked() +{ + if(m_modeTx=="Q65") { + m_modeTx="JT65"; + ui->pbTxMode->setText("Tx JT65 #"); + } else { + m_modeTx="Q65"; + ui->pbTxMode->setText("Tx Q65 :"); + } +// m_wideGraph->setModeTx(m_modeTx); +// statusChanged(); +} + +bool MainWindow::isGrid4(QString g) +{ + if(g.length()!=4) return false; + if(g.mid(0,1)<'A' or g.mid(0,1)>'R') return false; + if(g.mid(1,1)<'A' or g.mid(1,1)>'R') return false; + if(g.mid(2,1)<'0' or g.mid(2,1)>'9') return false; + if(g.mid(3,1)<'0' or g.mid(3,1)>'9') return false; + return true; +} + +void MainWindow::read_log() +{ + // Update "m_worked" by reading wsjtx.log + m_worked.clear(); //Start from scratch + QFile f("wsjtx.log"); + f.open(QIODevice::ReadOnly); + if(f.isOpen()) { + QTextStream in(&f); + QString line,callsign; + for(int i=0; i<99999; i++) { + line=in.readLine(); + if(line.length()<=0) break; + callsign=line.mid(40,6); + int n=callsign.indexOf(","); + if(n>0) callsign=callsign.left(n); + m_worked[callsign]=true; + } + f.close(); + } +} diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h new file mode 100644 index 000000000..efe58b866 --- /dev/null +++ b/q65w/mainwindow.h @@ -0,0 +1,330 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H +#include +#include +#include +#include +#include +#include +#include +#include +#include "getfile.h" +#include "soundin.h" +#include "soundout.h" +#include "signalmeter.h" +#include "commons.h" +#include "sleep.h" +#include + +#define NFFT 32768 +#define NSMAX 5760000 + +//--------------------------------------------------------------- MainWindow +namespace Ui { + class MainWindow; +} + +class QTimer; +class Astro; +class BandMap; +class Messages; +class WideGraph; + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + bool m_network; + +public slots: + void showSoundInError(const QString& errorMsg); + void showStatusMessage(const QString& statusMsg); + void dataSink(int k); + void diskDat(); + void diskWriteFinished(); + void freezeDecode(int n); + void readFromStdout(); + void m65_error (QProcess::ProcessError); + void editor_error(); + void guiUpdate(); + void doubleClickOnCall(QString hiscall, bool ctrl); + void doubleClickOnMessages(QString hiscall, QString t2, bool ctrl); + +private: + virtual void keyPressEvent (QKeyEvent *) override; + virtual bool eventFilter (QObject *, QEvent *) override; + virtual void closeEvent (QCloseEvent *) override; + +private slots: + void on_tx1_editingFinished(); + void on_tx2_editingFinished(); + void on_tx3_editingFinished(); + void on_tx4_editingFinished(); + void on_tx5_editingFinished(); + void on_tx6_editingFinished(); + void on_actionDeviceSetup_triggered(); + void on_monitorButton_clicked(); + void on_actionExit_triggered(); + void on_actionAbout_triggered(); + void on_actionLinrad_triggered(); + void on_actionCuteSDR_triggered(); + void on_autoButton_clicked(); + void on_stopTxButton_clicked(); + void on_tolSpinBox_valueChanged(int arg1); + void on_actionAstro_Data_triggered(); + void on_stopButton_clicked(); + void on_actionRelease_Notes_triggered(); + void on_actionOnline_Users_Guide_triggered(); + void on_actionQSG_Q65_triggered(); + void on_actionQSG_MAP65_v3_triggered(); + void on_actionQ65_Sensitivity_in_MAP65_3_0_triggered(); + void on_actionWide_Waterfall_triggered(); + void on_actionBand_Map_triggered(); + void on_actionMessages_triggered(); + void on_actionOpen_triggered(); + void on_actionOpen_next_in_directory_triggered(); + void on_actionDecode_remaining_files_in_directory_triggered(); + void on_actionDelete_all_tf2_files_in_SaveDir_triggered(); + void on_actionErase_Band_Map_and_Messages_triggered(); + void on_actionFind_Delta_Phi_triggered(); + void on_actionF4_sets_Tx6_triggered(); + void on_actionOnly_EME_calls_triggered(); + void on_actionNo_shorthands_if_Tx1_triggered(); + void on_actionNo_Deep_Search_triggered(); + void on_actionNormal_Deep_Search_triggered(); + void on_actionAggressive_Deep_Search_triggered(); + void on_actionNone_triggered(); + void on_actionSave_all_triggered(); + void on_actionKeyboard_shortcuts_triggered(); + void on_actionSpecial_mouse_commands_triggered(); + void on_actionAvailable_suffixes_and_add_on_prefixes_triggered(); + void on_DecodeButton_clicked(); + void decode(); + void decodeBusy(bool b); + void on_EraseButton_clicked(); + void on_txb1_clicked(); + void on_txFirstCheckBox_stateChanged(int arg1); + void set_ntx(int n); + void on_txb2_clicked(); + void on_txb3_clicked(); + void on_txb4_clicked(); + void on_txb5_clicked(); + void on_txb6_clicked(); + void on_lookupButton_clicked(); + void on_addButton_clicked(); + void on_setTxFreqButton_clicked(); + void on_dxCallEntry_textChanged(const QString &arg1); + void on_dxGridEntry_textChanged(const QString &arg1); + void selectCall2(bool ctrl); + void on_genStdMsgsPushButton_clicked(); + void bumpDF(int n); + void on_logQSOButton_clicked(); + void on_actionErase_map65_rx_log_triggered(); + void on_actionErase_map65_tx_log_triggered(); + void on_NBcheckBox_toggled(bool checked); + void on_actionJT65A_triggered(); + void on_actionJT65B_triggered(); + void on_actionJT65C_triggered(); + void on_NBslider_valueChanged(int value); + void on_actionAdjust_IQ_Calibration_triggered(); + void on_actionApply_IQ_Calibration_triggered(); + void on_actionAFMHot_triggered(); + void on_actionBlue_triggered(); + void on_actionFUNcube_Dongle_triggered(); + void on_actionEdit_wsjt_log_triggered(); + void on_actionTx_Tune_triggered(); + void on_actionQ65A_triggered(); + void on_actionQ65B_triggered(); + void on_actionNoJT65_triggered(); + void on_actionNoQ65_triggered(); + void on_actionQ65C_triggered(); + void on_actionQ65D_triggered(); + void on_actionQ65E_triggered(); + + void on_pbTxMode_clicked(); + +private: + Ui::MainWindow *ui; + QString m_appDir; + QString m_settings_filename; + QScopedPointer m_astro_window; + QScopedPointer m_band_map_window; + QScopedPointer m_messages_window; + QScopedPointer m_wide_graph_window; + QPointer m_gui_timer; + qint64 m_msErase; + qint32 m_nDevIn; + qint32 m_nDevOut; + qint32 m_idInt; + qint32 m_waterfallAvg; + qint32 m_DF; + qint32 m_tol; + qint32 m_QSOfreq0; + qint32 m_ntx; + qint32 m_pttPort; + qint32 m_astroFont; + qint32 m_timeout; + qint32 m_dPhi; + qint32 m_fCal; + qint32 m_txFreq; + qint32 m_setftx; + qint32 m_ndepth; + qint32 m_sec0; + qint32 m_map65RxLog; + qint32 m_nutc0; + qint32 m_mode65; + qint32 m_nrx; + qint32 m_hsym0; + qint32 m_paInDevice; + qint32 m_paOutDevice; + qint32 m_udpPort; + qint32 m_NBslider; + qint32 m_adjustIQ; + qint32 m_applyIQcal; + qint32 m_mult570; + qint32 m_mult570Tx; + qint32 m_nsum; + qint32 m_nsave; + qint32 m_TRperiod; + qint32 m_modeJT65; + qint32 m_modeQ65; + qint32 m_RxState; + qint32 m_dB; + + double m_fAdd; + // double m_IQamp; + // double m_IQphase; + double m_cal570; + double m_TxOffset; + double m_xavg; + + bool m_monitoring; + bool m_transmitting; + bool m_diskData; + bool m_loopall; + bool m_decoderBusy; + bool m_txFirst; + bool m_auto; + bool m_txMute; + bool m_restart; + bool m_xpol; + bool m_xpolx; + bool m_call3Modified; + bool m_startAnother; + bool m_saveAll; + bool m_onlyEME; + bool m_widebandDecode; + bool m_kb8rq; + bool m_NB; + bool m_fs96000; + bool m_IQswap; + bool m_initIQplus; + bool m_bIQxt; + + float m_gainx; + float m_gainy; + float m_phasex; + float m_phasey; + float m_pctZap; + + QRect m_wideGraphGeom; + + QLabel* lab1; // labels in status bar + QLabel* lab2; + QLabel* lab3; + QLabel* lab4; + QLabel* lab5; + QLabel* lab6; + QLabel* lab7; + + QMessageBox msgBox0; + + QFuture* future1; + QFuture* future2; + QFutureWatcher* watcher1; + QFutureWatcher* watcher2; + + QProcess proc_m65; + QProcess proc_qthid; + QProcess proc_editor; + + + QString m_path; + QString m_pbdecoding_style1; + QString m_pbmonitor_style; + QString m_pbAutoOn_style; + QString m_messagesText; + QString m_bandmapText; + QString m_myCall; + QString m_myGrid; + QString m_hisCall; + QString m_hisGrid; + QString m_saveDir; + QString m_azelDir; + QString m_dxccPfx; + QString m_palette; + QString m_dateTime; + QString m_mode; + QString m_colors; + QString m_editorCommand; + QString m_modeTx; + + QHash m_worked; + + SignalMeter *xSignalMeter; + SignalMeter *ySignalMeter; + + + SoundInThread soundInThread; //Instantiate the audio threads + SoundOutThread soundOutThread; + + //---------------------------------------------------- private functions + void readSettings(); + void writeSettings(); + void createStatusBar(); + void updateStatusBar(); + void msgBox(QString t); + void genStdMsgs(QString rpt); + void lookup(); + void ba2msg(QByteArray ba, char* message); + void msgtype(QString t, QLineEdit* tx); + void stub(); + bool isGrid4(QString g); + bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); + void read_log(); +}; + +extern void getfile(QString fname, bool xpol, int idInt); +extern void savetf2(QString fname, bool xpol); +extern int killbyname(const char* progName); +extern void getDev(int* numDevices,char hostAPI_DeviceName[][50], + int minChan[], int maxChan[], + int minSpeed[], int maxSpeed[]); + +extern "C" { +//----------------------------------------------------- C and Fortran routines + void symspec_(int* k, int* nxpol, int* ndiskdat, int* nb, + int* m_NBslider, int* idphi, int* nfsample, float* fgreen, + int* iqadjust, int* iqapply, float* gainx, float* gainy, + float* phasex, float* phasey, float* rejectx, float* rejecty, + float* px, float* py, float s[], int* nkhz, int* nhsym, + int* nzap, float* slimit, uchar lstrong[]); + + void gen65_(char* msg, int* mode65, double* samfac, + int* nsendingsh, char* msgsent, short iwave[], int* nwave, + int len1, int len2); + + void gen_q65_wave_(char* msg, int* ntxFreq, int* mode64, + char* msgsent, short iwave[], int* nwave, + int len1, int len2); + + int ptt_(int* nport, int* itx, int* iptt); + + void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, + const char* mygrid, int* ndop00, int len1); + } + +#endif // MAINWINDOW_H diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui new file mode 100644 index 000000000..7497108da --- /dev/null +++ b/q65w/mainwindow.ui @@ -0,0 +1,1742 @@ + + + MainWindow + + + + 0 + 0 + 635 + 523 + + + + + 0 + 0 + + + + + 635 + 0 + + + + + 2048 + 800 + + + + SpecJT by K1JT + + + + + + + + + + + + + 0 + 0 + + + + + 453 + 170 + + + + + 620 + 16777215 + + + + Freq DF Pol UTC DT dB RC DS TxPol + + + + + + + 0 + 0 + + + + + 421 + 100 + + + + + 610 + 400 + + + + + Courier New + 10 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Courier New'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + false + + + + + + + + + + + + + 50 + 0 + + + + Log &QSO + + + + + + + + 50 + 0 + + + + &Stop + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + &Monitor + + + + + + + + 50 + 0 + + + + &Decode + + + + + + + + 50 + 0 + + + + &Erase + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + &Auto is OFF + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + St&op Tx + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + 0 + 0 + + + + + 164 + 40 + + + + + 290 + 16777215 + + + + + + + DX Call DX Grid + + + + + 231 + 13 + 50 + 23 + + + + + 50 + 16777215 + + + + SetMsgs + + + + + + 7 + 13 + 150 + 64 + + + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 70 + 16777215 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 23 + + + + + 70 + 16777215 + + + + + + + Qt::AlignCenter + + + + + + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + &Lookup + + + + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + Add + + + + + + + + + + + 40 + 80 + 90 + 23 + + + + + 0 + 0 + + + + + 90 + 0 + + + + + 70 + 16777215 + + + + &GenStdMsgs + + + + + + + + + 140 + 0 + + + + + 165 + 60 + + + + + 16 + + + + QFrame::Panel + + + 2014 Dec 02 +01:23:45 + + + Qt::AlignCenter + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 20 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + 0 + 23 + + + + + 80 + 16777215 + + + + Tx first + + + + + + + + 90 + 0 + + + + + 80 + 16777215 + + + + Tx Q65 $ + + + + + + + + 90 + 0 + + + + + 80 + 16777215 + + + + Set Tx Freq + + + + + + + Maximum drift rate in units of symbol rate per transmissiion. + + + Qt::AlignCenter + + + Max Drift + + + 50 + + + 5 + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + NB + + + + + + + false + + + + 0 + 0 + + + + + 80 + 16777215 + + + + 0 + + + 100 + + + 40 + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + + 42 + 0 + + + + + 42 + 18 + + + + 500 + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + + 18 + 16777215 + + + + 1 + + + 6 + + + 5 + + + + + + + + 0 + 0 + + + + + 20 + 16777215 + + + + Tol + + + + + + + + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + MS Shell Dlg 2 + + + + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + 160 + 0 + + + + + 180 + 24 + + + + + + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + true + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + 16 + 0 + + + + + 0 + 20 + + + + + 20 + 16777215 + + + + + + + buttonGroup + + + + + + + + + + + + 50 + 20 + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx1 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx2 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx3 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx4 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx5 + + + + + + + + 0 + 16 + + + + + 29 + 20 + + + + Tx6 + + + + + + + + + + + + + + + + + 0 + 0 + 635 + 21 + + + + + File + + + + + + + + + + + + + + + + + Setup + + + + + + + + + + + + + + + View + + + + Waterfall palette + + + + + + + + + + + + + + Decode + + + + + + + + + + + + Save + + + + + + + Help + + + + + + + + + + + + + + Mode + + + + + + + + + + + + + + + + + + + + + + + + TopToolBarArea + + + false + + + + + + Exit + + + + + Options + + + F2 + + + + + About MAP65 + + + Ctrl+F1 + + + + + Astro Data + + + Shift+F10 + + + + + Band Map + + + + + Messages + + + + + Wide Waterfall + + + + + Open + + + + + Open next in directory + + + F6 + + + + + Decode remaining files in directory + + + Shift+F6 + + + + + Delete all *.tf2 and *.iq files in SaveDir + + + + + Erase Band Map and Messages + + + + + Erase map65_rx.log + + + + + true + + + false + + + Linrad + + + + + true + + + true + + + CuteSDR + + + + + Find Delta Phi + + + + + true + + + F4 sets Tx6 + + + + + true + + + Only EME calls + + + + + true + + + No shorthand decodes if Tx1 + + + + + true + + + true + + + No Deep Search + + + + + true + + + Normal Deep Search + + + + + true + + + Aggressive Deep Search + + + + + true + + + true + + + None + + + + + true + + + Save all + + + + + true + + + 50 + + + + + true + + + true + + + 144 + + + + + true + + + 222 + + + + + true + + + 432 + + + + + true + + + 1296 + + + + + true + + + 2304 + + + + + Online User's Guide + + + F1 + + + + + Keyboard shortcuts + + + + + Special mouse commands + + + + + Available suffixes and add-on-prefixes + + + + + Erase map65_tx.log + + + + + true + + + JT65A + + + + + true + + + true + + + JT65B + + + + + true + + + JT65C + + + + + I/Q Calibration + + + F7 + + + + + Adjust Rx I/Q Calibration + + + + + true + + + Apply Rx I/Q Calibration + + + + + true + + + AFMHot + + + + + true + + + Blue + + + + + FUNcube Dongle Settings + + + + + Edit wsjt.log + + + Alt+Shift+E + + + + + Tx Tune + + + Alt+T + + + + + true + + + Decode Q65 near QSO frequency + + + + + true + + + Q65A + + + + + true + + + Q65B + + + + + true + + + No JT65 + + + + + true + + + true + + + No Q65 + + + + + true + + + Q65C + + + + + true + + + Q65D + + + + + true + + + Q65E + + + + + Quick-Start Guide to Q65 + + + + + Quick-Start Guide to WSJT-X 2.5.0 and MAP65 3.0 + + + + + Q65 Sensitivity in MAP65 3.0 + + + + + Release Notes + + + + + + + DisplayText + QTextBrowser +
widgets/displaytext.h
+
+
+ + + + monitorButton + toggled(bool) + MainWindow + update() + + + 269 + 255 + + + 126 + 515 + + + + + + + + true + + + +
diff --git a/q65w/map65.pro b/q65w/map65.pro new file mode 100644 index 000000000..83862ada8 --- /dev/null +++ b/q65w/map65.pro @@ -0,0 +1,70 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-07-07T08:39:24 +# +#------------------------------------------------- + +QT += core gui network +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +CONFIG += thread +#CONFIG += console + +TARGET = map65 +VERSION = 2.5.0 +TEMPLATE = app +DEFINES = QT5 +DESTDIR = /MAP65_2.9 + +F90 = gfortran +gfortran.output = ${QMAKE_FILE_BASE}.o +gfortran.commands = $$F90 -c -O2 -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} +gfortran.input = F90_SOURCES +QMAKE_EXTRA_COMPILERS += gfortran + +win32 { +DEFINES = WIN32 +} + +unix { +DEFINES = UNIX +} + +SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ + soundin.cpp soundout.cpp devsetup.cpp \ + widegraph.cpp getfile.cpp messages.cpp bandmap.cpp \ + astro.cpp displaytext.cpp getdev.cpp \ + txtune.cpp meterwidget.cpp signalmeter.cpp + +win32 { +SOURCES += killbyname.cpp set570.cpp +} + +HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ + about.h devsetup.h widegraph.h getfile.h messages.h \ + bandmap.h commons.h sleep.h astro.h displaytext.h \ + txtune.h meterwidget.h signalmeter.h + +FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ + messages.ui bandmap.ui astro.ui \ + txtune.ui + +RC_FILE = map65.rc + +unix { +LIBS += ../map65/libm65/libm65.a +LIBS += -lfftw3f -lportaudio -lgfortran +#LIBS +- -lusb +} + +win32 { +LIBS += ../map65/libm65/libm65.a +LIBS += ../map65/libfftw3f_win.a +LIBS += ../map65/palir-02.dll +LIBS += libwsock32 +#LIBS += C:/MinGW/lib/libf95.a +LIBS += -lgfortran +#LIBS += -lusb +LIBS += ../map65/libusb.a +#LIBS += -lQt5Concurrent +#LIBS += c:\JTSDK-QT\Qt5\Tools\mingw48_32\i686-w64-mingw32\lib\libmingwex.a +} diff --git a/q65w/map65_config.h.in b/q65w/map65_config.h.in new file mode 100644 index 000000000..ffb971758 --- /dev/null +++ b/q65w/map65_config.h.in @@ -0,0 +1,4 @@ +#include "svnversion.h" + +#define MAP65_VERSION_MAJOR @MAP65_VERSION_MAJOR@ +#define MAP65_VERSION_MINOR @MAP65_VERSION_MINOR@ diff --git a/q65w/map65b.iss b/q65w/map65b.iss new file mode 100644 index 000000000..e2fbdf495 --- /dev/null +++ b/q65w/map65b.iss @@ -0,0 +1,46 @@ +; For Use With JTSDK v2.0.0 +#define MyAppName "MAP65" +#define MyAppVersion "2.7" +#define MyAppPublisher "Joe Taylor, K1JT" +#define MyAppCopyright "Copyright (C) 2001-2017 by Joe Taylor, K1JT" +#define MyAppURL "http://physics.princeton.edu/pulsar/k1jt/map65.html" +#define WsjtGroupURL "https://groups.yahoo.com/neo/groups/wsjtgroup/info" + +[Setup] +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DisableReadyPage=yes +DefaultDirName=C:\WSJT\MAP65 +DefaultGroupName=WSJT +DisableProgramGroupPage=yes +LicenseFile=C:\JTSDK\common-licenses\GPL-3 +OutputDir=C:\JTSDK\map65\package +OutputBaseFilename={#MyAppName}-{#MyAppVersion}-Win32 +SetupIconFile=C:\JTSDK\icons\wsjt.ico +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Files] +Source: "c:\JTSDK\map65\install\Release\bin\*"; DestDir: "{app}"; Excludes: CALL3.TXT; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "C:\JTSDK\src\map65\resources\*"; DestDir: "{app}"; Flags: ignoreversion onlyifdoesntexist + +[Icons] +Name: "{group}\{#MyAppName}\Documentation\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" +Name: "{group}\{#MyAppName}\Resources\{cm:ProgramOnTheWeb,WSJT Group}"; Filename: "{#WsjtGroupURL}" +Name: "{group}\{#MyAppName}\Tools\Wisdom-1"; Filename: "{app}\wisdom1.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{group}\{#MyAppName}\Tools\Wisdom-2"; Filename: "{app}\wisdom2.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{group}\{#MyAppName}\Uninstall\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Comment: "Uninstall MAP65"; +Name: "{group}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" +Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" + +[Run] +Filename: "{app}\wisdom1.bat"; Description: "Optimize plans for FFTs (takes a few minutes)"; Flags: postinstall +Filename: "{app}\wisdom2.bat"; Description: "Patiently optimize plans for FFTs (up to one hour)"; Flags: postinstall unchecked +Filename: "{app}\map65.exe"; Description: "Launch MAP65"; Flags: postinstall nowait unchecked diff --git a/q65w/messages.cpp b/q65w/messages.cpp new file mode 100644 index 000000000..3d0b18954 --- /dev/null +++ b/q65w/messages.cpp @@ -0,0 +1,113 @@ +#include "messages.h" +#include +#include "SettingsGroup.hpp" +#include "ui_messages.h" +#include "mainwindow.h" +#include "qt_helpers.hpp" + +Messages::Messages (QString const& settings_filename, QWidget * parent) : + QDialog {parent}, + ui {new Ui::Messages}, + m_settings_filename {settings_filename} +{ + ui->setupUi(this); + setWindowTitle("Messages"); + setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for + // historical reasons + setGeometry (settings.value ("MessagesGeom", QRect {800, 400, 381, 400}).toRect ()); + ui->messagesTextBrowser->setStyleSheet( \ + "QTextBrowser { background-color : #000066; color : red; }"); + ui->messagesTextBrowser->clear(); + m_cqOnly=false; + m_cqStarOnly=false; + connect (ui->messagesTextBrowser, &DisplayText::selectCallsign, this, &Messages::selectCallsign2); +} + +Messages::~Messages() +{ + QSettings settings {m_settings_filename, QSettings::IniFormat}; + SettingsGroup g {&settings, "MainWindow"}; + settings.setValue ("MessagesGeom", geometry ()); + delete ui; +} + +void Messages::setText(QString t, QString t2) +{ + QString cfreq,cfreq0; + m_t=t; + m_t2=t2; + + QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; + ui->messagesTextBrowser->setStyleSheet(s); + + ui->messagesTextBrowser->clear(); + QStringList lines = t.split( "\n", SkipEmptyParts ); + foreach( QString line, lines ) { + QString t1=line.mid(0,50); + int ncq=t1.indexOf(" CQ "); + if((m_cqOnly or m_cqStarOnly) and ncq< 0) continue; + if(m_cqStarOnly) { + QString caller=t1.mid(ncq+4,-1); + int nz=caller.indexOf(" "); + caller=caller.mid(0,nz); + int i=t2.indexOf(caller); + if(t2.mid(i-1,1)==" ") continue; + } + int n=line.mid(50,2).toInt(); +// if(line.indexOf(":")>0) n=-1; +// if(n==-1) ui->messagesTextBrowser->setTextColor("#ffffff"); // white + if(n==0) ui->messagesTextBrowser->setTextColor(m_color0); + if(n==1) ui->messagesTextBrowser->setTextColor(m_color1); + if(n==2) ui->messagesTextBrowser->setTextColor(m_color2); + if(n>=3) ui->messagesTextBrowser->setTextColor(m_color3); + cfreq=t1.mid(0,3); + if(cfreq == cfreq0) { + t1=" " + t1.mid(3,-1); + } + cfreq0=cfreq; + ui->messagesTextBrowser->append(t1); + } +} + +void Messages::selectCallsign2(bool ctrl) +{ + QString t = ui->messagesTextBrowser->toPlainText(); //Full contents + int i=ui->messagesTextBrowser->textCursor().position(); + int i0=t.lastIndexOf(" ",i); + int i1=t.indexOf(" ",i); + QString hiscall=t.mid(i0+1,i1-i0-1); + if(hiscall!="") { + if(hiscall.length() < 13) { + QString t1 = t.mid(0,i); //contents up to text cursor + int i1=t1.lastIndexOf("\n") + 1; + QString t2 = t.mid(i1,-1); //selected line to end + int i2=t2.indexOf("\n"); + t2=t2.left(i2); //selected line + emit click2OnCallsign(hiscall,t2,ctrl); + } + } +} + +void Messages::setColors(QString t) +{ + m_colorBackground = "#"+t.mid(0,6); + m_color0 = "#"+t.mid(6,6); + m_color1 = "#"+t.mid(12,6); + m_color2 = "#"+t.mid(18,6); + m_color3 = "#"+t.mid(24,6); + setText(m_t,m_t2); +} + +void Messages::on_cbCQ_toggled(bool checked) +{ + m_cqOnly = checked; + setText(m_t,m_t2); +} + +void Messages::on_cbCQstar_toggled(bool checked) +{ + m_cqStarOnly = checked; + setText(m_t,m_t2); +} diff --git a/q65w/messages.h b/q65w/messages.h new file mode 100644 index 000000000..995c3d12f --- /dev/null +++ b/q65w/messages.h @@ -0,0 +1,44 @@ +#ifndef MESSAGES_H +#define MESSAGES_H + +#include + +namespace Ui { + class Messages; +} + +class Messages : public QDialog +{ + Q_OBJECT + +public: + explicit Messages (QString const& settings_filename, QWidget * parent = nullptr); + void setText(QString t, QString t2); + void setColors(QString t); + + ~Messages(); + +signals: + void click2OnCallsign(QString hiscall, QString t2, bool ctrl); + +private slots: + void selectCallsign2(bool ctrl); + void on_cbCQ_toggled(bool checked); + void on_cbCQstar_toggled(bool checked); + +private: + Ui::Messages *ui; + QString m_settings_filename; + QString m_t; + QString m_t2; + QString m_colorBackground; + QString m_color0; + QString m_color1; + QString m_color2; + QString m_color3; + + bool m_cqOnly; + bool m_cqStarOnly; +}; + +#endif diff --git a/q65w/messages.ui b/q65w/messages.ui new file mode 100644 index 000000000..3bf0dc67a --- /dev/null +++ b/q65w/messages.ui @@ -0,0 +1,107 @@ + + + Messages + + + + 0 + 0 + 399 + 595 + + + + + 0 + 0 + + + + Dialog + + + + + + QLayout::SetDefaultConstraint + + + + + + + + 0 + 0 + + + + Freq DF Pol UTC dB + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + CQ* Only + + + + + + + CQ Only + + + + + + + + + + 0 + 0 + + + + + 340 + 0 + + + + + Courier New + 9 + + + + + + + + + + + DisplayText + QTextBrowser +
displaytext.h
+
+
+ + +
diff --git a/q65w/meterwidget.cpp b/q65w/meterwidget.cpp new file mode 100644 index 000000000..8e48ed57d --- /dev/null +++ b/q65w/meterwidget.cpp @@ -0,0 +1,49 @@ +// Simple bargraph meter +// Implemented by Edson Pereira PY2SDR + +#include "meterwidget.h" + +MeterWidget::MeterWidget(QWidget *parent) : + QWidget(parent), + m_signal(0) +{ + for ( int i = 0; i < 10; i++ ) { + signalQueue.enqueue(0); + } +} + +void MeterWidget::setValue(int value) +{ + m_signal = value; + signalQueue.enqueue(value); + signalQueue.dequeue(); + + // Get signal peak + int tmp = 0; + for (int i = 0; i < signalQueue.size(); ++i) { + if (signalQueue.at(i) > tmp) + tmp = signalQueue.at(i); + } + m_sigPeak = tmp; + + update(); +} + +void MeterWidget::paintEvent( QPaintEvent * ) +{ + int pos; + QPainter p {this}; + + // Sanitize + m_signal = m_signal < 0 ? 0 : m_signal; + m_signal = m_signal > 60 ? 60 : m_signal; + + pos = m_signal * 2; + QRect r(0, height() - pos, width(), pos ); + p.fillRect(r, QColor( 255, 150, 0 )); + + // Draw peak hold indicator + p.setPen(Qt::black); + pos = m_sigPeak * 2; + p.drawLine(0, height() - pos, 10, height() - pos); +} diff --git a/q65w/meterwidget.h b/q65w/meterwidget.h new file mode 100644 index 000000000..7b51efb65 --- /dev/null +++ b/q65w/meterwidget.h @@ -0,0 +1,30 @@ +#ifndef METERWIDGET_H +#define METERWIDGET_H + +#include +#include +#include + +class MeterWidget : public QWidget +{ + Q_OBJECT +public: + explicit MeterWidget(QWidget *parent = 0); + +signals: + +public slots: + void setValue(int value); + +private: + QQueue signalQueue; + + int m_signal; + int m_sigPeak; + +protected: + void paintEvent( QPaintEvent * ); + +}; + +#endif // METERWIDGET_H diff --git a/q65w/paInputDevice.c b/q65w/paInputDevice.c new file mode 100644 index 000000000..bad4973f4 --- /dev/null +++ b/q65w/paInputDevice.c @@ -0,0 +1,56 @@ +#include +#include +#include + +void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, + int* maxChan, int* minSpeed, int* maxSpeed) +{ + int i; + char pa_device_name[128]; + char pa_device_hostapi[128]; + double pa_device_max_speed; + double pa_device_min_speed; + int pa_device_max_bytes; + int pa_device_min_bytes; + int pa_device_max_channels; + int pa_device_min_channels; + char p2[256]; + char *p,*p1; + static int iret, valid_dev_cnt; + + iret=pa_get_device_info (id, + &pa_device_name, + &pa_device_hostapi, + &pa_device_max_speed, + &pa_device_min_speed, + &pa_device_max_bytes, + &pa_device_min_bytes, + &pa_device_max_channels, + &pa_device_min_channels); + + if (iret >= 0 ) { + valid_dev_cnt++; + + p1=""; + p=strstr(pa_device_hostapi,"MME"); + if(p!=NULL) p1="MME"; + p=strstr(pa_device_hostapi,"Direct"); + if(p!=NULL) p1="DirectX"; + p=strstr(pa_device_hostapi,"WASAPI"); + if(p!=NULL) p1="WASAPI"; + p=strstr(pa_device_hostapi,"ASIO"); + if(p!=NULL) p1="ASIO"; + p=strstr(pa_device_hostapi,"WDM-KS"); + if(p!=NULL) p1="WDM-KS"; + + sprintf(p2,"%-8s %-39s",p1,pa_device_name); + for(i=0; i<50; i++) { + hostAPI_DeviceName[i]=p2[i]; + if(p2[i]==0) break; + } + *minChan=pa_device_min_channels; + *maxChan=pa_device_max_channels; + *minSpeed=(int)pa_device_min_speed; + *maxSpeed=(int)pa_device_max_speed; + } +} diff --git a/q65w/pa_get_device_info.c b/q65w/pa_get_device_info.c new file mode 100644 index 000000000..968d3434b --- /dev/null +++ b/q65w/pa_get_device_info.c @@ -0,0 +1,173 @@ +#include +#include +#include + +#define MAX_LATENCY 20 + +PaStream *in_stream; +//------------------------------------------------------- pa_get_device_info +int pa_get_device_info (int n, + void *pa_device_name, + void *pa_device_hostapi, + double *pa_device_max_speed, + double *pa_device_min_speed, + int *pa_device_max_bytes, + int *pa_device_min_bytes, + int *pa_device_max_channels, + int *pa_device_min_channels ) +{ + + (void) n ; + (void) pa_device_name; + (void) pa_device_hostapi; + (void) pa_device_max_speed; + (void) pa_device_min_speed; + (void) pa_device_max_bytes; + (void) pa_device_min_bytes; + (void) pa_device_max_channels; + (void) pa_device_min_channels; + const PaDeviceInfo *deviceInfo; + PaError pa_err; + PaStreamParameters inputParameters; + int i,j, speed_warning; + int minBytes, maxBytes; + double maxStandardSampleRate; + double minStandardSampleRate; + int minInputChannels; + int maxInputChannels; + +// negative terminated list + static double standardSampleRates[] = {8000.0, 9600.0, + 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, + 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; +// ******************************************************* + + + *pa_device_max_speed=0; + *pa_device_min_speed=0; + *pa_device_max_bytes=0; + *pa_device_min_bytes=0; + *pa_device_max_channels=0; + *pa_device_min_channels=0; + minInputChannels=0; + if(n >= Pa_GetDeviceCount() ) return -1; + deviceInfo = Pa_GetDeviceInfo(n); + if (deviceInfo->maxInputChannels==0) return -1; + sprintf((char*)(pa_device_name),"%s",deviceInfo->name); + sprintf((char*)(pa_device_hostapi),"%s", + Pa_GetHostApiInfo( deviceInfo->hostApi )->name); + speed_warning=0; + +// bypass bug in Juli@ ASIO driver: +// this driver hangs after a Pa_IsFormatSupported call + i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); + if (i == 0) { + minStandardSampleRate=44100; + maxStandardSampleRate=192000; + minBytes=1; + maxBytes=4; + maxInputChannels= deviceInfo->maxInputChannels; + minInputChannels= 1; + goto end_pa_get_device_info; + } + +// Investigate device capabilities. +// Check min and max samplerates with 16 bit data. + maxStandardSampleRate=0; + minStandardSampleRate=0; + inputParameters.device = n; + inputParameters.channelCount = deviceInfo->maxInputChannels; + inputParameters.sampleFormat = paInt16; + inputParameters.suggestedLatency = 0; + inputParameters.hostApiSpecificStreamInfo = NULL; + +// ************************************************************************ +//filter for portaudio Windows hostapi's with non experts. +//only allow ASIO or WASAPI or WDM-KS + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WASAPI", 14); + if (i==0 ) goto end_filter_hostapi; + i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, + "Windows WDM-KS", 14); + if (i==0 ) goto end_filter_hostapi; + speed_warning=1; +end_filter_hostapi:; + +// ************************************************************************ + i=0; + while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if(pa_err == paFormatIsSupported ) { + minStandardSampleRate=standardSampleRates[i]; + } + i++; + } + if(minStandardSampleRate == 0) return -1; + j=i; + while(standardSampleRates[i] > 0 ) i++; + i--; + while(i >= j && maxStandardSampleRate==0) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + standardSampleRates[i] ); + if(pa_err == paDeviceUnavailable) return -1; + if(pa_err == paInvalidDevice) return -1; + if( pa_err == paFormatIsSupported ) { + maxStandardSampleRate=standardSampleRates[i]; + } + i--; + } + +// check if min SampleRate = max SampleRate + if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { + maxStandardSampleRate= minStandardSampleRate; + } + +// check min and max bytes + minBytes=2; + maxBytes=2; + inputParameters.sampleFormat = paUInt8; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + minBytes=1; + } + inputParameters.sampleFormat = paInt32; + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + if( pa_err == paFormatIsSupported ) { + maxBytes=4; + } + +// check min channel count + maxInputChannels= deviceInfo->maxInputChannels; + inputParameters.channelCount = 1; + inputParameters.sampleFormat = paInt16; + pa_err=paFormatIsSupported+32000; + while(pa_err != paFormatIsSupported && + ( inputParameters.channelCount < (maxInputChannels+1)) ) { + pa_err=Pa_IsFormatSupported(&inputParameters, NULL, + maxStandardSampleRate ); + inputParameters.channelCount++; + } + if( pa_err == paFormatIsSupported ) { + minInputChannels=inputParameters.channelCount-1; + } else { + return -1; + } + +end_pa_get_device_info:; + + *pa_device_max_speed=maxStandardSampleRate; + *pa_device_min_speed=minStandardSampleRate; + *pa_device_max_bytes=maxBytes; + *pa_device_min_bytes=minBytes; + *pa_device_max_channels= maxInputChannels; + *pa_device_min_channels= minInputChannels; + + return speed_warning; +} diff --git a/q65w/plotter.cpp b/q65w/plotter.cpp new file mode 100644 index 000000000..ab53a4efb --- /dev/null +++ b/q65w/plotter.cpp @@ -0,0 +1,792 @@ +#include "plotter.h" +#include +#include +#include +#include + +#define MAX_SCREENSIZE 2048 + + +CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor + QFrame(parent) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_PaintOnScreen,false); + setAutoFillBackground(false); + setAttribute(Qt::WA_OpaquePaintEvent, false); + setAttribute(Qt::WA_NoSystemBackground, true); + setMouseTracking(true); + + m_StartFreq = 100; + m_nSpan=65; //Units: kHz + m_fSpan=(float)m_nSpan; + m_hdivs = HORZ_DIVS; + m_FreqUnits = 1; + m_Running = false; + m_paintEventBusy=false; + m_WaterfallPixmap = QPixmap(0,0); + m_ZoomWaterfallPixmap = QPixmap(0,0); + m_2DPixmap = QPixmap(0,0); + m_ScalePixmap = QPixmap(0,0); + m_ZoomScalePixmap = QPixmap(0,0); + m_Size = QSize(0,0); + m_fQSO = 125; + m_TXkHz = m_fQSO; + m_line = 0; + m_fSample = 96000; + m_paintAllZoom = false; + m_TxDF=0; + m_bDecodeFinished=false; +} + +CPlotter::~CPlotter() { } // Destructor + +QSize CPlotter::minimumSizeHint() const +{ + return QSize(50, 50); +} + +QSize CPlotter::sizeHint() const +{ + return QSize(180, 180); +} + +void CPlotter::resizeEvent(QResizeEvent* ) //resizeEvent() +{ + if(!size().isValid()) return; + if( m_Size != size() ) { + //if changed, resize pixmaps to new screensize + m_Size = size(); + int w = m_Size.width(); + int h = (m_Size.height()-60)/2; + m_WaterfallPixmap = QPixmap(w,h); + m_ZoomWaterfallPixmap = QPixmap(w,h); + m_2DPixmap = QPixmap(w,h); + m_WaterfallPixmap.fill(Qt::black); + m_ZoomWaterfallPixmap.fill(Qt::black); + m_2DPixmap.fill(Qt::black); + memset(m_zwf,0,32768*h); + m_ScalePixmap = QPixmap(w,30); + m_ZoomScalePixmap = QPixmap(w,30); //(no change on resize...) + m_ScalePixmap.fill(Qt::white); + m_ZoomScalePixmap.fill(Qt::yellow); + } + SetCenterFreq(-1); + DrawOverlay(); +} + +void CPlotter::paintEvent(QPaintEvent *) // paintEvent() +{ + static int x00=-99; + + if(m_paintEventBusy) return; + m_paintEventBusy=true; + QPainter painter(this); + int w = m_Size.width(); + int h = (m_Size.height()-60)/2; + painter.drawPixmap(0,0,m_ScalePixmap); + painter.drawPixmap(0,30,m_WaterfallPixmap); + if(m_2Dspec) { + painter.drawPixmap(0,h+30,m_ScalePixmap); + painter.drawPixmap(0,h+60,m_2DPixmap); + m_paintEventBusy=false; + return; + } + + painter.drawPixmap(0,h+30,m_ZoomScalePixmap); + painter.drawPixmap(0,h+60,m_ZoomWaterfallPixmap); + + QRect target(0,h+30,w,30); // (x,y,width,height) + QRect source(0,0,w,30); + painter.drawPixmap(target,m_ZoomScalePixmap,source); + + float df=m_fSample/32768.0; + int x0=16384 + (0.001*(m_ZoomStartFreq+m_fCal)+m_fQSO-m_nkhz+1.27046) * \ + 1000.0/df + 0.5; + + QPainter painter1(&m_WaterfallPixmap); + QPainter painter2(&m_ZoomWaterfallPixmap); + for(int i=0; i> freq >> sync; + if(f.eof()) break; + x=(freq - m_ZoomStartFreq)/df; + y=(sync-slimit)*3.0; + if(y>0) { + if(y>15.0) y=15.0; + if(x>=0 and x<=w) painter2.drawLine(x,0,x,y); + x=XfromFreq(float(fQSO()+0.001*freq)); + painter1.setPen(pen0); + painter1.drawLine(x,0,x,y); + } + } + f.close(); + } + */ + m_bDecodeFinished=false; + } + + m_paintAllZoom=false; + x00=x0; + + QRect target2(0,h+60,w,h); // (x,y,width,height) + QRect source2(0,0,w,h); + painter.drawPixmap(target2,m_ZoomWaterfallPixmap,source2); + m_paintEventBusy=false; +} + +void CPlotter::DecodeFinished() +{ + m_bDecodeFinished=true; + update(); //trigger a new paintEvent +} + +void CPlotter::draw(float s[], int i0, float splot[]) //draw() +{ + int i,j,w,h; + float y; + + m_i0=i0; + w = m_WaterfallPixmap.width(); + h = m_WaterfallPixmap.height(); + double gain = pow(10.0,0.05*(m_plotGain+7)); + + //move current data down one line + //(must do this before attaching a QPainter object) + m_WaterfallPixmap.scroll(0,1,0,0,w,h); + m_ZoomWaterfallPixmap.scroll(0,1,0,0, w, h); + memmove(&m_zwf[32768],m_zwf,32768*(h-1)); + QPainter painter1(&m_WaterfallPixmap); + QPainter painter2D(&m_2DPixmap); + + for(i=0; i<256; i++) { //Zero the histograms + m_hist1[i]=0; + m_hist2[i]=0; + } + + painter2D.setPen(Qt::green); + QRect tmp(0,0,w,h); + painter2D.fillRect(tmp,Qt::black); + QPoint LineBuf[MAX_SCREENSIZE]; + j=0; + bool strong0=false; + bool strong=false; + + for(i=0; i254) y1=254; + if (s[i]>1.e29) y1=255; + m_hist1[y1]++; + painter1.setPen(m_ColorTbl[y1]); + painter1.drawPoint(i,0); + if(m_2Dspec) { + int y2 = gain*(y + 34 -m_plotZero); + if (y2<0) y2=0; + if (y2>254) y2=254; + if (s[i]>1.e29) y2=255; + if(strong != strong0 or i==w-1) { + painter2D.drawPolyline(LineBuf,j); + j=0; + strong0=strong; + if(strong0) painter2D.setPen(Qt::red); + if(!strong0) painter2D.setPen(Qt::green); + } + LineBuf[j].setX(i); + LineBuf[j].setY(h-y2); + j++; + } + } + + for(i=0; i<32768; i++) { + y = 10.0*log10(splot[i]); + int y1 = 5.0*gain*(y + 30 - m_plotZero); + if (y1<0) y1=0; + if (y1>254) y1=254; + if (splot[i]>1.e29) y1=255; + m_hist2[y1]++; + m_zwf[i]=y1; + } + + if(s[0]>1.0e29) m_line=0; + m_line++; + if(m_line == 13) { + UTCstr(); + painter1.setPen(m_ColorTbl[255]); + painter1.drawText(5,10,m_sutc); + m_paintAllZoom=true; + } + update(); //trigger a new paintEvent +} + +void CPlotter::UTCstr() +{ + int ihr,imin; + if(datcom_.ndiskdat != 0) { + ihr=datcom_.nutc/100; + imin=(datcom_.nutc) % 100; + } else { + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + imin=ms/60000; + ihr=imin/60; + imin=imin % 60; + } + m_sutc = QString {"%1:%2"}.arg (ihr,2,10,QLatin1Char('0')).arg (imin,2,10,QLatin1Char('0')); +} + +void CPlotter::DrawOverlay() //DrawOverlay() +{ + if(m_WaterfallPixmap.isNull()) return; + int w = m_WaterfallPixmap.width(); + int x,y; + float pixperdiv; + + QRect rect0; + QPainter painter0(&m_ScalePixmap); + + //create Font to use for scales + QFont Font("Arial"); + Font.setPointSize(12); + QFontMetrics metrics(Font); + Font.setWeight(QFont::Normal); + painter0.setFont(Font); + painter0.setPen(Qt::black); + + m_binsPerPixel = m_nSpan * 32768.0/(w*0.001*m_fSample) + 0.5; + double FreqPerDiv=5.0; + double df = m_binsPerPixel*0.001*m_fSample/32768.0; + m_hdivs = w*df/FreqPerDiv + 0.9999; + m_fSpan = w*df; + m_ScalePixmap.fill(Qt::white); + painter0.drawRect(0, 0, w, 30); + + //draw tick marks on wideband (upper) scale + pixperdiv = FreqPerDiv/df; + for( int i=1; i0 and x0 100) { + m_FreqUnits = 1; + FreqPerDiv = 200; + int w = m_WaterfallPixmap.width(); + float df=m_fSample/32768.0; + StartFreq = -w*df/2; + int n=StartFreq/FreqPerDiv; + StartFreq=n*200; + m_ZoomStartFreq = (int)StartFreq; + } + int numfractdigits = (int)log10((double)m_FreqUnits); + + if(1 == m_FreqUnits) { + //if units is Hz then just output integer freq + for(int i=0; i<=m_hdivs; i++) { + freq = StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum((int)freq); + StartFreq += FreqPerDiv; + } + return; + } + //here if is fractional frequency values + //so create max sized text based on frequency units + for(int i=0; i<=m_hdivs; i++) { + freq = StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum(freq,'f', numfractdigits); + StartFreq += FreqPerDiv; + } + //now find the division text with the longest non-zero digit + //to the right of the decimal point. + int max = 0; + for(i=0; i<=m_hdivs; i++) { + int dp = m_HDivText[i].indexOf('.'); + int l = m_HDivText[i].length()-1; + for(j=l; j>dp; j--) { + if(m_HDivText[i][j] != '0') + break; + } + if( (j-dp) > max) + max = j-dp; + } + //truncate all strings to maximum fractional length + StartFreq = m_CenterFreq - 0.5*m_fSpan; + for( i=0; i<=m_hdivs; i++) { + freq = (float)StartFreq/(float)m_FreqUnits; + m_HDivText[i].setNum(freq,'f', max); + StartFreq += FreqPerDiv; + } +} + +int CPlotter::XfromFreq(float f) //XfromFreq() +{ + float w = m_WaterfallPixmap.width(); + int x = (int) w * (f - m_StartFreq)/m_fSpan; + if(x<0 ) return 0; + if(x>(int)w) return m_WaterfallPixmap.width(); + return x; +} + +float CPlotter::FreqfromX(int x) //FreqfromX() +{ + float w = m_WaterfallPixmap.width(); + float f =m_CenterFreq - 0.5*m_fSpan + m_fSpan * x/w; + return f; +} + +void CPlotter::SetRunningState(bool running) //SetRunningState() +{ + m_Running = running; +} + +void CPlotter::setPlotZero(int plotZero) //setPlotZero() +{ + m_plotZero=plotZero; +} + +int CPlotter::getPlotZero() //getPlotZero() +{ + return m_plotZero; +} + +void CPlotter::setPlotGain(int plotGain) //setPlotGain() +{ + m_plotGain=plotGain; +} + +int CPlotter::getPlotGain() //getPlotGain() +{ + return m_plotGain; +} + +void CPlotter::SetCenterFreq(int f) //setCenterFreq() +{ +// f is the integer kHz portion of cfreq, from Linrad packets + if(f<0) f=m_nkhz; + int ns = (f+m_FreqOffset-0.5*m_fSpan)/5.0 + 0.5; + double fs = 5*ns; + m_CenterFreq = fs + 0.5*m_fSpan; +} + +qint64 CPlotter::centerFreq() //centerFreq() +{ + return m_CenterFreq; +} + +void CPlotter::SetStartFreq(quint64 f) //SetStartFreq() +{ + m_StartFreq=f; +// resizeEvent(NULL); + DrawOverlay(); +} + +qint64 CPlotter::startFreq() //startFreq() +{ + return m_StartFreq; +} + +void CPlotter::SetFreqOffset(quint64 f) //SetFreqOffset() +{ + m_FreqOffset=f; + DrawOverlay(); +} + +qint64 CPlotter::freqOffset() {return m_FreqOffset;} //freqOffset() +int CPlotter::plotWidth(){return m_WaterfallPixmap.width();} +void CPlotter::UpdateOverlay() {DrawOverlay();} +void CPlotter::setDataFromDisk(bool b) {m_dataFromDisk=b;} + +void CPlotter::setTol(int n) //setTol() +{ + m_tol=n; + DrawOverlay(); +} + +void CPlotter::setBinsPerPixel(int n) {m_binsPerPixel = n;} //set nbpp + +int CPlotter::binsPerPixel(){return m_binsPerPixel;} //get nbpp + +void CPlotter::setFQSO(int x, bool bf) //setFQSO() +{ + if(bf) { + m_fQSO=x; // x is freq in kHz + } else { + if(x<0) x=0; // x is pixel number + if(x>m_Size.width()) x=m_Size.width(); + m_fQSO = int(FreqfromX(x)+0.5); + m_xClick=x; + } + if(m_bLockTxRx) m_TXkHz=m_fQSO; + m_TXfreq = floor(datcom_.fcenter) + 0.001*m_TXkHz; + DrawOverlay(); + update(); +} + +void CPlotter::setFcal(int n) //setFcal() +{ + m_fCal=n; +} + +void CPlotter::setNkhz(int n) //setNkhz() +{ + m_nkhz=n; +} + +int CPlotter::fQSO() {return m_fQSO;} //get fQSO + +int CPlotter::DF() {return m_DF;} // get DF + +void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent +{ + int h = (m_Size.height()-60)/2; + int x=event->x(); + int y=event->y(); + int button=event->button(); + if(y < h+30) { // Wideband waterfall + if(button==1) { + setFQSO(x,false); + } + if(button==2 and !m_bLockTxRx) { + if(x<0) x=0; // x is pixel number + if(x>m_Size.width()) x=m_Size.width(); + m_TXkHz = int(FreqfromX(x)+0.5); + m_TXfreq = floor(datcom_.fcenter) + 0.001*m_TXkHz; + } + } else { // Zoomed waterfall + if(button==1) m_DF=int(m_ZoomStartFreq + x*m_fSample/32768.0); + if(button==2 and !m_bLockTxRx) m_TxDF=int(m_ZoomStartFreq + x*m_fSample/32768.0); + if(m_bLockTxRx) m_TxDF=m_DF; + } + DrawOverlay(); + update(); +} + +void CPlotter::mouseDoubleClickEvent(QMouseEvent *event) //mouse2click +{ + if(event->button()!=1) return; //Act only on left double-click + int h = (m_Size.height()-60)/2; + int x=event->x(); + int y=event->y(); + if(y < h+30) { + m_DF=0; + setFQSO(x,false); + emit freezeDecode1(2); //### ??? + } else { + float f = m_ZoomStartFreq + x*m_fSample/32768.0; + m_DF=int(f); + emit freezeDecode1(1); + DrawOverlay(); + } +} + +int CPlotter::autoZero() //autoZero() +{ + m_z1=0; + m_z2=0; + int sum1=0; + for(int i=0; i<256; i++) { + sum1 += m_hist1[i]; + if(sum1 > m_Size.width()/2) { + m_z1=i; + break; + } + } + int sum2=0; + for(int i=0; i<256; i++) { + sum2 += m_hist2[i]; + if(sum2 > 16384) { + m_z2=i; + break; + } + } + double gain = pow(10.0,0.05*(m_plotGain+7)); +// double dz1 = (m_z1-38)/(5.0*gain); + double dz2 = (m_z2-28)/(5.0*gain); + if(m_z2 < 255) m_plotZero = int(m_plotZero + dz2 + 0.5); + return m_plotZero; +} + +void CPlotter::setNSpan(int n) //setNSpan() +{ + m_nSpan=n; +} + +void CPlotter::setPalette(QString palette) //setPalette() +{ + if(palette=="Linrad") { + float twopi=6.2831853; + float r,g,b,phi,x; + for(int i=0; i<256; i++) { + r=0.0; + if(i>105 and i<=198) { + phi=(twopi/4.0) * (i-105.0)/(198.0-105.0); + r=sin(phi); + } else if(i>=198) { + r=1.0; + } + + g=0.0; + if(i>35 and i<198) { + phi=(twopi/4.0) * (i-35.0)/(122.5-35.0); + g=0.625*sin(phi); + } else if(i>=198) { + x=(i-186.0); + g=-0.014 + 0.0144*x -0.00007*x*x +0.000002*x*x*x; + if(g>1.0) g=1.0; + } + + b=0.0; + if(i<=117) { + phi=(twopi/2.0) * i/117.0; + b=0.4531*sin(phi); + } else if(i>186) { + x=(i-186.0); + b=-0.014 + 0.0144*x -0.00007*x*x +0.000002*x*x*x; + if(b>1.0) b=1.0; + } + m_ColorTbl[i].setRgb(int(255.0*r),int(255.0*g),int(255.0*b)); + } + m_ColorTbl[255].setRgb(255,255,100); + + } + + if(palette=="CuteSDR") { + for( int i=0; i<256; i++) { + if( (i<43) ) + m_ColorTbl[i].setRgb( 0,0, 255*(i)/43); + if( (i>=43) && (i<87) ) + m_ColorTbl[i].setRgb( 0, 255*(i-43)/43, 255 ); + if( (i>=87) && (i<120) ) + m_ColorTbl[i].setRgb( 0,255, 255-(255*(i-87)/32)); + if( (i>=120) && (i<154) ) + m_ColorTbl[i].setRgb( (255*(i-120)/33), 255, 0); + if( (i>=154) && (i<217) ) + m_ColorTbl[i].setRgb( 255, 255 - (255*(i-154)/62), 0); + if( (i>=217) ) + m_ColorTbl[i].setRgb( 255, 0, 128*(i-217)/38); + } + m_ColorTbl[255].setRgb(255,255,100); + } +} + +void CPlotter::setFsample(int n) +{ + m_fSample=n; +} + +void CPlotter::setMode65(int n) +{ + m_mode65=n; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent +} + +void CPlotter::set2Dspec(bool b) +{ + m_2Dspec=b; + m_paintAllZoom=!b; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent} +} + +double CPlotter::fGreen() +{ + return m_fGreen; +} + +void CPlotter::setLockTxRx(bool b) +{ + m_bLockTxRx=b; + if(m_bLockTxRx) { + m_TXkHz=m_fQSO; + m_TXfreq=floor(m_TXfreq) + 0.001*m_TXkHz; + m_TxDF=m_DF; + DrawOverlay(); //Redraw scales and ticks + update(); //trigger a new paintEvent} + } +} + +void CPlotter::mouseMoveEvent (QMouseEvent * event) +{ + int h = m_WaterfallPixmap.height(); + int x=event->x(); + int y=event->y(); + bool lower=(y > 30+h); + float freq=FreqfromX(x); + float df=m_fSample/32768.0; + int ndf=x*df + m_ZoomStartFreq; + if(lower) { + QToolTip::showText(event->globalPos(),QString::number(ndf)); + } else { + QToolTip::showText(event->globalPos(),QString::number(freq,'f',3)); + } + QWidget::mouseMoveEvent(event); +} + +double CPlotter::rxFreq() +{ + return floor(datcom_.fcenter) + 0.001*m_fQSO + 0.000001*m_DF; +} + +double CPlotter::txFreq() +{ + return m_TXfreq + 0.000001*m_TxDF; +} diff --git a/q65w/plotter.h b/q65w/plotter.h new file mode 100644 index 000000000..36f0bcd0f --- /dev/null +++ b/q65w/plotter.h @@ -0,0 +1,139 @@ +/////////////////////////////////////////////////////////////////////////// +// Some code in this file and accompanying files is based on work by +// Moe Wheatley, AE4Y, released under the "Simplified BSD License". +// For more details see the accompanying file LICENSE_WHEATLEY.TXT +/////////////////////////////////////////////////////////////////////////// + +#ifndef PLOTTER_H +#define PLOTTER_H + +#include +#include +#include +#include +#include +#include "commons.h" + +#define VERT_DIVS 7 //specify grid screen divisions +#define HORZ_DIVS 20 + +class CPlotter : public QFrame +{ + Q_OBJECT +public: + explicit CPlotter(QWidget *parent = 0); + ~CPlotter(); + + QSize minimumSizeHint() const override; + QSize sizeHint() const override; + QColor m_ColorTbl[256]; + bool m_bDecodeFinished; + int m_plotZero; + int m_plotGain; + float m_fSpan; + qint32 m_nSpan; + qint32 m_binsPerPixel; + qint32 m_fQSO; + qint32 m_DF; + qint32 m_tol; + qint32 m_fCal; + + void draw(float sw[], int i0, float splot[]); //Update the waterfalls + void SetRunningState(bool running); + void setPlotZero(int plotZero); + int getPlotZero(); + void setPlotGain(int plotGain); + int getPlotGain(); + void SetCenterFreq(int f); + qint64 centerFreq(); + void SetStartFreq(quint64 f); + qint64 startFreq(); + void SetFreqOffset(quint64 f); + qint64 freqOffset(); + int plotWidth(); + void setNSpan(int n); + void UpdateOverlay(); + void setDataFromDisk(bool b); + void setTol(int n); + void setBinsPerPixel(int n); + int binsPerPixel(); + void setFQSO(int n, bool bf); + void setFcal(int n); + void setNkhz(int n); + void DecodeFinished(); + void DrawOverlay(); + int fQSO(); + int DF(); + int autoZero(); + void setPalette(QString palette); + void setFsample(int n); + void setMode65(int n); + void set2Dspec(bool b); + double fGreen(); + void setLockTxRx(bool b); + double rxFreq(); + double txFreq(); +// void updateFreqLabel(); + +signals: + void freezeDecode0(int n); + void freezeDecode1(int n); + +protected: + //re-implemented widget event handlers + void paintEvent(QPaintEvent *event) override; + void resizeEvent(QResizeEvent* event) override; + void mouseMoveEvent(QMouseEvent * event) override; + +private: + + void MakeFrequencyStrs(); + void UTCstr(); + int XfromFreq(float f); + float FreqfromX(int x); + qint64 RoundFreq(qint64 freq, int resolution); + + QPixmap m_WaterfallPixmap; + QPixmap m_ZoomWaterfallPixmap; + QPixmap m_2DPixmap; + unsigned char m_zwf[32768*400]; + QPixmap m_ScalePixmap; + QPixmap m_ZoomScalePixmap; + QSize m_Size; + QString m_Str; + QString m_HDivText[483]; + bool m_Running; + bool m_paintEventBusy; + bool m_2Dspec; + bool m_paintAllZoom; + bool m_bLockTxRx; + double m_CenterFreq; + double m_fGreen; + double m_TXfreq; + qint64 m_StartFreq; + qint64 m_ZoomStartFreq; + qint64 m_FreqOffset; + qint32 m_dBStepSize; + qint32 m_FreqUnits; + qint32 m_hdivs; + bool m_dataFromDisk; + QString m_sutc; + qint32 m_line; + qint32 m_hist1[256]; + qint32 m_hist2[256]; + qint32 m_z1; + qint32 m_z2; + qint32 m_nkhz; + qint32 m_fSample; + qint32 m_mode65; + qint32 m_i0; + qint32 m_xClick; + qint32 m_TXkHz; + qint32 m_TxDF; + +private slots: + void mousePressEvent(QMouseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; +}; + +#endif // PLOTTER_H diff --git a/q65w/q65w.rc b/q65w/q65w.rc new file mode 100644 index 000000000..96895aada --- /dev/null +++ b/q65w/q65w.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "wsjt.ico" diff --git a/q65w/resources/CALL3.TXT b/q65w/resources/CALL3.TXT new file mode 100644 index 000000000..d4c2e3532 --- /dev/null +++ b/q65w/resources/CALL3.TXT @@ -0,0 +1,5708 @@ +//ms 3.0 2009-07-01 01:15:53 UTC _WSJT_CALL3 > CALL3.txt format for WSJT-PROGRAM by K1JT +//MS-EME-WSJT-Version 2009-07-01 01:15:53 UTC an exerp of VHF-DATABASE on MMMonVHF +//UPDATES welcome: http://www.mmmonvhf.de/dbase.php - 73 the Team of MMMonVHF +2E0ZWW,JO01ED,,,M3ZWW,,ICOM IC-820H FT897D,04/09 +2I0BIW,IO64PF,,,MI3IYA,,Yaesu ft-847,06/07 +2M0EXD,IO88FO,,,,,,04/04 +3B9C,MH10QG,EME,,,,,01/03 +3D2LR,RH92,EME,, +3DA0HL,KG53MS,EME,,EXPEDITION,,,03/07 +3V8BB,JM56ER,EME,,,,,06/02 +3V8SS,JM55GX,EME,,Expedition,,144: 16JXX and 1kw,12/05 +3X5A,IJ39JJ,EME,,EXPEDITION,,144: 2M28XPOLs and a KW,11/07 +3Y0X,EC41RE,EME,,Expedition,,144: 4x 9el 350W,02/06 +4F2KWT,PK06CI,EME,,,,50: 7el 650W,07-06 +4J1FS,KP40,,,Expedition,,,01/90 +4K6D,LN40VK,EME,,,,,01/94 +4N7AX,KN05PC,,,,,144: 200 W 2x10el 9BV,08/00 +4O3T,JN92HJ,EME,,,,144: IC706 Skysar 1kW FM-PA 3x 10 el at 10m abt 700m asl,08/06 +4O4AR,JN94AS,,,= YU4AR,,144: TR9130 250W 10el PA0MS-ant Preamp,11/02 +4O4D,JN94BR,,,,,144: 300W 11el,05/97 +4O9T,JN94XC,,,YU7AAA YT7C,,,11/08 +4S7CCG,MJ96WV,EME,,,,144: 4 x 8el and 300W,07/06 +4U1ITU,JN36BF,EME,,div. Activities,,144: 8el 600W,11/00 +4X1IF,KM72KA,EME,,,,,07/05 +4X4IF,KM72KD,EME,,,,,05/00 +4X6UJ,KM72,EME,,,,,01/00 +4Z5AO,KM72MW,,,ex UA1AKZ,,ft-857 ic-746,07/05 +4Z5BS,KM71JW,,,,,,07/95 +5A7A,JM62MU,EME,,Expedition,,144: 2x 10el 7ZB 1KW - 432: 9wl ant 200W,03/07 +5B4AGY,KM64EV,,,ex G3RSI 5A3CAD VO2AN,,FT-726R plus 1kW Linears and head amplifiers for 6M and 2M and 100w for 70cms,01/05 +5B4AIA,KM65GD,EME,,EXPEDITION,,144: 2MXP32 6WL 500W,09/07 +5B8AD,KM64TV,EME,,,,144: 2x16 el 14.3dB 230w,03/05 +5B8AV,KM64FT,,,ex 5B/G1JJE,,,05/04 +5C8M,IM64PD,EME,,Expedition,,144: IC706 MKIIG PA 1KW preamp. 2x 3WL yagis,10/00 +5F3COM,IM52JJ,EME,,= SV8CS,,,09/06 +5H1HP,KI93RV,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1HP/KI94,KI94,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1MS,KI93RV,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5H1MS/KI94,KI94,EME,,EXPEDITION,,144: 14el XP 1.2KW,05/09 +5P8Z,JO55RT,EME,,,,144: IC706 GS31b 1KW 4x8el,04/07 +5P9S,JO54TU,EME,,= OU9S OV9S 5Q9S OZ9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +5Q2M,JO65AN,EME,,= OZ1PIF,,FT847 50: 100W 4el - 144: 350W 2x 13el Preamp,04/07 +5Q9S,JO54TU,EME,,= 5P9S OU9S OV9S OZ9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +5R8EM,LH42WX,EME,,EXPEDITION,,,09/08 +5T5JC,IL30AM,EME,,,,,01/94 +5T5SN,IK28AC,EME,,QRT,,,09/05 +5X1D,KJ60EM,EME,,,,300W- 17el,03/97 +5X1EME,KJ60gh,EME,, +5Z4NU,KI88IP,,,,,144: 25W 9el,09/05 +6F75A,DL81UU,EME,,= XE2AT,,144: IC820 400W 4x 9el,01/07 +6I2AT,DL81UU,EME,,= XE2AT,,144: IC820 400W 4x 9el,01/07 +6V7A,IK14LK,EME,,Expedition,,144: 2 times BQH8B cross yagis 14.5 dBd and 500w SSPA,05/06 +6Y4A,FK18AA,EME,,Expedition,,144: 2x 2MXP28 cross pol ant. 1KW,10/00 +7J0AAD,PM97OS,EME,,,,144: 1KW 4x19el 2x18el MGF1801,01/00 +7J6CCU,PL36VI,EME,,,,50: TS570 or IC821,04/02 +7K1MFR,PM95SP,,,,,,01/03 +7K3LGC,PM95RI,EME,,,,,09/06 +7L1RLL,PM95SO,,,,,,01/03 +7M1QMY,PM95VQ,,,,,,02/09 +7M2PDT,QM05EK,EME,,,,432: 16x14el 1-5KW,11/06 +7Q7JE,KH76DW,EME,,= ZS6JDE,,144: 2x 9el 350W,07/06 +7S2AT,KP03DU,,,= SK2AT,,,03/06 +7W0AD,JM16JR,,,,,,11/04 +7X0AD,JM16JR,,,,,144: 9el 200W,11/04 +7X2VV,JM16WJ,,,,,,07/02 +7Z1SJ,LL25WG,EME,,,,144: 2x 13el,02/07 +8J1AXA,QM05DF,EME,,SPECIALCALL,,,05/08 +8N1EME,QM06IQ,EME,,Expedition,,,03/07 +8S4BX,JO79SD,EME,,,,,10/99 +8S6T,JO68SE,,,ALSO SM6WET & SG6T,,FT650 847 920,11/08 +9A1AAX,JN65TF,,,,,144: 16el 500W,04/01 +9A1CAL,JN86EL,,,,,144: IC271 FT736 FT225RD 4CX1500A 2x17el BF981,11/04 +9A1CBE,JN86BE,,,,,,01/96 +9A1CCB,JN85LN,,,ex YU2CCB- YT2C,,,03/01 +9A1CCY,JN85OO,EME,,ex YU2CCY,,,08/01 +9A1CDD,JN85LW,,,,,,01/91 +9A1CEU,JN75RO,EME,,,,144: 80W 2x18el 5.5wl 4x11el - 432: 10W 38el,01/99 +9A1CHI,JN95JG,,,ex YU2CHI,,,01/94 +9A1CHL,JN83,,,,,,03/98 +9A1CMS,JN86DM,,,,,,05/07 +9A1DFG,JN85EL,,,,,,07/96 +9A1EZA,JN86HG,EME,,ex YU2EZA,,IC271E 144: 2x4CX250b MGF1302 10mM2,11/01 +9A1KDE,JN95FQ,,,,,,01/94 +9A1RGC,JN75XT,,,,,,01/03 +9A1Z,JN86FJ,,,ex YU2SOM YT2SOM 9A3HZ,,IC706 DB6NT 1W ON 3CM,01/05 +9A2AE,JN86HF,,,,,144: 8x24el 1KW,12/08 +9A2AT,JN86LL,,,,,,01/03 +9A2DI,JN95,,,,,,06/95 +9A2EU,JN85JO,,,,,,07/96 +9A2GH,JN75IE,,,,,,01/03 +9A2KK,JN85KV,,,,,,11/01 +9A2KL,JN74OC,,,,,,08/07 +9A2MF,JN65SL,,,YU2SBF YU2MF,,YAESU FT-480 r,05/07 +9A2MK,JN75XU,EME,,,,,01/94 +9A2PT,JN86,EME,,,,,11/01 +9A2RD,JN65TF,,,,,144: 2x16el 1KW,05/04 +9A2SB,JN95GM,,,ex YU2SB,,,06/99 +9A2TE,JN85KK,,,,,144: ft225rd ts690s 100w,03/06 +9A2TK,JN76WA,EME,,YU2SSU YU2TK,,TS2000X FT290RII FT7,07/07 +9A2U,JN75RO,EME,,,,144: 80W 2x18el 5.5wl 4x11el,01/99 +9A2VR,JN95FQ,,,,,,06/07 +9A3DF,JN86HG,,,,,,04/03 +9A3GE,JN75EI,EME,,YU2RNF,,TR7 FT817 FT857 IC703 HOME MADE TRANSV. PA 4CX250B 4x 8el,08/07 +9A3JH,JN75AD,EME,,,,,01/06 +9A3JI,JN86FJ,,,= 9A4K,,50: FT-101ZD+FTV650- IC706mk2g 7ele M2,05/02 +9A3LN,JN95IN,,,,,,06/08 +9A3MR,JN83FM,,,,,,08/00 +9A3PA,JN85EG,EME,,,,FT736r - 50: 10W 5el - 144: 8x13el 800W MGF1302 - 4320: 300W 4x19el MGF1302,08/04 +9A3TF,JN85,,,,,,08/96 +9A3TU,JN95EH,,,YT2TU,,TS 830s + transverter home made 6m/2m 10W,06/08 +9A3W,JN74OC,,,ex 9A1RKV,,IC706,09/02 +9A3ZA,JN75RO,,,,,144: 100W 12el,08/00 +9A4C,JN85LN,,,,,,03/01 +9A4CK,JN86,,,,,,08/96 +9A4EW,JN95KG,EME,,,,144: 200W 10 el. BVOpt,06/08 +9A4FW,JN95JG,EME,,,,144: 600W 4x17el F9FT MGF1302,08/00 +9A4K,JN86FJ,,,= 9A3JI,,50: FT-101ZD+FTV650- IC706mk2g 7ele M2,05/02 +9A4NF,JN73VS,,,,,50: 50W 6el 144: 400W MGF1302 4.5wl,06/08 +9A4VM,JN85FS,,,,,,05/07 +9A4WY,JN74,,,,,144: 50W,08/98 +9A5CW,JN65UF,,,EX 9A5AEI,,,09/07 +9A5D,JN92BP,,,Expedition,,,08/99 +9A5WA,JN85LN,,,,,,06/96 +9A5Y,JN85OO,,,SpecialCall,,144: 800W 16x5el,10/99 +9A6PSM,JN75EJ,,,,,FT817 FT225 IC-7000 IC-202,10/07 +9A6WW,JN86EL,,,,,144: IC271 FT736 FT225RD 4CX1500A 2x17el BF981,09/06 +9A7W,JN85PO,,,ex YU2QS,,,06/06 +9A90CBD,JN85OO,EME,,SpecialCall,,,07/97 +9A9B,JN75XU,EME,,,,144: 4x 16el 1KW,09/06 +9A9PP,JN85IW,,,9A7PSN,,Yaesu FT-857D,05/09 +9H1BN,JM75GU,EME,,,,,09/99 +9H1BT,JM75EU,EME,,,,,01/94 +9H1CD,JM75FV,EME,,NOT qrv MS nw (01/01),,144: TS850 LT2S 1KW 2x4.4lb DJ9BV MGF1302,01/01 +9H1CG,JM75,,,,,144: FT902DM FTV250 100W 17el,11/01 +9H1ES,JM75FV,EME,,,,,09/99 +9H1GB,JM75FU,EME,,,,144: TS780 100W 19el,08/03 +9H1LO,JM75EW,EME,,9H5LO,,IC746 - IC706 - FT817 - TH-F7E,12/08 +9H1PA,JM75FV,EME,,9H5O,,144 Mhz: TS711 4x10el (3wl) crossed yagi GS35b - 50 Mhz - 8el yagi 2wl,09/07 +9H1PI,JM75FU,,,ex 9H5PI,,50: 100W 5el,03/03 +9H1TX,JM75FU,EME,,,,50: 8el yagi 100W - 144: IC7400 GS35 1000 W 2x 15el Xpol LNA145MKII,08/06 +9H1XT,JM75GV,,,,,,08/02 +9H3LF,JM76,,,Expedition,,,01/91 +9H3ZZ,JM76CB,EME,,Expedition,,,01/93 +9J2JD,KH46MM,EME,,Expedition,,144: 2M7 antenna,05/06 +9K2YM,LL48CJ,EME,,,,144: 2M5WL 450 W,06/07 +9K48NLD,LL48CJ,EME,,SPECIALCALL,,144: 4x 13el 300W,02/09 +9M2BV,OJ30UD,EME,,,,,01/94 +9M6YBG,OJ85BW,EME,,,,2x 10el 50w,10/08 +9N7JO,NL27QR,EME,,YU7EF,,,04/07 +9W2QC,OJ03TB,EME,,,,144: 2x 10el Vert 70 W,10/08 +9X4V,PM95RI,EME,,SpecialCall,,,09/06 +A22BW,KG38SU,EME,,,,,01/94 +A35RS,AG28HV,EME,,= ZL1RS,,,12/08 +A43DLH,LL93,EME,,EXPEDITION,,,09/08 +A43EME,LL93,EME,,EXPEDITION,,,11/08 +A61Q,LL75SJ,EME,,,,144: 4x 13el 700W,10/06 +A71AW,LL55RH,EME,,,,144: 2XP20 1KW,07/06 +AA0BR,DN70KN,,,,,,01/03 +AA0BW,EM29PS,,,,,,04/03 +AA0DQ,EN12,,,,,,01/03 +AA0EN,EM29,,,,,,01/03 +AA0P,DM79,,,,,,01/03 +AA1OV,FN43GE,,,,,,04/03 +AA1VL,FN42HN,,,,,,04/03 +AA1YN,FN43GC,EME,,,,144: 4x 16el 100W,10/06 +AA2GF,FN02,,,,,,01/03 +AA2WV,FN12BV,EME,,,,144: 4x 17el 400W,10/06 +AA3NM,FM19JE,,,,,,01/03 +AA4FQ,EM67LQ,EME,,,,1500W,01/05 +AA4SC,EM94MX,EME,,,,,05/08 +AA5C,EM13SE,,,,,FT-990 FT-736R Homebrew Microwave Gear,10/07 +AA5CH,EM35GK,,,,,,01/03 +AA5IB,EM12,,,,,,01/03 +AA5WL,EM32,,,,,,01/03 +AA5WQ,EM26BC,,,,,,01/03 +AA6GS,DM12,,,,,,01/03 +AA6HA,DM43CN,,,,,144: 500W 9el M2,01/01 +AA6IW,CM97VI,,,,,,01/03 +AA6WI,CM97,,,,,,01/03 +AA7A,DM43AO,EME,,,,144: 8877 1.5KW 6x13el (DJ9BV),09/06 +AA8BC,EN90FE,,,,,,01/03 +AA8HS,EN81,,,,,,01/03 +AA9D,EN52,,,,,,01/01 +AA9IL,EN62AI,,,,,,01/03 +AA9MY,EN50FM,EME,,,,144: Yaesu 847 IC910H IC706MKIIG 2x 18XXX M2,11/05 +AB0SD,EN30LL,,,,,,01/03 +AB0TJ,DN60FN,,,,,,01/03 +AB3BK,FN10PD,EME,,,,144: 17el 400W,09/06 +AB4CR,EM77,,,,,,01/03 +AB4OO,EM81,,,,,,01/98 +AB5F,EM46FG,,,KG7CV,,KENWOOD TS-2000--VIKING VALIANT--HQ-170,05/07 +AB5IG,EM12,,,,,,01/03 +AB9FN,EN53,,,,,,01/03 +AC1H,FN33XJ,,,,,144: 300W 13dbD yagi,01/01 +AC1T,FN32,,,,,,01/03 +AC3A,EM28QV,EME,,,,FT847 144: 4x 9el M2 8877 1-5KW,08/05 +AC4TO,EM70,,,,,,02/05 +AC5OG,EM10,EME,,,,,03/05 +AC5TM,EM40LL,EME,,,,144: 2M5 400W,03/05 +AD4EB,EM65NS,,,,,,01/03 +AD4TJ,FM08LE,EME,,,,IC706MKIIG 144: 4x 15el K1FO 700w JT--KW+ CW,10/08 +AD6A,CM97AG,,,,,,01/03 +AD6FP,CM87WI,EME,,,,,01/04 +AD6P,EM18,,,,,,01/03 +AE0G,EN10PS,,,,,,01/03 +AE0W,DM78,,,,,,01/03 +AE4RO,EL97TG,,,,,,09/01 +AE5K,EM36PC,,,,,,01/03 +AE6EQ,CM95OH,EME,,,,432: 16x 14el 700W,09/05 +AF1T,FN43ED,EME,,,,,01705 +AF4IF,EL95US,,,KD4GKO,,Yaesu,08/07 +AF4O,EM55LK,,,,,,01/03 +AF6O,DM14EJ,EME,,ex G3PRM,,144: 4x 2M12 800W - 432: 4x 9wl 1500W,01/06 +AF9R,EN52XB,,,,,,01/03 +AG2A,FN30FR,,,,,,01/03 +AG4QE,FM04KX,,,,,,01/03 +AG4ZE,EM83WM,EME,,,,,07/06 +AG9Y,EN40,,,,,144: 160W 13el,01/01 +AH6EZ,EN51SW,,,,,,12/01 +AH6LE,CN85NK,,,,,,01/03 +AH8A,AH45OP,,,,,,01/03 +AI1K,FN41IL,,,,,,01/03 +AI3W,FM19PW,,,,,,01/04 +AI8Z,DM79,,,,,,01/03 +AJ0E,EM29RD,,,,,,01/03 +AJ6T,CM87XK,,,,,144: 200w 10el 50:100w 6el,05/07 +AM25DXU,JN11CM,EME,,SpecialCall,,,01/92 +AN3JT,JN01UI,EME,,SPECIALCALL,,IC910 + SP2 + 4x13B2 + GS35B,08/07 +AN6SA,JM19IR,EME,,SpecialCall,,144: FT847 2x4CX250 2x17el - 432: 4x33el,01/01 +AO4WT,IN80KN,,,,,,08/08 +AO5TT,IM99SL,,,= EA5TT,,,08/08 +AO6SA,JM19IR,EME,,SPECIALCALL,,,09/07 +AO6VQ,JM19HN,EME,,SPECIALCALL,,144: 2KW MGF1302 8x17el M2 432: 21el 115w 1296: 55el 10w,12/07 +BA4TB,PM01EO,EME,,EXPEDITION,,IC746 + HL250PA (running 250W) 2x 10ele Yagi,03/08 +BD1AX,PL04VQ,EME,,,,144: 2wl Yagi 350W,04/08 +BV6GU,PL03CD,EME,,,,144: 250W 20ele cross yagi,05/06 +BX1AD,PL04VQ,EME,,,,144: 11 Xpol 100W,03/08 +BY1QH,ON80DA,,,,,,01/03 +BY4RRR,OM92JA,EME,,,,144: 2x13 ele 100W 432: 2x 17 ele 70W,02/08 +BY4RSA,OM91,EME,,= DL3OCH,,,05/07 +BY7PP,OL63NA,EME,,EXPEDITION,,50: 2x 6el 100W 144: 2x9el 300W Preamp SP-2000 432: 2x20el 70W,02/08 +BY9AA,OM44LL,EME,,,,144: IC920 2 x 15 XP 350W,03/08 +C31MS,JN02UN,,,Expedition,,144: 2Stn a� 800W 2x17el or 11el,05/97 +C31RC,JN02SK,EME,,Expedition,,,01/89 +C31TLT,JN02TL,EME,,Expedition,,144: 4x24el 2x4CX250 900W,08/01 +C56EME,IK13ql,EME,, +C6AIE,FL16IQ,EME,,= WZ8D,,144: TS2000 250W 13el,03/06 +C91CF,KG64HB,EME,,EXPEDITION,,,04/08 +CN8KD,IM63KX,,,,,144: 10W 11el,06/03 +CN8LI,IM63NX,EME,,,,50: IC746 250W 6el - 144: 2x17elts- 250w- lna- 1/2' lowloss cable- Az+Elevat,10/07 +CN8ST,IM64NA,EME,,QRT (is nw PA....),,,06/98 +CN8TW,IM63EN,EME,,,,144: 4x 13el,01/06 +CO2OJ,EL83TD,,,,,50: 100W 4el - 144: 110W 9el,06/06 +CQ14HZE,IM57NH,,,SpecialCall,,,02/04 +CS0DIZ,IM69,,,SpecialCall,,,01/89 +CS1GDX,IM59IB,,,SpecialCall,,144: IC706MK II G 200W 12el,11/03 +CS6ARC,IM59RX,,,SpecialCall,,,11/01 +CT1ANO,IN51RE,,,,,144: TS2000 4cx250B 1x16JXX2 SP 2000,06/09 +CT1BYM,IM58SM,EME,,,,,05/07 +CT1DHM,IN61CB,EME,,,,,04/07 +CT1DIZ,IM58KP,,,,,,06/03 +CT1DMK,IN50QP,EME,,,,144: 1-5KW 4x11el DL6WU,03/99 +CT1DNF,IN50QP,,,,,144: IC821H 200Watts 2x12ele DL6WU Preamp,12/04 +CT1EKD,IM59IB,EME,,,,144: IC706 MK II G 400W 4 x 17 el 432: 300W + 10wl Yagi,08/08 +CT1EWA,IM59NS,EME,,,,,06/09 +CT1FAK,IN50QO,EME,,,,144: FT1000D FT736R 200W 4x13el DL6WU MGF1302,05/03 +CT1FFU,IM59KJ,EME,,,,,03/05 +CT1FJC,IM57OC,,,= G4MAW,,TS-2000 5el yagi 6 metres. 4el yagi on 4metres,03/07 +CT1FOH,IN50RA,,,,,50: 6el - 144: 200W 4x 12el MGF1302,04/04 +CT1HZE,IM57NH,,,= DL8HCZ,,,12/05 +CT1WW,IN61GE,,,SilentKey,,,11/96 +CT2FEY,IN61OT,,,,,,07/07 +CT2GUR,IM59ML,EME,,,,IC-910H+ 2x17el+LNA+1KW,06/09 +CT2HSN,IN61CB,,,,,,03/07 +CT2HSO,IN61CB,,,,,,06/07 +CT2IET,IN60GD,,,,,FT100D,11/02 +CT2IWG,IN51OJ,,,,,144: IC706 100W 9el,02/05 +CT2JIB,IM58MO,EME,,,,IC-910H + IC-706MKIIG + IC-746,05/08 +CT4KQ,IN60BP,,,,,,03/98 +CU2E,HM77UD,EME,,,,144: 1KW 28 Xpol,06/07 +CU2IJ,HM77ES,,,,,,04/04 +CU3EQ,HM68KP,,,,,KENWOOD TS 2000 - TS 570,04/08 +CX5BBF,GF15WM,EME,,,,432: 3m dish with 4 dipole,08/07 +CX5CJ,GJ15,EME,,,,144: 4x 17el 1KW,02/02 +CX5IC,GF07WQ,EME,,,,,03/08 +CX5UR,GF26TS,,,CX2AAE - CX3UU - CX1JO,,KENWOOD TS430 - IC 241 - FT 2500,02/08 +CX9BT,GF15WK,,,,,,01/03 +CY9SS,FN97WE,EME,,Expedition,,144: 400W single yagi,01/05 +DA0BV,JN58VF,,,SpecialCall,,,01/94 +DA0DD,JO61,EME,,SpecialCall,,,05/06 +DA0HEL,JO34WE,,,EXPEDITION,,,08/08 +DA0NRW,JO41GV,,,SpecialCall,,144: 3CX400A7 4x14el or 17el,12/96 +DA0WAE,JO41GU,,,SpecialCall,,,12/04 +DA0Y,JN48MB,EME,,,,,04/09 +DA0YFD,JN59MO,EME,,,,,05/07 +DA4RG,JO31FG,,,= GW8VHI,,,11/95 +DB1PB,JO30UE,,,,,,12/01 +DB2WD,JN39VV,EME,,,,,04/96 +DB3BW,JO42AC,EME,,,,HF: TS520 - 144/432: FT726r Tube PA 2m 350W 70cm 150W 6m trv8W,06/09 +DB3LA,JO31JK,,,,,,07/02 +DB4ET,JO31,,,,,,11/02 +DB4LL,JO54SM,,,,,144: FT221 20W 4el,08/01 +DB4VQ,JN39MF,,,,,,01/94 +DB5ML,JN58OI,,,,,,09/03 +DB5WC,JN49EJ,,,,,60W 11el Preamp,12/03 +DB6BX,JO32OK,,,SilentKey,,,11/96 +DB6NT,JO50UI,,,,,,01/03 +DB6RO,JN58QB,,,,,,12/03 +DB7OB,JO52IJ,,,,,144: FT221 100W 11el,08/00 +DB8AT,JO51CP,,,,,,05/04 +DB8WK,JO33XN,,,,,144: 200W 2x11El. - 432: 300W 2x23El.,03/06 +DB8YL,JO41EV,,,,,,12/99 +DC0KK,JO41KQ,,,,,,03/08 +DC1ECD,JO31MH,,,,,,10/04 +DC1MUS,JN69EP,,,,,,11/02 +DC1MWB,JN58,,,,,,04/05 +DC2IP,JN49FD,,,,,144: IC706 max. 50W 6el,08/08 +DC2JR,JO64CA,,,,,,11/01 +DC2MW,JN58IV,EME,,,,144: 4x 9el 300W,09/07 +DC3VM,JN39KK,,,,,,12/99 +DC3VW,JN39KJ,,,,,,10/04 +DC3ZR,JN68CV,,,,,,01/03 +DC5JQ,JO31BC,,,,,,10/07 +DC6DY,JO53GO,,,,,,06/09 +DC6GF,JN48OC,,,,,IC 706 MKIIG PreAmp,01/05 +DC6KI,JO30IL,,,NOT qrv MS nw (01/01),,,04/05 +DC6RN,JN59WK,,,,,144: 12el PA GS35,04/09 +DC7OH,JO62OK,,,,,,01/01 +DC7UT,JO31NJ,EME,,,,144: 4x17el 500W,03/01 +DC9UP,JN39QN,EME,,F5VKQ,,,01/09 +DC9YC,JO31QK,,,,,,10/07 +DD0NM,JN59NI,,,,,144: IC 910 100W 2x11 el Yagi,08/07 +DD0VF,JO60UX,EME,,,,144: 550W-CW 250W-digi 4x8el MGF1303 (JO61WA: 100W 5el BF998),06/09 +DD1JN,JO50DJ,,,,,144: 600W 11el Preamp - 432: 21el 200W VV - 1296: 55el 10W VV - 2320: 80el 1W,04/02 +DD1WKS,JN39KK,,,,,,01/01 +DD2KR,JO30FQ,EME,,,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DD2UJ,JO61WD,,,,,,10/04 +DD3DX,JO31TN,,,,,,07/01 +DD3SP,JO72EN,,,,,50: 5el - 144: FT847 4CX250 17el F9FT MGF1302 - 432: 21el,02/04 +DD5DX,JO61CA,,,,,144: 180Watt 2x17el Preamp,07/04 +DD6UBS,JO41AH,,,,,144: TM255 MGF1302 180W 11El F9FT - 432: TM455 MGF1302 40W,10/04 +DD7PC,JN49AX,EME,,,,,05/07 +DD9SQ,JN59BH,,,,,,07/98 +DF0AK,JN49EA,,,,,,07/97 +DF0AW,JO31MG,EME,,,,FT736 144: 800W 2x 11el 432: 200W 4x 23el 1296: 23el 10W,09/07 +DF0BV,JN68AH,EME,,,,144: 2x17el 750W,04/05 +DF0CI,JO51CH,,,,,,11/03 +DF0CK,JO50AN,EME,,= DK0R,,144: 500Watt 2x11el,09/05 +DF0EME,JO40,,,,,,01/03 +DF0LBO,JO53CT,,,,,,05/02 +DF0MMO,JN49JX,,,,,144: 200W 11el,11/00 +DF0MTL,JO61JF,,,,,,07/05 +DF0SAX,JO61VC,,,,,144: 20W 13el,12/98 +DF0SL,JN59OI,,,,,,08/08 +DF0WD,JO42FD,,,,,144: 8874 250W 2x9el - 432: 3CX800 4x18el,02/08 +DF0WF,JO62VT,,,,,,01/05 +DF1AN,JO63SX,,,ex DL1KUS,,,01/00 +DF1BN,JO31GD,,,,,144: IC821 HLV-300 300Watts MGF 1302 2x17ele F9FT,07/01 +DF1CF,JN57FP,EME,,,,144: CF300 3CX800 4x13el (3lb),12/04 +DF1GL,JN47CO,,,,,144: IC 746 300W 8el,04/07 +DF1HF,JO43WJ,EME,,,,144: 6el 432: 19el 1296: 44el,09/07 +DF1IAZ,JN49LD,,,,,50: 3 el - 144: 150W 2x10el MGF1302,07/01 +DF1OC,JO52,,,,,,01/93 +DF1SO,JN48PO,,,,,144: homemade 200W,08/98 +DF1VB,JO31SK,EME,,,,,03/07 +DF1ZE,JN49,EME,,,,,01/94 +DF2CQ,JN58SE,,,,,,10/04 +DF2NU,JN58XA,,,DL0UMK,,TS-790S + PA + Preamp + 11 ele yagi,10/07 +DF2OOO,JO41RF,,,SpecialCall,,IC820H 144: 250W 2x11el- 432: 130W 2x23el Preamp,09/99 +DF2UJ,JO61QH,,,,,,02/02 +DF2ZC,JO30RN,EME,,,,144: TS2000 LT2S 2xGU74b 750W MGF1302 4x2M18XXX (21 dbd),04/07 +DF3FJ,JO40CC,,,,,,01/93 +DF3RU,JN59UL,EME,,,,,03/05 +DF4IP,JN49HE,,,,,,08/08 +DF4MAA,JN58WH,EME,,,,,05/97 +DF4UE,JN48RR,,,,,432: 4x27el 600W,09/03 +DF4WC,JN49KV,,,DB4PN,,TR9000-IC490,09/08 +DF5BN,JN49GU,,,,,,08/99 +DF5DE,JO40CX,,,,,,12/06 +DF5HC,JN49HT,EME,,,,50: 4 Ele - 144: 4x8Ele 500W - 432: 4x17Ele 500W,05/09 +DF5JJ,JO43XO,,,ex EA6/DF5JJ + ex EA6ADW,,432: 700W 19el - 1296: 500W 26el - 10368: 20W dish,03/04 +DF5KB,JO72CM,,,ex DD6BKR,,FT847 - 144Mhz 750 wtts 14 el Longyagi - 50Mhz 7el by DK7ZB,08/06 +DF5NK,JN59PM,,,DB6NJ,,144: 11el 600W alt. 15el 750W(JN59OP) 432: 19el 500W,06/09 +DF5NK/P,JN59OP,,,DB6NJ,,144: 11el 600W alt. 15el 750W(JN59OP) 432: 19el 500W,06/09 +DF6HT,JO64FG,,,,,,12/06 +DF6LO,JO52CE,,,,,,01/93 +DF6MU,JN58WF,,,DL1ABD,,Elecraft k2 + XV144 + THP PA 160W,09/07 +DF6NA,JN49XS,,,,,432: 2x3CX800 4x30el,10/01 +DF6OB,JO42,,,NOT qrv MS nw (01/01),,,07/97 +DF6VW,JO42KH,,,,,,07/97 +DF6YL,JO31WS,EME,,,,,02/08 +DF7AP,JO51FI,,,,,,04/09 +DF7DJ,JO31UO,,,,,,06/97 +DF7IF,JN48DN,,,,,,01/03 +DF7IT,JN49IN,,,,,,10/04 +DF7KF,JO30GU,EME,,,,144: 16x18el EME Pwr,12/04 +DF7OG,JO52BN,,,,,144: TS770E 4x150 16el,04/04 +DF7RG,JN68HG,EME,,,,,01/05 +DF8AA,JO60XX,,,ex DL2VAA,,144: 100W 17el,12/99 +DF8AE,JO41GX,,,,,,10/04 +DF8IK,JO30JT,,,,,144: 300W 11el 432: 400W 27el,01/05 +DF8LC,JO53GX,EME,,,,,08/99 +DF8PC,JO43RS,EME,,,,144: 100W 16el M2,03/06 +DF9CY,JO54AL,EME,,,,IC820H + 400w + 1x9ele 2.5wl full elevation + MGF1302,10/08 +DF9IJ,JN48CX,,,,,,01/03 +DF9KT,JO30GU,,,,,,11/95 +DF9KX,JO30FQ,EME,,,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DF9QT,JO30OR,,,,,144: 700W 11Ele,07/08 +DF9QX,JO42HD,EME,,,,,01/94 +DF9RJ,JN68GS,EME,,,,144Mhz: 1.8KW 4x17Ele. - 432Mhz: 1KW 4x21Ele. - 10Ghz: 5W 60cm Spiegel,03/06 +DF9YF,JO42GE,,,,,,12/03 +DG0CAL,JO31,,,,,,06/00 +DG0FE,JO62UN,EME,,,,FT736r 50: 25 watt 1x4el - 144: 500W 4x17el - 432: 25 watt 2x21el - 1296: 10 watt 2x35el,04/08 +DG0KU,JO64AC,,,,,,01/03 +DG0KW,JO64MH,EME,,,,144: 2x 13el,01/05 +DG0OPK,JO50GQ,EME,,,,50MHZ Dipol - 144: 400W 17dBd MGF1302,12/08 +DG0TU,JO61TU,,,,,,08/97 +DG0WJ,JO60CV,,,,,,11/02 +DG1BA,JO43LB,,,,,,01/00 +DG1BHA,JO73DB,,,,,,09/07 +DG1CMZ,JO60DS,,,,,,08/01 +DG1IU,JN49FA,,,,,,08/96 +DG1LY,JO44RK,,,,,,03/04 +DG1TA,JN69GH,,,,,,02/01 +DG1VL,JO61WE,EME,,Y91VL,,144: 150W 9el MGF1302,05/09 +DG1YBO,JO32RG,,,,,144: FT225RD 80W 9el,09/04 +DG2BCP,JO43DC,EME,,,,144: 4x 3.6l DJ9BV+GS35 Pa 432: 4x 11l DJ9BV,03/06 +DG2DAA,JO62GU,,,,,,06/02 +DG2GEP,JN48DL,,,,,144: 200W 9ele Yagi,04/03 +DG2KBC,JN58MI,EME,,,,2x7ele FT847 GS35b LNA,06/09 +DG2NBN,JN59NR,,,,,FT847 144: 200W 2x3wl 9BV MGF1302 - 432: 300W 22el MGF1302,08/01 +DG2NZM,JN59IV,,,,,,06/03 +DG2SRL,JO61HN,EME,,,,144: Transv. LT2S 18el M2 500W,04/06 +DG2TOM,JO62BM,,,,,IC706 50: 4el Yagi - 144: 15el M2 100W,08/05 +DG2VC,JO61VC,,,,,,01/04 +DG3FK,JO41PG,,,,,TS850+TV TS790 144: 17el 150W - 432: 4x17el 200W - 1296: 55el 100W,09/03 +DG3JO,JO31JK,,,,,TR-2000- TM-D700- DSPCOM,04/03 +DG3MDE,JN58EI,,,,,ICOM IC-7400 Inv.V 2x13 5m,09/07 +DG3XA,JO43WJ,,,,,144: 1500 Watt 7 ele M2,02/09 +DG4BH,JO30RX,,,,,,01/03 +DG4EK,JO31NI,,,,,,01/03 +DG4EKE,JO31NI,,,,,144: IC820h- SP2000- 17/11el- QQE06-40,01/97 +DG4NBI,JN59IF,EME,,,,,10/07 +DG5AAG,JO51,,,,,,07/01 +DG5CST,JO60DS,EME,,,,144: FT847 4x12el I0JXX GU74,08/07 +DG5HV,JO43XQ,,,,,,01/99 +DG5NEX,JN49WS,,,,,,01/93 +DG5OAF,JO51EP,,,,,144: FT736 400W 2x17el B2 MGF1302,11/99 +DG5SMY,JN49QA,EME,,,,144: 4x 17ele 432: 4x 23ele,08/04 +DG6JF,JO31,,,,,,10/01 +DG6LS,JO54AK,,,,,144:TS790 8877 4x17el - 432: 8x33el DJ9BV 3CX800A7,12/96 +DG6MBS,JO41AH,,,,,144: TM255 MGF1302 180W 11El-F9FT - 432: TM-455 MGF1302 40W,08/02 +DG6MGP,JN58WH,,,,,,01/95 +DG6SYL,JO53QP,,,,,144: 150W 11el 6WU Preamp - 432: 150W 23el Preamp - 1296: 10W 48el Preamp,03/02 +DG7MHR,JN57DR,,,,,,03/03 +DG7NT,JN47QQ,,,,,144: 2x10 el,02/08 +DG7OV,JO42VX,,,,,,10/04 +DG7RBV,JN59UM,,,,,,01/90 +DG7SF,JN48RR,,,,,144: FT736 300W 2x7el,06/01 +DG7SFL,JN49XF,,,,,144: 300 W + 10El. - 432: 150W + 2*21El.,01/04 +DG7TG,JO43SV,,,,,,06/05 +DG8DP,JN68BI,,,,,Yaesu FT-950 - Elecraft XV144 - VHF PA 4CX250B - 9 Ele. M2,04/09 +DG8NCO,JO50VH,EME,,,,144: 4 x 9 El + BEKO HLV-1500 ICOM IC7400 / 8 x 10 El + BEKO HLV 3000,05/09 +DG8NCY,JO50HA,,,,,,07/02 +DG8UAW,JN48BR,,,,,FT-847: 144MHz: 50W 7el Preamp - 432MHz: 300W 16el Preamp,09/01 +DG8WH,JO43GH,,,DO6BH,,IC271E + FT897D,07/08 +DG8YFM,JO32MF,,,,,,03/06 +DG8YHH,JO32QI,EME,,,,,10/06 +DG9BEM,JO43CD,,,,,144: 350W 17el VV - 432: 300W 4x20el VV - 1296: 150W 1.2m dish VV,01/03 +DG9DAZ,JO31XB,,,,,144: TM255,11/01 +DG9GLA,JO40,,,,,,12/01 +DG9MAQ,JN58LJ,EME,,,,144: HA8UG-PA Gi46b 9 El. Tonna SP-2000,12/07 +DG9NCX,JN59BT,,,,,,11/99 +DG9NFM,JO50QG,,,,,,01/94 +DG9YIH,JO32QI,,,,,144: 500W 17el,12/04 +DH0AAI,JO51AR,,,,,144: FT225rd PA 200W SP2000 4xDL7KM,08/02 +DH0GHU,JN38VN,,,ex DG2GHU,,144: TS850 LT2S HLV300 300W 11el,09/01 +DH0LS,JO61II,,,,,144: 4CX350 500W 2x17el Preamp - 432: 150W 21el - 10W Dish,12/03 +DH0MBH,JN58JD,,,,,,01/02 +DH0OAH,JO42OB,,,,,,01/03 +DH0X,JN49DE,EME,,,,,08/05 +DH0YAZ,JO41GG,,,,,,01/03 +DH1FM,JO61UD,,,,,144: 90W 10el - 1296: 1W 30el,08/02 +DH1HC,JO53FF,,,,,144: 13el 500W,10/05 +DH1KBB,JO20XX,,,,,,01/93 +DH1NAD,JN49,,,,,,01/93 +DH1NSP,JN59JX,,,,,,01/01 +DH1TW,JN48QM,EME,,,,144: 600W 10el,04/01 +DH2FAF,JO40,,,,,,01/93 +DH2OAA,JO42TU,,,,,144: IC275E 4x11el 6WU 500W,03/04 +DH2RS,JN47TT,,,ex DG3GSR,,144: 75W 11el MGF1302,01/98 +DH2UAK,JO71FU,EME,,DG6IBO,,IC910+Preamp - 144: 4x 14el 500W - 432: 2x 29el 50W- 1296: 67el 10Ghz: 1.25m/10W,05/09 +DH3DP,JO31,,,,,,07/96 +DH3NAN,JO50NC,EME,,,,,12/97 +DH3YAK,JO31RS,EME,,DD4QI,,144: 4x 12el M2 750W,02/09 +DH4FAJ,JN49EX,EME,,,,IC910 IC7400 144: 4x 9el 1KW - 432: 4X15 50 watt,12/08 +DH5BS,JO63PX,EME,,EX DB3VE DH3VE,,FT857d IC970h Pa's Yagi's 50-432mc,07/07 +DH5FS,JO61UA,,,,,144: 9el 120W - 432: 4x21el,11/00 +DH5HS,JO31FF,,,,,FT847,11/02 +DH5HV,JO31AS,,,EX DB5VH,,144: IC746 Pro (100W only) with 2M12 Msquare @ 14m,07/08 +DH5LAN,JO44TN,,,,,,05/97 +DH5MK,JO41IV,,,DC3QB,,144: 100W 5ele. DK7ZB MGF1302,05/09 +DH6ICE,JO61XU,,,,,,07/04 +DH6JL,JO31NI,,,EX DG1JL,,50: IC-746 6M5X wid 360 view till Horizont,10/07 +DH7FB,JO62SM,,,ex DD6UFR,,144: FT847 GS35b 2x9el DK7ZB,08/05 +DH8BQA,JO73CE,EME,,,,,05/07 +DH8GV,JO33RL,,,EX DD0BI,,FT-100 300W,02/08 +DH8IAB,JO30NO,EME,,DC5IV,,144: 17el 750W,09/07 +DH8IAT,JN49GC,,,,,,12/07 +DH8WE,JO50TJ,EME,,DG0OLT,,,04/08 +DH8YHR,JO41GV,,,,,,01/03 +DH9FAG,JN49LX,,,,,,01/03 +DH9GCD,JN38VF,,,ex DG9GCD,,144: 11el 100W MGF1302,05/02 +DH9KAE,JO30BW,,,,,,01/93 +DH9NBB,JN49WS,,,ex DG9NBT,,,01/99 +DH9NFM,JO50RF,EME,,,,144: 2X17 M2 - 432: 2X38 M2 - 1296: 4x21 - 2320: 67ele - 10368: 60cm dish,06/05 +DH9OK,JO51AS,,,,,,06/04 +DH9OY,JO51AQ,,,ex DG5OAA,,,05/00 +DJ0QZ,JN49LM,EME,,,,144: IC746 8877 2x18el M2 MGF1302,11/01 +DJ0RU,JO31KM,,,,,,07/02 +DJ1JD,JO52CK,EME,,,,,08/00 +DJ1LP,JO64,,,,,,01/93 +DJ1OJ,JN58SE,,,,,144: 100W 2x11el SP2000,10/00 +DJ1SHF,JO73AM,,,,,144: TS711 120W 2x10el- Preamp,11/96 +DJ1TU,JN48TR,EME,,EX DL2SAD,,FT-897D,10/07 +DJ2GM,JN58SC,,,,,,04/06 +DJ2IA,JO71AO,,,ex DM2BHF,,144: FT736R 100Watt 9-ele-Yagi,08/02 +DJ2IE,JN48HV,,,,,,07/02 +DJ2JA,JO40IM,EME,,,,,04/04 +DJ2JS,JO31SL,,,,,,04/04 +DJ2KQ,JO30BW,,,DC8KQ DH9KAE,,FT736R 2x14elm 144Mhz - 5elm 50Mhz,12/07 +DJ2QV,JN58UA,,,= M0RUN,,,06/09 +DJ2QV/P,JN57XX,,,,,,06/09 +DJ2XS,JO53AK,,,,,,01/95 +DJ3FI,JO31DI,EME,,,,,08/00 +DJ3HW,JO42LH,,,,,144: R2CW 750W 12elM2 MGF1302 432: 750W 28el.M2 1296: 220W 48el.,09/08 +DJ3JJ,JN48JS,EME,,,,TS2000x,01/09 +DJ3LE,JO44TN,,,= OZ7LE,,50: 25WERP 5el - 144: 2x17el 600W - 432: 2x21 100W,02/04 +DJ3MY,JN58QD,EME,,,,144: 600W 4x17el,08/99 +DJ3RU,JN58,,,,,,01/95 +DJ3ST,JN48,,,,,,01/03 +DJ3TF,JN59WK,,,,,,06/00 +DJ3VI,JO43VI,EME,,,,144: FT736r 2x11el 750W,02/06 +DJ4SO,JO44WG,,,,,,11/99 +DJ4TC,JO63PN,EME,,EX Y21TC DL1NTC,,144: 380W 2x 11el - 432: 460W 2x 26el homemade,05/08 +DJ4UF,JO30BR,,,,,144: 300W 2x 8el MGF1302,09/04 +DJ5BV,JO30KI,,,,,144: 600W 11el MGF1302 - 432: 400W 20el - 1296: 500W 4x20el - 10386: 15W 1m dish,07/02 +DJ5CL,JN58WH,,,ex DG1MHY,,,08/00 +DJ5DT,JN49IV,,,,,,05/02 +DJ5HG,JO53IU,,,,,,06/04 +DJ5MN,JN58WH,EME,,,,,06/96 +DJ5MS,JN68KS,,,SilentKey,,,10/99 +DJ5NV,JN59KN,EME,,ex DL9NDD,,,12/01 +DJ5RE,JN59WK,EME,,,,144: GS35b 250W 2x12el M2,03/04 +DJ5SQ,JN37UW,,,,,144: TS870 LT2S 600W 11el,12/97 +DJ6JJ,JO31LG,,,,,,12/01 +DJ6MB,JO30,EME,,,,,01/94 +DJ6OL,JO52AP,,,,,,05/08 +DJ6SN,JO30BU,,,DC6SN DH6SN,,YAESU FT-736R -PA- 2m 2x17Ele -6m 5Ele --IC7000,07/08 +DJ6TN,JO54CF,,,,,,09/96 +DJ6WD,JO40AT,,,SilentKey,,,03/99 +DJ6XV,JO31LQ,,,,,,04/04 +DJ7AL,JO61VC,EME,,,,144: IC910 VLA 200 4el F9FT,04/06 +DJ7FJ,JN48AG,EME,,,,,01/94 +DJ7IL,JO52LD,,,,,IC7400 IC910H HLV120 homemade,04/07 +DJ7OF,JO51HQ,EME,,ex DG5OAE,,144: 6x17el CC 17B2 MGF1302 EME Pwr,04/05 +DJ7OQ,JO42WJ,,,,,144: TS 850 LT2S PA 2x 4CX250 Preamp 0.5 dB M2 5WL,06/09 +DJ7PW,JN48TR,,,,,IC7400 11ele Yagi,12/07 +DJ7RI,JO54CH,,,,,,12/03 +DJ7RST,JN59UK,EME,,,,144: 4 x 2MXP20 1k2 432: 5 x 20el 1k5,09/07 +DJ8ES,JO43SX,,,,,144: 300W 17el - 432: 300W 24el - 1296: 100W 49el - 2320: 10W 44el - 10368: 1.5W 60cm Parabol,08/03 +DJ8MS,JO63CT,EME,,EX DG5TR,,144: 750W 11el 7ZB Preamp 432: 300W 2x13el 7ZB Preamp,02/08 +DJ8OG,JO40MF,,,,,IC 275H 8el DK7ZB,04/04 +DJ8PB,JO44MC,,,SilentKey,,,01/93 +DJ9CS,JO54DG,,,,,FT-847 200W PA 50: 3 el 144: 9el,09/04 +DJ9EV,JN49SC,EME,,,,FT847/17 el yagi,02/09 +DJ9FG,JO52TD,,,ex DM2CFG Y23FG DL9ZFG,,HF: FT757GXII 10m Longwire - 50: 25W IRF610 Dipol - 144: 300W 9el- 432: 150W 12el,10/06 +DJ9JY,JO31JM,,,ex DG1JY,,,01/01 +DJ9KV,JN68OK,,,,,,06/95 +DJ9MG,JO52TC,EME,,EX DM2BQG Y22QG DL8CME,,144: 2x 17el 500W,01/08 +DJ9YE,JO43HV,,,,,144: 400Watt 17el M2 MGF1302,02/08 +DJ9YW,JO42QA,EME,,,,144: 2x10el 500W - 1296: 3.5 and 4.5m dish 360W,02/01 +DK0AK,JO30NQ,,,,,,05/04 +DK0ALK,JN38TD,,,,,,06/96 +DK0BN,JN39VX,EME,,,,144: 700W 3x 9el F9FT + 2x 11elF9FT,09/03 +DK0EP,JO31TS,,,,,,11/04 +DK0IG,JN58SE,,,,,144: 350W 2x11el,12/96 +DK0NHF,JO62JR,EME,,,,,01/94 +DK0OG,JN68GI,EME,,,,144: 700W 8x17el,12/04 +DK0R,JO50AN,EME,,= DF0CK,,144: 500Watt 2x11el,09/05 +DK0TU,JO62PM,EME,,,,144: 4x 12el QRO,05/06 +DK0TX,JO50HK,,,,,,03/02 +DK0UB,JO31PK,,,,,,08/97 +DK0VV,JO61WB,,,,,144: 550W 4x7el MGF1303,03/04 +DK1CM,JO40LG,EME,,ex DL2FDX,,144: FT990 LT2S 700W YL1050 18el MGF1302 - 432: 41el MGF1302 - 1296: 48el MGF1302,04/01 +DK1CO,JO63SX,EME,,EX DL9GKA,,TS2000 TS790 AMPLITEC PA UG2-100-1500 50: 4el 144: 4x17el H 2x17el V LNA 432: 50 W 2x 20el LNA,03/08 +DK1EJP,JO31DD,,,,,,03/03 +DK1KO,JO53CT,EME,,,,144: 8877 4X17el F9FT full elevation MGF1302,11/08 +DK1MAX,JN58SP,EME,,EX DL4MDQ,,144: 11 el F9FT 750W,10/08 +DK1MZ,JO42XP,EME,,ex LZ1KU DL4ABJ,,144: EME Pwr 13el MGF1302,11/03 +DK1PZ,JO41TH,EME,,,,,01/94 +DK1VI,JN49HH,,,,,144: 650W 16 el.- 432: 100W 21 el.- 1296: 120W 1-2m Spiegel,09/08 +DK2AM,JO43AK,,,,,144: 450W 4x14el MGF1302,12/01 +DK2BJ,JO30BS,,,,,IC746 PRO IC706MKIIG Transverters,05/07 +DK2FT,JO42KC,,,,,,01/03 +DK2PH,JO41GV,EME,,CT1DTQ,,IC 746 50: 6M7JHV - 144: 4x 16JXX,07/07 +DK2UO,JO30,,,,,,01/93 +DK2YCT,JO32RG,,,,,,12/03 +DK2ZF,JO43VH,EME,,,,,10/08 +DK3BU,JO33NO,EME,,,,50: 25 W ERP 5el - 144: 749W 4x12el Preamp - 432: 749W 4x34el Preamp (16x11el) - 1296: 749W 0.9m dish,08/08 +DK3DUA,JO61TC,,,ex DG0DU,,144: FT847 1000Watts ERP,04/00 +DK3EE,JO41GU,EME,,= DK3T ex DL9YEY,,144: 8877 4x 24el M2,09/06 +DK3EP,JO31TS,,,,,,06/05 +DK3FB,JO31UC,EME,,,,432: 750W 4x23el - 1296: 150W 37el - 2300: 5W 65el,03/01 +DK3IK,JN39JF,,,,,,04/97 +DK3MU,JO72GK,,,,,,10/04 +DK3NG,JO43VC,EME,,,,,01/09 +DK3QN,JN58LJ,EME,,,,,06/09 +DK3QZ,JO31LP,,,,,,07/02 +DK3RV,JO31,,,,,,07/96 +DK3SE,JN37VP,EME,,,,144: 50W 2x 12JXX,04/05 +DK3SML,JN49SF,,,DO3ML,,IC-910H 100 W 9-elem. Yagi after DK7ZB,05/09 +DK3T,JO41GV,EME,,,,,08/05 +DK3WG,JO72GI,EME,,EX DM2BYE Y22ME DL3BWW,,144: GS35B 6x 14el (5wl) 432: GS23B 8x 27el & 16x27el 1296: 100 W 1x55el,06/08 +DK3WW,JO62NH,,,EX Y54WL Y21EF Y41ZF DL6USB,,,10/07 +DK3XM,JO43XL,,,,,144: 700w 2x2wl 60m asl,09/04 +DK3XT,JN49FE,,,= AB7IY,,,01/07 +DK4JN,JO31,EME,,,,,01/94 +DK4KW,JO60EM,,,EX DG0JWW,,TS-2000X,05/08 +DK4OG,JN68GI,,,,,,01/03 +DK4TG,JO31LB,EME,,,,144: 2X11el. 750W,12/07 +DK4U,JO42FD,,,,,144: 8874 250W 2x9el - 432: 3CX800 4x18el,02/08 +DK4WN,JN49EP,,,ex DC1PN,,,11/03 +DK4XI,JN39NG,,,,,,01/03 +DK5AI,JO51GO,,,,,,10/07 +DK5DC,JO31SL,,,,,,07/02 +DK5DQ,JO31PG,,,,,144: 300W 2x10el,03/04 +DK5DV,JO30XS,,,,,FT-847 TS850SAT,04/09 +DK5E,JO42DC,EME,,,,,07/06 +DK5EW,JN48MB,EME,,EX DG3GAG,,144: IC-7400 ATF54143 HEMT 16x 7el 750Watt,11/08 +DK5IT,JN49FB,,,,,,01/03 +DK5KK,JO63EX,,,ex DG0KK,,,01/01 +DK5KMA,JO50IK,,,ex DO8KB,,,03/06 +DK5LA,JO44TR,EME,,,,144: 100W 20el,08/05 +DK5MV,JN58WH,,,,,,08/97 +DK5OX,JN59MO,EME,,,,TS-2000X 144: 10el DK7ZB 50: Dipole,08/07 +DK5PD,JN39VV,EME,,,,,03/00 +DK5SO,JN58AV,EME,,,,144: TS700 600Wtts 4x3.5WL,12/08 +DK5TE,JN58BG,,,,,144: IC746 HLV600/8877 2x13el 432: IC475H 2x20el GS35b,05/02 +DK5WL,JN39VW,EME,,,,144: 750W 2x 2MXP20 (10 element XPOL),09/07 +DK5WO,JO30AS,,,,,YAESU FT-767GX LT23S,07/05 +DK5YA,JN49NX,EME,,EX DH8NAA,,50: 4el - 144: GS35b 4x9elM2 PHEMT 0.3db - 432: TH338 19el BV,06/07 +DK6AS,JO52,EME,,,,,02/01 +DK7BY,JO33RJ,EME,,,,750W,03/04 +DK7DN,JO40CW,,,,,,05/09 +DK7DR,JN47DP,,,EX DL8GCL DG7GAL 9H3XV,,IC821,07/06 +DK7LH,JO43BB,,,ex DG8BCC,,144: IC271 400W 2x3.6wl 9BV - 432: IC471H 100W 4x11wl 9BV,12/01 +DK7LZ,JO30,,,,,,12/01 +DK7T,JN48XK,,,ex DL0UL,,144: 11el 400W 3CX800,12/05 +DK8EL,JO31LJ,,,ex DH6JT,,144: 100W 9el MGF1302,12/04 +DK8KX,JO30,,,,,,05/04 +DK8VS,JN39NF,EME,,,,,07/01 +DK8ZJ,JO54AG,EME,,,,144: 600W BEKO 4x 12el M2,09/05 +DK9OY,JO52CK,EME,,,,,10/01 +DK9RL,JN69BB,,,,,,01/97 +DK9ZY,JO40BE,EME,,,,144: TS850 Trvt YL1052 MGF1302 4x10el 2.2wl DJ9BV,11/99 +DL0AO,JN59WI,EME,,,,,02/03 +DL0AVH,JO52,EME,,,,144: 700W 2x2M18XXX,07/01 +DL0BWS,JO64EB,,,,,144: IC-910 100W 2x9el 432: IC910 4x19el 75W 1296:IC910 2x35el 10W,04/07 +DL0DAN,JO33OP,,,SPECIALCALL,,,03/98 +DL0DBR,JO54WC,EME,,,,,06/99 +DL0DET,JO52CK,EME,,,,,01/94 +DL0EF,JO30IM,,,,,,01/03 +DL0FTG,JO53FM,,,,,,04/01 +DL0GER,JN49CC,,,,,,08/00 +DL0HES,JO41RF,,,,,IC820H 144: 250W 2x11el - 432: 130W 2x23el Preamp,07/01 +DL0HOF,JO50XG,EME,,,,144: 2x 10el 750W 432: 4x19el 250W 1296 56El 30W,08/07 +DL0LAU,JO61JF,,,,,,05/02 +DL0LN,JO31RS,,,,,,10/04 +DL0LSW,JO61XU,,,,,144: 17el 750W,12/99 +DL0PO,JO43CD,,,,,,08/96 +DL0SHF,JO54BH,,,,,,01/03 +DL0UEM,JO73AR,,,,,,07/05 +DL0UL,JN48XK,,,= DK7T,,144: 11el 400W 3CX800,12/05 +DL0UMK,JN68BC,EME,,,,144: TS790S 4CX1000 4x17el 5WL,01/95 +DL0VV,JO64AD,EME,,,,144: 500W 4x WY209 Preamp 3SK121,09/07 +DL0WAE,JO42DC,EME,,,,750w and lots of aluminium!,05/04 +DL0WH,JN49HN,EME,,,,,01/92 +DL0WX,JO30FQ,,,,,,07/96 +DL1AAH,JO52EF,,,,,IC-756pro3 / TR-144H+40 / TR-432H / 12 and 28 el M� yagi,06/09 +DL1AIW,JO43SX,EME,,,,FT 736 FT 221 FT 290,08/08 +DL1AOQ,JO50IW,,,,,,05/02 +DL1BKY,JO33RL,,,,,,01/03 +DL1DAX,JO31RM,,,,,144: IC251E 100W 11el - 432: FT780R 30W 19el,07/05 +DL1DSB,JO61,,,ex Y28OL,,,01/93 +DL1DUR,JO70KV,EME,,,,144: IC275H 700W 4x11el S3030,08/00 +DL1DWI,JO61TD,EME,,,,144: 2x 8el 750W,06/06 +DL1EAP,JO31IK,,,,,144: 12el 750W,04/07 +DL1EEX,JO31MA,,,,,144: 750W 10db ant.,09/00 +DL1EFJ,JO31GM,,,NOT qrv MS nw (01/01),,,09/01 +DL1EL,JO41RF,,,ex DL3ZBA,,IC820H 144: 250W 2x11el - 432: 130W 2x23el Preamp,09/01 +DL1ELY,JO31IO,,,,,144: FT225rd Mutek 17el 150W,01/01 +DL1GBF,JN48NJ,EME,,,,,02/97 +DL1GBM,JN48FD,,,,,50: 7W - 144: 400W- 432: 100W- 1296: 200W,07/02 +DL1GGT,JN58AO,EME,,,,144: 8877 2x 12el elev. 10368: 5W 60cm,12/04 +DL1GI,JN49FG,,,ex DL1GJO,,,12/03 +DL1GNM,JN38WB,,,,,,10/02 +DL1HTT,JO61FR,,,,,,11/99 +DL1HYZ,JO62,EME,,,,,03/01 +DL1JJ,JO31IA,,,,,,08/02 +DL1KDA,JO30FQ,EME,,EX DG1KDA,,FT1000 144: LT2S 3CX800A7 Preamp 17ele M2 432: LT70S 3CX800A7 Preamp 2x39el M2,10/07 +DL1MAJ,JN68AH,,,= HA1BC,,144: 2x17el 750W,12/99 +DL1NEO,JN59KV,,,,,144: IC275H SP2000 Beko HLV600 (max. 600 W) 2x17el Tonna,09/99 +DL1NFI,JN59KV,,,ex DG5NGC,,144: IC746 100W 12el M2,01/02 +DL1NUX,JO50LE,,,DO2NAK,,KWD TS2000X IC706MK II G,04/07 +DL1OJ,JO42QI,,,,,144: Elecraft K2 LT2S Beko HLV600 9el 300W,04/07 +DL1RNW,JO62GH,EME,,,,144: 300W 4x10 DK7ZB,12/07 +DL1RTL,JO62PH,,,,,144: 13el 100W MGF1302,07/01 +DL1SDN,JN48PP,,,,,144: 2x11el 500W,07/99 +DL1SFK,JN48PR,,,,,,06/02 +DL1SUN,JO53PN,,,ex Y21NB,,,04/00 +DL1SUZ,JO53UN,EME,,EX Y24LB,,TS2000 2m: GS35 2x2.2WL Preamp 3SK121 70cm: 2xEC9000 2x7.7WL Preamp.,01/09 +DL1UU,JO62SP,,,ex DL7VBW,,144: 300W 2x9el,04/06 +DL1VPL,JO61UA,,,EX Y21PL DM2GPL DM3XML,,,05/09 +DL1YDD,JO31OO,,,EX DG8YDJ,,144/432: 4CX250 X-Yagis 3 m 1296: 100 W Yagi 3 m,08/08 +DL1YMK,JO31QX,EME,,EX DB1DI,,,10/07 +DL1ZU,JO40IM,,,,,,06/09 +DL2ALF,JO50IW,,,,,144: 100W 9el,08/02 +DL2ARD,JO60AR,,,,,144: IC275E 350W 4x17el,02/05 +DL2BWH,JO62XR,EME,,,,HF: TS 830+GS35+ Log-Periodic /// 144: 350 W 10 over 10 El. Yagi,08/08 +DL2CJ,JO50,EME,,,,,01/94 +DL2DAO,JO31PH,,,,,144: 600W 24el,11/02 +DL2DBX,JO31OL,,,,,,07/05 +DL2DXA,JO61VC,,,,,144: 150W 11el,01/97 +DL2EAA,JN59PL,EME,,,,,06/09 +DL2FCN,JN49JU,EME,,,,50: 10W 2el BF981 - 144: 400W 11el MGF1302 - 432: 30W 19el CF300,03/06 +DL2FDL,JO40LN,,,,,FT736R 50: 5el - 144: 150W 9el - 432: 19el 25W - 1296: 23el 10W,08/03 +DL2GPS,JN48CD,EME,,DG2GPS,,TS2000 144Mhz:4x9el DK7ZB Yagi 432Mhz 2x20el X-Yagi Maspro,03/09 +DL2IAN,JN49BC,EME,,,,144: 1 KW 2x9el,07/01 +DL2IE,JN48,,,,,,01/93 +DL2JA,JN58,,,,,,02/04 +DL2LAC,JO44MR,EME,,,,144: 18 dBd GS35b 432: 20 dBd GS35b 10368: 4 m dish,03/05 +DL2LAH,JO44QS,EME,,DD0LV,,144: 750W 4x12ele DK7ZB 432: 300W 4x16 ele DK7ZB,02/09 +DL2MF,JO52DP,,,DL4OBI,,,06/08 +DL2MHS,JN58,EME,,,,,03/00 +DL2NFX,JN59IV,,,,,144: IC746 100W,04/01 +DL2NUD,JO63MF,EME,,,,144: 4x 18el QRO,05/06 +DL2NWK,JO63SP,EME,,,,,01/93 +DL2OCB,JN49HR,,,,,TS-2000,06/07 +DL2OM,JO30SN,EME,,,,,08/01 +DL2RDH,JN68HW,,,,,TenTec ORION II + DB6NT-Transverter+PA,05/07 +DL2RMC,JN68GI,,,,,,11/97 +DL2RSX,JO62SH,EME,,,,144: 19 dBd MGF 1302 DSP 1-2KW,12/03 +DL2RUG,JO62,,,,,,01/03 +DL2SDQ,JN49OC,,,,,,08/01 +DL2YDS,JO32,,,,,,08/97 +DL3AAL,JO52,,,,,,01/93 +DL3ANK,JO50NL,,,,,,10/07 +DL3AZI,JO51ME,,,,,,01/97 +DL3BUE,JO72FH,,,,,,08/02 +DL3BWG,JO62TQ,,,ex DM5DD Y26GE DR3R,,FT-847 11-ELE-F9FT,03/06 +DL3DTS,JO61UA,,,,,,01/93 +DL3FBJ,JO40,,,,,,11/01 +DL3HRT,JO61AB,,,ex Y32MH,,144: 10el 2.3wl 100W GaAsFet DSP-NR,07/02 +DL3IAE,JN49DE,EME,,,,50: TS120 trvt 6el - 144: 3CX800 750W 2x10el MGF1302,08/05 +DL3IAS,JN49EJ,,,,,144: 20w 10el DK7ZB 432: 3w 23el DK7ZB 1296: 100w 1.5m 2320: 75w 1.5m 3400: 40w 1.5m 5760: 8w 1.5m 10368: 10w 48cm,07/05 +DL3JAN,JO60KT,,,,,144: 9el 300W,03/01 +DL3JIN,JO60LX,,,Y32IN,,50W 6ele,05/08 +DL3JPN,JO60IS,,,Y56YN - Y23PN,,2m 150W@9ele - HF 500W@3ele (20/15/10) and FD4 - 70cm 100W@10ele,03/07 +DL3LBK,JO54AH,,,,,144: 250Watt 11el,07/96 +DL3LSM,JO61GG,EME,,,,Elecraft K3+TR144H - 300 W - 11 ele. Flexayagi,01/09 +DL3LST,JO61FI,EME,,,,144: 9el,04/05 +DL3MBG,JN68,,,NOT qrv MS nw (01/01),,,12/05 +DL3MGL,JN58QD,,,= EA/DL3MGL,,,12/01 +DL3NAW,JN59KV,,,zzT W3TWX,,144: 500W 2x11el,08/03 +DL3NCR,JN48QX,,,,,50: IC736 3el Yagi - 144: IC275E 11el DL6WU 8874 BF982,08/08 +DL3NUA,JO64XB,EME,,EX Y38ZA,,144: 500W 9el Yagi,02/07 +DL3RBH,JN68HJ,,,,,,05/99 +DL3RU,JN49FG,,,,,,01/03 +DL3SAS,JN48OR,EME,,,,,04/96 +DL3TN,JO31LC,,,,,,12/01 +DL3TW,JO44SK,,,,,144: FT1000 LT2S 6x6el 600W,01/03 +DL3WW,JO60FL,,,,,,08/08 +DL3XT,JN49FT,,,,,,01/93 +DL3YBP,JO42,EME,,,,,01/93 +DL3YEE,JO42GE,EME,,,,50MHz: 5ele 70MHz: 4ele 144MHz: 5el 100W 432MHz: 28ele 400W 1296MHz: 48ele 150W,05/08 +DL3YEL,JO41EV,,,,,144: 9el 3CX800,03/06 +DL4ABJ,JO42XP,,,,,,01/03 +DL4ALI,JO50JW,,,,,,07/99 +DL4ANT,JN49LF,,,,,,09/01 +DL4AO,JO42NX,,,,,144: 150W 11el,05/08 +DL4DD,JO43OT,,,,,TS2000,07/05 +DL4DTU,JO60TS,EME,,,,1296: 200W 3.7m dish 0.4db,08/05 +DL4DWA,JO61QH,EME,,,,144: 600W 13ele 432: 35w 19ele,12/05 +DL4EA,JO31,,,,,,09/96 +DL4EBY,JO62PM,EME,,,,,12/03 +DL4IB,JO64CC,,,ex DL5KVA,,144: 11el 300W,12/98 +DL4JM,JO31ED,EME,,,,144: 4el 100W,05/05 +DL4KG,JN48OU,EME,,,,TS2000 - 50: dipole 30 W 144: 10el DJ9BV 100 W 432: 23el DJ9BV 300 W 1296: 35el 80 W,04/07 +DL4MEA,JN58RI,EME,,,,432: 4.5m dish EME KA0RYT peamp GS35b 1296: TH347 750W 1.5m tropo 4.5m dish EME FHX35 HEMT preamp 2320: 1.5m tropo 4.5m dish EME 2xMRF21120 HEMT preamp,04/07 +DL4MP,JN48NV,,,ex DL8SET,,50: 100W 5el,01/01 +DL4NAA,JO40OC,,,,,144: hm 750W 2x15el,09/07 +DL4SUN,JO63CT,,,,,,10/04 +DL4WO,JO61WC,EME,,,,144: 17el 150W,04/05 +DL4XX,JO43XK,,,,,,07/97 +DL4YAO,JN58,,,,,,05/02 +DL4YBM,JO42DC,,,,,,01/95 +DL5AG,JO63CT,,,,,350W 11el Yagi,06/07 +DL5BAC,JO43LG,,,,,,01/96 +DL5BBW,JO32NH,,,,,,01/01 +DL5CC,JO64AD,,,ex DL5KVD,,144: 17el 600W,12/06 +DL5DAV,JO31,,,,,,06/08 +DL5DTA,JO61SD,EME,,,,144: 4x11el EME Pwr GaasFet DSP59,08/99 +DL5EBS,JO31LH,,,,,144/432MHz: TS790+13 el./20 el. Yagi. 50MHz:Icom+4 el. Yagi,05/09 +DL5FDP,JN49LP,,,,,,11/02 +DL5FN,JO40FB,EME,,,,432 8X28 QRO,04/09 +DL5GAC,JN47UT,EME,,,,144: 400W 11el Flexa CF300,04/08 +DL5IO,JN49NI,,,,,,01/97 +DL5LF,JO54,EME,,,,432: 1KW 4x9el 9BV 8.5lb - 1296: 20W 23el,08/00 +DL5MAE,JN58VF,EME,,,,144: 8x17el 700W,07/05 +DL5MAM,JN58UB,,,,,144: 100W 10el,07/04 +DL5MCG,JN58KH,EME,,,,144: 11el 500W,05/07 +DL5ME,JO52SD,,,ex DL6CIA,,144: 100W 18el,04/04 +DL5MEL,JN58,,,,,144: 600W 11el,03/00 +DL5NEN,JN59MO,,,ex DH5NBE,,144: 12el GS35b MGF1302 - 432: 28el GS35b - 1296: 35el 40W,12/97 +DL5OAU,JO52GW,,,,,,01/03 +DL5QQ,JO32KB,EME,,,,,04/96 +DL5RBW,JN58VF,,,,,,01/03 +DL5RDI,JN58XX,,,DG1RCJ,,,08/08 +DL5RDO,JN59VN,,,,,,01/92 +DL5ROB,JN68HG,,,ex DG5CH,,144: 300W 16el BF981,03/07 +DL5UJ,JN39UJ,,,EX DC8IL,,IC-271E 150watts MGF1302 preamp 5el DK7ZB,05/07 +DL5WG,JO52VK,,,ex Y52WG- DL6CRS,,50: 20W 4el - 144: 300W 2x11el,05/04 +DL5XV,JO53AP,,,,,144: 2x15el 600W,06/06 +DL5YAS,JO31WS,,,,,,12/01 +DL5YET,JO41EV,,,,,144: 750W 13el - 432: 750W,04/02 +DL5ZA,JO51HK,,,,,144: IC706 100W 14el F9FT,08/07 +DL6BF,JO32QI,EME,,,,144: 400W 4x 8el - 432: 150W 4x11el,03/09 +DL6KR,JO30NQ,,,,,,10/05 +DL6LAU,JO53CF,EME,,,,,07/03 +DL6LI,JO53BV,,,,,,06/07 +DL6MFK,JN67JX,EME,,,,,08/07 +DL6NAA,JO50VF,EME,,,,,10/00 +DL6NCI,JO50VI,,,,,,01/93 +DL6NDK,JO53BV,EME,,,,TS790 40W 350W 8El Yagi 12dBd,01/08 +DL6RDR,JN68BM,,,,,,10/95 +DL6UAL,JO61XU,,,,,144: 750W 2x BigWheel,12/00 +DL6WT,JN39VV,EME,,,,,04/96 +DL6WU,JN49HT,EME,,,,,02/04 +DL6YEH,JO32VA,EME,,ex DG3YFB,,144: IC730 LT2S 749W 2x2.2wl 9BV - 432: IC730 LT70 200W 4x8.8wl 9BV,03/02 +DL6YFB,JO31KM,,,ex DH4YAT,,,01/96 +DL6ZAU,JO40JF,EME,,,,FT736+MHP145 144: 600W 1x 12el M2,05/07 +DL6ZBN,JO40ED,,,currently not active 01/04,,144: TS700S 80W 11el MGF1302,05/02 +DL7AKA,JO62QO,EME,,,,144: TR7 Trvt 2x4CX250b 15el DJ9BV,01/01 +DL7APV,JO62JR,EME,,DC7PV,,432: 16x39el. EME 8x21el. Tropo,01/09 +DL7ARM,JO62RJ,,,,,,12/95 +DL7AUK,JO62,,,,,,01/03 +DL7DCU,JO41BC,,,ex DG7DCU,,144: FT767 100W 4x11el MGF1302,03/99 +DL7FF,JO62TJ,EME,,ex DL7UTS,,HF 100W FD4 - 144: 4x11el 1KW,04/05 +DL7HR,JN58PF,EME,,,,IC 7400 - 144: 2x 8el LY hor 800W,02/08 +DL7PP,JO30SE,,,,,FT920-6m Transverter 144: 2x 11el F9FT 50: 6el DK7ZB,08/05 +DL7QY,JN59BD,,,,,,10/08 +DL7TX,JN49IV,,,ex DC7AP,,144: 50W 6el - 432: 17el 100W,11/01 +DL7UAE,JO62PH,EME,,,,FT736R 50: PA Tonna20505 - 144: GS35 4x3wl (13el) 90degElev - 432: GS35 2x6wl(19el),10/06 +DL7UDA,JO62TK,EME,,,,144: IC275H 2xGI7B 17 el F9FT (GS35B 2x10el DK7ZB) 432: IC475H GS35B 21el F9FT (GS23B 4x21el DK7ZB),10/08 +DL7UGB,JO62,,,,,,05/97 +DL7ULE,JO62,,,,,,12/95 +DL7ULM,JO62SN,,,,,,05/01 +DL7UME,JO62SN,,,,,,01/03 +DL7YC,JO62PK,,,,,HF: 400W - 50: 10W - 144: 200W - 432: 750W - 1296: 110W - 2320: 125W - 10368: 33W,09/03 +DL7YW,JO62RK,EME,,ex DC7OL,,,01/02 +DL8AKI,JO51,,,,,,11/95 +DL8AKR,JO51AI,EME,,DM2CGI Y25VI,,144: FT847 150 Watt PA 5 EL-YAGI (10db) next more,02/08 +DL8BBL,JO42,,,,,,04/04 +DL8BDU,JO43AA,,,ex DC9BJ DH5BAG,,144: 750W 15el 432: 250W 2x 20el,01/08 +DL8CMM,JO52VM,,,,,,05/04 +DL8DAT,JO31,EME,,,,,01/93 +DL8DBU,JO30NP,,,ex DG8FCB DH6DAH,,144: TS-2000X single 2M12 600W 0.35dB,07/06 +DL8DUL,JO61,,,,,,08/04 +DL8EBW,JO31NF,EME,,EX DD0EF,,TS-2000 144: 2x 12el M2 full Elv 750W MOSFET LNA144MKII-SSB RX: ONKYO T-4711 PCR1000 7el Crossyagi,01/09 +DL8FBD,JO40,,,,,,01/93 +DL8GAM,JN37,,,,,144: TS870 600W 11el,12/97 +DL8GP,JN39LH,EME,,,,144: SE400 FT847 4cx250b GS35b 90mtr.coax 500watt in 8x 20el.crossyagis,04/05 +DL8HCZ,JO53AP,,,= CT1HZE,,,11/00 +DL8II,JN49,,,,,,07/08 +DL8LAQ,JO43XU,,,,,IC-7400 8874 M2 2M5WL,06/08 +DL8MEM,JN57XX,,,,,,12/06 +DL8NBN,JN58,,,,,,01/93 +DL8OBU,JO42XI,EME,,,,432MHz: 750W 4x33el - 1296MHz: 150W 67el,11/01 +DL8SCL,JN48RM,EME,,,,,03/01 +DL8SCQ,JN48RV,EME,,DG8SAV,,TS711E + 3CX800/GS35b + 2 * 10 DJ9BV( 1990 ) H,06/09 +DL8UCC,JO71EQ,EME,,,,144: 500W 2x11el or 2x17el,07/04 +DL8WKR,JO61CD,,,,,,09/06 +DL8YAU,JO41HS,EME,,,,144: Ant: 12 El 4WL PA: 700W-MOSFET VV: ATF54143,03/09 +DL8YE,JO31MH,,,EX DL8YET,,50: FT847 5el DK7ZB - 144: FT847 10el DK7ZB GS35 - 432: FT847 30w 23el DK7ZB - 10368: FT290 DB6NT Transv 5W 65cm dish,04/08 +DL8YHR,JO41GV,EME,,ex DH8YHR,,50: LT6S 2x9el M2 - 144: 24el M2 750W,11/05 +DL9AN,JO62RE,,,ex DL7UME,,50: 10W 5el - 144: FT736r 750W GS35b 2x12el,08/04 +DL9BDM,JO33RL,,,,,,01/93 +DL9DAK,JO43XO,,,DG5DT DH4DAB,,IC7000,04/07 +DL9DBJ,JO31OK,EME,,DG8DU,,VHF FT897D GS23b 7El UHF FT897D TH308 2x 19El,07/08 +DL9EBF,JO31FH,,,,,,01/03 +DL9EBL,JO31,EME,,,,,01/94 +DL9GBH,JN48RW,,,,,,12/01 +DL9GRE,JO61FH,,,Y66XA,,HLV600 10Eel DK7ZB DEMI Transverter,10/07 +DL9GS,JO31OM,EME,,,,,07/08 +DL9IM,JO31,,,,,,07/04 +DL9KR,JO40DE,EME,,,,,09/02 +DL9LBH,JO30MP,EME,,,,TS-2000 144: 2x 11el 500W - 432: 23el 50W,08/08 +DL9MCC,JN58UA,,,,,144: 4x 2-4wl 700W MGF1302 - 432: 2x 7wl 700W MGF1302,08/03 +DL9MS,JO54WC,EME,,EX DL9GJW,,144: 4x17el GS35b MGF1302,11/05 +DL9NBD,JO50LE,EME,,,,TS790 150w 2x11el,03/07 +DL9NDD,JN59KN,,,,,,01/03 +DL9NDW,JO50XG,,,,,IC7000 2m=400W/17el 70cm=100w 21el,06/09 +DL9OA,JO64EB,,,,,144: IC821 100W 9el/2.5wl CF300,03/02 +DL9OBD,JO42QN,EME,,,,IC7400 144: 4x11el 750W BF981 - 50: 5el 25W,05/08 +DL9RCI,JN68,,,,,,07/95 +DL9USA,JO71EN,,,,,144: 10el DL6WU 300W RXAmpl,09/03 +DL9YEY,JO41GV,,,,,,01/03 +DM1AC,JO30IV,EME,,DC9KZ,,TS2000 - 144 MHz 750W - 2 x 9 ele - 50 MHz 10W - 4 ele,09/08 +DM1CG,JO31IC,,,EX DG1ELE,,50: TS 850 LT6 4el - 144: TS 850 LT2S 600W 12el M2 HF: FT 850,10/08 +DM1HD,JO31GD,,,ex DC1JP,,144: TS850S LT2S HLV600 600Watt 17 EL M2,08/02 +DM2BHG,JO51MW,EME,,EX HZ1AB- Y22HG,,144: 4x 17el XPol 2xGS35b MGF1302,01/08 +DM2DXG,JO51MV,,,,,,06/02 +DM2ECM,JO62GJ,,,Y25CD,,,05/08 +DM2GS,JO42HJ,,,,,,12/04 +DM2HB,JO41EQ,,,,,50: FT950 144: IC-706MK2G 50W 11el F9FT,06/09 +DM2LL,JO62VU,,,DG3BSD,,HF:500 W- Beam 10-15-20 Dipol 2x 31 50 m // 144 : 100 W 11 El,08/08 +DM2PG,JO51,,,,,,04/03 +DM2SR,JO53HR,,,DO4LSR,,144: IC-910 - HA8UG GS31 - 2M18XXX Yagi 50MHz: 4element TenTec 1208 x-verter,05/08 +DM3FG,JN49LT,,,,,,04/03 +DM3FM,JO40MF,,,,,144: IC275H 8el 7ZH,06/02 +DM4KA,JO64II,,,,,,03/03 +DM7RM,JN48HD,,,EX DH3IAJ,,50: 10W 4el 144: 100W 10el 10GHz 5W 48cm dish,04/09 +DM8MM,JO40AQ,,,ex DC9PX DL7AJA,,144: IC-706MKIIG 3CX1500A7 MGF1302 17el. Tonna,11/06 +DN1FC,JO41RF,,,,,IC820H 144: 250W 2x11el- 432: 130W 2x23el Preamp,07/01 +DN1MA,JN58VF,,,,,144: 8x17el 700W,12/00 +DN2MS,JO31OM,,,SpecialCall,,144: C5400 HG51 400W 9el MGF1302,12/98 +DO1CTL,JO60LT,,,,,,08/01 +DO1EDK,JO31RL,,,,,Kenwood TR-751E,08/05 +DO1EL,JO31JL,,,,,,06/02 +DO1NF,JN69,,,,,,08/01 +DO1YDS,JO42HJ,,,,,,04/04 +DO2TC,JO73AO,,,,,,04/05 +DO3ESB,JN59VS,,,,,144: IC275H 17el,07/07 +DO3MT,JN67,,,,,FT817,01/03 +DO5AN,JO31,,,,,,04/02 +DO9ST,JN49VW,,,,,,03/01 +DP5G,JO31IC,,,SpecialCall,,,04/06 +DQ2006R,JO31NF,EME,,SpecialCall,,IC275H or TS2000 144: 2x 12el M2 full elev 750W BIY-ATF-Preamp,06/06 +DR5O,JO31MG,EME,,= DF0AW JO31MG,,FT736 144: 750W 2x 11el 432: 200W 4x 23el 1296: 23el 10W,12/08 +DS1MFC,PM37LM,EME,,,,144: 4x 13el 100W,04/08 +DZ1JP,PK04NC,EME,,,,,03/06 +E51EME,BG08DR,EME,,ZK1EME,,IC-706Mk2g 4x 8el 500W,12/08 +E73DPR,JN92ER,,,YU4DPR,,FT-897 IC-7000,05/09 +E73DU,JN92ER,,,,,,05/09 +E75DX,JN84MX,,,T96C,,TS2000,06/08 +E77AR,JN94AS,,,YU4AR,,Icom IC275 + PA 250W,06/09 +E77GS,JN84OT,EME,,EX T98GTH,,FT897 150 watt 10 el DK7ZB,09/08 +EA1ABZ,IN71QO,EME,,,,144: 4x12el or 11el DL6WU 1500W (4CX250+GS35B) Ga-As FET - 432: 15el 35W,10/02 +EA1AIB,IN82TK,,,,,,08/95 +EA1BBE,IN62BH,EME,,,,,10/05 +EA1BFZ,IN81SS,,,,,,04/04 +EA1BLA,IN53UM,,,,,50: 100W 5el - 144: 1kw 12el MGF1302 - 432(/p): 31el 600W MGF1302 - 1296(/p): 2x55el 80W MGF1302,10/02 +EA1BLX,IN53VK,,,= EB1BXW,,,04/06 +EA1CJ,IN71SW,,,EB1ISN,,IC-7000 Acom 1000,06/09 +EA1CKL,IN82KF,,,,,,08/08 +EA1CRK,IN73DM,,,,,Kenwood ts-790e or Icom 706 MkII 50: 100W 7el - 144: 17el 200W - 432: 19el 130W - 1296: 35el 10W,01/04 +EA1CYE,IN83,,,,,,01/93 +EA1DDO,IN53UI,EME,,,,144: 17B2 100W pHEMT 432: 50W 31el 1296: 10W 55el,09/06 +EA1DDU,IN73EM,,,EX EB1ALC,,144: TS-2000E2+16JXX2+170W 432: TR851E+CC729B 29EL+120W 50: IC706MKIIG+5EL ZX6-5. 1296: TS2000E2+55EL.F9FT+10w.,12/08 +EA1DOD,IN73AN,EME,,,,,01/93 +EA1EBJ,IN73FL,,,,,50: IC729 BV6-1wl - 144: IC275H BV2-4wl - 432: IC475H BVO-8.5wl,03/06 +EA1EW,IM79WS,,,,,,07/95 +EA1FBF,IN73WJ,EME,,,,,04/07 +EA1JK,IN72RA,,,,,,01/01 +EA1KV,IN52PF,,,,,,01/93 +EA1OD,IN73EM,,,,,,01/90 +EA1RX,IN52PF,,,ex EA1BSK,,IC706 MKIIG,06/03 +EA1SH,IN63GA,,,= EB1FIF,,144: 17B2 170W GaAs-Fet - 432: 31el 180W GaAs-Fet,05/04 +EA1YV,IN52OC,EME,,,,50: IC706 2x5el - 144: TS2000 GS35B 1KW 4x 17el M2 full elevation MGF1302,08/06 +EA2AF,IN92,,,,,,01/90 +EA2AGZ,IN91DV,EME,,,,FT1000MP- FT736 144: 4CX1500b 4x17B2CC MGF1402,10/06 +EA2ARD,IN93,,,,,,08/02 +EA2ASB,IN83KF,EME,,EB2DMN EC2BAW,,,11/08 +EA2AVY,IN92DS,,,,,,01/03 +EA2BVD,IN91OO,EME,,EB2ATY,,,11/07 +EA2KP,IN83MG,,,ex EA2AKP,,144: TR751E 2M18XXX 200W Preamp - 432: 100W 21el,04/04 +EA2LU,IN92ET,EME,,,,144: 8x9el 750 W MGF1302,01/06 +EA2LY,IN93AH,,,ex EA4LY,,144: TS790 4CX1500 LNA144 2x18el,08/98 +EA2NN,IN83MG,EME,,ex EA2CHT,,144: 4wl 200W IC706MKIIG,10/06 +EA2RCF,IN82,,,,,,08/02 +EA2RL,IN83MG,,,ex EA2AJX,,50: 10W Dipol - 144: 100W 6el Quad,07/05 +EA3/DL3MGL,JN01ME,EME,,= EA3MS,,144: 1KW 1x17el,04/09 +EA3ADW,JN11CQ,EME,,,,,10/02 +EA3AEL,JN01,,,,,,01/93 +EA3AIR,JN11,,,,,,01/93 +EA3AQJ,JN11BJ,,,,,,01/87 +EA3AXV,JN01TJ,EME,,,,Elecraft K2 IC756II Elecraft trvter. GS35 17el-5WL,05/07 +EA3BB,JN01VS,EME,,EX EA3BBU,,144: 2x 17el 400W MGF1302,09/07 +EA3BEW,JN01SG,,,,,,12/95 +EA3BTZ,JN11BI,EME,,,,144: 100W 16el 0.8db preamp,09/02 +EA3CN,JN11BI,,,ex EA3GAW,,,03/96 +EA3DUY,JN12LD,,,,,144: 4x17el 800W - 50: 6 el 500W - 432: 21el 50W,08/02 +EA3DXU,JN11CM,EME,,SILENTKEY,,,10/07 +EA3ECE,JN01LT,,,,,,11/97 +EA3EDU,JN01WK,,,,,,03/08 +EA3EHQ,JN11HR,EME,,,,,03/96 +EA3ESE,JN01WR,,,,,144: TM-255 VLA200 SHF MVV144-VOX 13 el Yagi,04/06 +EA3FLN,JN11KT,,,,,144: IC275H 450Watts GaAsFET preamp 0.6dB 18ele 18xxxM2,04/04 +EA3FTT,JN01VR,,,,,RIG: IC 275H 120W 13ELE yagui,09/06 +EA3GAW,JN11BI,,,,,,01/03 +EA3GCJ,JN11EM,,,,,Yaesu FT-107M,04/04 +EA3GFB,JN11,,,,,,12/95 +EA3GIQ,JN01ND,,,,,,07/95 +EA3GKU,JN01NJ,,,,,,08/08 +EA3GLJ,JN01UI,,,EC5AKW,,Elecraft K3,03/08 +EA3IH,JN11BJ,,,,,,01/87 +EA3KU,JN00JV,EME,,,,144: IC275H 2x4CX250 16el- preamp,04/05 +EA3MD,JN11,,,,,,01/94 +EA3MM,JN01WH,EME,,,,,01/93 +EA3MS,JN01ME,EME,,DG3MGL,,144: 2x 17el GS35b,10/08 +EA3PL,JN11PL,EME,,,,,01/94 +EA3TI,JN11JT,,,,,144: 17el 5lambda Yagi 400W 110masl,08/06 +EA3UM,JN01,EME,,,,,01/94 +EA3URC,JN11,,,SpecialCall,,YAESU FT-100 ICOM IC-706MKII - 144: 50W 14el,05/03 +EA3WH,JN01,,,,,,01/93 +EA3XU,JN11CK,EME,,,,,12/07 +EA4AMX,IM89AT,,,,,,07/01 +EA4BAS,IN80HL,EME,,,,FT847 144: 17el 180W MGF1302 - 432: 35el 100W MGF1302,09/02 +EA4DB,IN80EJ,,,EA4BPJ,,IC-756ProIII - IC-821H,09/07 +EA4ED,IM79FW,EME,,,,,01/94 +EA4EHI,IM68TV,,,,,144: IC275H 1500W 4x17B2,07/01 +EA4EKH,IN80ND,EME,,,,144: 50Watt 9el,08/05 +EA4LU,IM68TV,,,ex EB4FQP,,144: FT726r 400W 17el (17B2),04/03 +EA4SV,IM68MU,,,ex EA4DQR,,,04/04 +EA5AAJ,IM99SL,,,,,144: IC-706MK2G 100W 9el,04/04 +EA5AEL,IM98RP,EME,,,,ICOM 746-100w ant 14 elemnts VHF-multi-band dipole HF-5 elemts to 6 meters-monoband to 10 meters and others,04/07 +EA5CJ,IM99TL,EME,,,,,07/05 +EA5DWS,IM98SR,,,,,Icom 706-MKII-G YAESU FT-920,08/08 +EA5EF,IM99SM,,,EA5BVK - EC5BD,,144 MHz 70 W + 9 el yagi / 50 MHz 100 W + DK7ZB 5 el yagi,04/07 +EA5EMM,IM99,,,,,,01/93 +EA5GIY,IM98XD,EME,,,,,01/99 +EA5HM,IM99,,,,,,01/93 +EA5IC,IM98,,,,,,01/94 +EA5MT,IM88WV,,,,,,08/08 +EA5NO,IM98FV,,,,,,08/97 +EA5SE,IM98IL,EME,,,,144: 2x 17el 1.5K,04/06 +EA5SR,IM98GF,,,,,,08/08 +EA5ZF,IM99VT,EME,,EX EB5IFI,,144: 600W 2x 17el LNA145 432: 35W 2x 21el F9FT mw432s,05/07 +EA6ADW,JM19LU,EME,,,,50: 20dbd- 144: 40W- 10el- up: div. Spiegel,07/97 +EA6DD,JM19JK,,,,,144: IC706MKIIG 17elB2 100W,05/03 +EA6FB,JM08PV,EME,,,,,08/02 +EA6IB,JM09SB,,,,,144: IC251E 150W 15elYagi,04/02 +EA6NP,JM19MQ,,,,,,01/93 +EA6QB,JM08PV,,,,,144: 2x15el 4CX400,05/03 +EA6SA,JM19LO,EME,,,,TS-2000X: ...@50+9dBd's. 2x4X150@144+15dBd's. 2X4CX250@432+18dBd's. 10W@1296+25dBd's.,05/08 +EA6VQ,JM19HN,EME,,,,144: 2KW MGF1302 8x17el M2 432: 21el 115w 1296: 55el 10w,04/05 +EA7AJ,IM87CS,,,,,144: 300W 2x 19el,08/04 +EA7DBH,IM76GD,,,,,,01/94 +EA7DFH,IM87DD,EME,,,,FT-857 TS2000 17el 200w,05/07 +EA7ERP,IM87EE,,,,,TS 790-E 13 ELE TONNA + PA 4CX350A,06/08 +EA7EYX,IM87CS,,,,,,12/04 +EA7HG,IM87CS,EME,,,,144: 4x 9el 100w mgf1302,12/05 +EA7OC,IM77OV,,,,,144: IC820 250W 17el,03/01 +EA7RM,IM87CS,,,ex EA7GTF,,144: TR9130 240W 17B2 OH5IY,07/02 +EA7TL,IM66VO,,,,,,05/05 +EA7TN,IM66VP,,,EX EA1AK/7,,TS2000 144: 100 W 2 x 2.5 wl - 50: 100 W 0.81wl,05/08 +EA8BEX,IL27GX,,,EB8QC,,IC910H,06/08 +EA8FF,IL28,EME,,,,,02/01 +EA9AI,IM75IV,,,,,144: 100W 9el,06/03 +EA9MH,IM85NG,,,,,,05/00 +EB1BKG,IN62BH,EME,,,,,11/01 +EB1BXW,IN53VK,,,= EA1BLX,,,04/06 +EB1DNK,IN62CL,EME,,,,144: IC706 4x17el 500 Watt MGF1302 - 432: 70W 21el,04/06 +EB1EB,IN83BK,,,ex EB1IQC,,,08/05 +EB1EFC,IN52OF,,,,,,01/93 +EB1EHO,IN73DM,,,,,144: 17el 200W - 432: 21el 50W,07/04 +EB1EUW,IN82TK,,,,,,01/95 +EB1IHY,IN52PM,,,,,144: 17el 160W,07/04 +EB1IVY,IN53SJ,,,,,,07/02 +EB2AYV,IN83MG,,,,,144: 250W 2M18XXX,01/04 +EB2DTP,IN82NS,,,,,FT847 IC746 FT816 17el 1000W,08/03 +EB2DVT,IN91MP,,,,,,03/06 +EB2FJN,IN83QE,EME,,,,50: 1x3 cushcraft 100W - 144: 2x 13b2 Ant MGF1302 1KW - 432: 9el X-Quad BF980 150W,12/08 +EB3BAP,JN11CJ,,,,,144: FT736r 200W 17el,01/01 +EB3CNX,JN11DI,,,,,,01/93 +EB3EPR,JN01ND,,,,,,01/03 +EB3GHU,JN11CJ,,,,,,04/04 +EB3JT,JN01UI,EME,,EB3GEK,,IC910 + SP2 + 4x13B2 + GS35B,08/07 +EB3WH,JN01WN,,,,,,01/93 +EB4DF,IM79QQ,,,,,TS-790 FT-817 144: 500W 17el - 432: 500W 21el,06/04 +EB4EQZ,IN80EK,,,,,Yaesu ft-817 Yaesu FT-897,08/05 +EB4ERS,IN80BH,,,,,FT736 144: 140W 9el GaAs-Fet,01/00 +EB4EUB,IN80DJ,EME,,,,50: 6el 100W - 144: 17el 1KW MGF1302 - 432: 21el 50W MG1302 - 1296: 55el 10W,08/00 +EB4FXD,IM78BX,,,,,144: 150W 17el,02/04 +EB4GIA,IN80CG,,,,,144: IC821 IC706 TS790 240W 17el - 432: 100W 31el SP70,02/98 +EB4TT,IN70XJ,,,ex EB4CXS,,,05/00 +EB5AZO,IM99RA,,,,,,11/04 +EB5EA,IM99TN,EME,,EB5AYG,,144: 4x 11el 500W,05/08 +EB5EEO,IM98PG,EME,,,,144: TS2000 6 x 18 2M18xxx /432 : 4 x 38 13 wl / 1296: 8 X 35 Elm Tonna,08/07 +EB5EHX,IM99,,,,,,01/93 +EB6AOK,JM09RB,,,,,HF 144 432 1296,06/09 +EB7BMV,IM67WI,EME,,,,,05/09 +EB7BQI,IM76SR,,,,,,06/03 +EB7COL,IM77AG,,,,,,05/04 +EB7DBX,IM67LG,,,,,144: 12 ele DK7ZB 350W LNA SHF Electronik,07/07 +EB7EFA,IM67XI,,,,,,01/95 +EB8ANY,IL18,EME,,,,144: 500W 4x 7el,12/04 +EB8BTV,IL18QI,,,,,,05/03 +EC1DMY,IN82SL,,,,,,08/08 +EC3DR,JN01UJ,EME,,EA3GLJ,,,04/09 +ED1GSR,IM79WS,,,Expedition,,,01/94 +ED3DXU,JN01VQ,EME,,SPECIALCALL,,,02/08 +ED4RKF,IM79WS,,,Contestcall,,144: 240W 13el,03/97 +ED5TOR,IN90XP,,,Expedition,,,01/93 +ED6EIG,JM19IM,,,SpecialCall,,,08/99 +EG3TVC,JN11BI,,,SpecialCall,,144: 400W 17el M2,12/99 +EH1RX,IN52IN,,,ex EH1BSK,,IC706 MKIIG,03/02 +EH3AXV,JN01TJ,,,,,50: FT920+trsv GS35b 6elYagi,07/02 +EH5RM,IM98,,,,,,07/02 +EH6SA,JM19LO,,,,,TS-2000X,08/07 +EH7RM,IM76QM,,,,,,01/03 +EH9LS,IM75IV,,,,,,01/03 +EI2CA,IO62,,,,,,01/88 +EI2IP,IO61CX,,,,,,04/07 +EI2VPX,IO53IQ,,,,,,01/91 +EI3GE,IO63XD,,,,,,08/00 +EI4DQ,IO51WU,EME,,,,144: ic910 gs35b MGF1302 4x10el or 10el,03/08 +EI4GHB,IO52QQ,,,,,Icom 910,09/08 +EI4VBE,IO42,,,Expedition,,,01/88 +EI4VBS,IO42,,,Expedition,,,01/90 +EI4VWY,IO54,,,Expedition,,,08/01 +EI4VWZ,IO55,,,Expedition,,,08/01 +EI4VXV,IO43XL,,,G0AFH,,144: 400W 17el Preamp,12/06 +EI5FK,IO51RT,EME,,,,144: FT847 150W 9el,03/05 +EI5HN,IO62,,,Expedition,,,05/06 +EI6CPB,IO63WE,,,,,50: IC706 - 144: IC821,09/06 +EI6GF,IO62RG,,,,,,02/98 +EI6IZ,IO53HU,EME,,,,IC756PRO2,06/07 +EI75RTS,IO51,EME,,SPECIALCALL,,,04/07 +EI7IX,IO53FT,EME,,,,,10/07 +EI7RCG,IO62,,,,,144: 27el,08/96 +EI7RSD,IO62WX,,,,,144: 27el 400Watts,07/96 +EI8JK,IO51DN,EME,,EI2FSB,,FT-726 FT-736 FT-102 FT-897,06/09 +EI9HW,IO63MP,,,,,,10/93 +EJ4VNX,IO43,,,SpecialCall,,,01/93 +EJ6O,IO43MM,,,SpecialCall,,,01/94 +EM1U,FC74US,,,,,,01/03 +EN80AL,KO61WP,,,= UT8AL,,,08/07 +ER1AN,KN46KX,,,ex ER5OIW UO5OIW,,144: FT857 200W 2x10el,12/04 +ER2RM,KN46KA,,,ex ER5OK,,,11/05 +ER5AA,KN45CW,,,ex UO5OB,,,06/00 +ER5AL,KN45CW,,,,,,07/02 +ES0Q,KO17AV,,,SpecialCall,,,06/04 +ES0X,KO18,EME,,Expedition,,,07/99 +ES1CW,KO29HK,,,,,,05/98 +ES1RF,KO29IJ,EME,,ex UR2RGM,,FT1000MP/FT847/FT736/TS2000+Trans.+Preamps 50: 5el 500W - 144: 4x9el 500W - 432: 4x19el 150W - 1296: 4x 35el,04/06 +ES2CM,KO29DJ,EME,,,,ICOM-706 MKIIG 144: 4x 14el 600W,04/06 +ES2NA,KO29JL,,,,,144: IC706MKII 300W 9el,04/02 +ES2QH,KO29LL,,,,,144 : FT847 700Watts 9ele Preamp - 432: IC821 800W,08/01 +ES2WX,KO29JN,,,,,,05/03 +ES3BR,KO28JS,,,,,,05/04 +ES3GZ,KO28,,,,,,01/93 +ES3RF,KO29IF,EME,,EX UR2RGM ES1RF ES1RF/3,,FT1000MP/FT847/FT736/TS2000 50: 5el 500W - 70: 5el 60W - 144: 4x18el 500W - 432: 8x19el 200W - 1296: 4x35el 30W,03/08 +ES4Q,KO39BD,,,Expedition,,,08/05 +ES5KJ,KO38IJ,,,,,,01/05 +ES5MC,KO38JJ,,,,,,12/95 +ES5MG,KO38IJ,,,,,,01/94 +ES5PC,KO38HJ,,,,,1296: remote operated setup: 4.5 m dish 300-350W,10/08 +ES5RE,KO38,,,,,,01/94 +ES5RN,KO38,,,,,,01/94 +ES5RY,KO38JI,,,,,,11/02 +ES5WE,KO38JJ,,,,,,01/94 +ES6DO,KO27WX,,,EX UR1RYY- UR2RDO,,IC756 + IC820H+Preamp ATF54143 + 100/350W 50MHz: 4el - 144MHz: 2M5WL,05/08 +ES6LBN,KO37AW,,,,,144: 170W 11el,07/04 +ES6RQ,KO28WA,EME,,ex UR2RQT UR2RQ,,TS2000 FT736 FT847 144: 2KW 8x17el M2 + 1x 18el,07/05 +ES8AS,KO28FJ,,,,,,04/04 +ES8X,KO18XC,EME,,Expedition,,144: TS790E+PA 300W 2x9 el or FT 847+ PA 300W 9 el Yagi and preamps,07/02 +ET3AA,KJ98JX,EME,,= ZL1RS,,,04/08 +EU1AB,KO33SU,,,EX UC2AAB,,,12/08 +EU6AF,KO35,,,,,,12/07 +EU6MS,KO45IN,,,ex RC2WBH,,144: 16el 700W MGF1302,09/01 +EV2AA,KO33PM,,,,,,01/03 +EV2AAB,KO33ST,,,,,,01/03 +EV2OEU,KO52IK,,,,,,01/03 +EV5M,KO53TP,EME,,Expedition,,144: 4x 9el QRO,08/06 +EV5N,KO42RX,,,Expedition,,,01/94 +EW1CD,KO33SW,,,,,,06/07 +EW1RZ,KO33SV,,,,,,10/01 +EW2ABC,KO33VW,EME,,,,,11/08 +EW6AL,KO46KB,,,Expedition- QSL via EU6MS,,,08/06 +EW6DX,KO45JL,,,,,144: 100W 9el,08/97 +EW6FS,KO35LB,,,,,144: 20W 2x16el F9FT Preamp,01/03 +EW6GB,KO45CN,,,,,144: 200W 10el,08/02 +EW7IM,KO53,,,ex UC2SMM,,,01/92 +EW7IN,KO53,,,,,,01/94 +EW7IW,KO53DR,,,,,,01/03 +EW8DD,KO42QA,,,,,144: 4x16el F9FT- 50W,12/98 +EW8RR,KO41OV,,,,,,09/07 +EY8MM,MM48FI,EME,,,,144: IC706 200W 2x 10el,06/06 +F0DBD,JN08XW,,,,,FT726R 10W 10el Preamp,01/02 +F0DIX,IN93SV,,,,,-,06/07 +F0EJW,IN78VJ,,,,,ICOM 910H Antenne 17 El�ments tonna Pwr:20watts,06/08 +F0FEQ,JN33LN,,,,,,11/06 +F1AFJ,JN06HT,EME,,,,144: 4x11el F9FT 1500 W 0.4dB,11/04 +F1AKK,JN39CC,,,,,,07/01 +F1AOE,IN93RS,,,,,,04/04 +F1CCM,IN93MP,,,,,,01/93 +F1CNE,JN28,EME,,,,,01/94 +F1CXX,JN18AT,,,EX J28EL,,ic910h+11 ele-ft847+dipole+gp 50mhz,05/09 +F1DLZ,JN19FH,,,,,,08/08 +F1DUZ,IN97NJ,EME,,,,144: FT897D 2x 4CX250R 600W 4x 11el LNA 9BV,04/06 +F1DVP,JN12JN,,,,,,08/08 +F1EBK,JN18BW,EME,,,,144: TS790A 300W 4x10el DK7ZB,11/04 +F1EBN,JN18JR,,,,,,08/02 +F1ELL,JN18EX,EME,,,,,01/94 +F1ERG,JN27JJ,,,,,,08/08 +F1FEN,JN25JC,EME,,,,,01/94 +F1FHI,IN97GD,,,,,,01/03 +F1FIH,JN23GS,,,,,,04/03 +F1FLA,JN26KU,EME,,,,144: 4x25el Xpol 7.6lb 1KW MGF1302,10/05 +F1FVP,IN95XA,,,,,,01/03 +F1GHP,IN96LE,,,,,,01/03 +F1GTR,IN96JE,,,,,,01/03 +F1GTU,JN05IF,,,,,144: 160W 13el,05/06 +F1HAR,JN18DT,,,,,,01/93 +F1HQM,JN23LV,,,,,,10/07 +F1IHP,IN88,,,,,,07/02 +F1ISJ,IN97QM,,,,,IC746,10/08 +F1IXQ,JN15MQ,,,,,,12/01 +F1JG,JN23HQ,,,ex FC1JG,,,08/02 +F1JOE,JN05IF,,,,,,01/93 +F1JRD,JN13WO,,,ex FA1JRD,,144: TR751 GS35b 2x11el F9FT,12/04 +F1MBM,JN38CQ,,,,,FT225RD 144: 8877 4CX250 MGF1302 16el F9FT - 432: 100W 21el F9FT,12/02 +F1MOZ,IN93RS,,,,,,11/06 +F1NGP,JN39CC,,,,,,04/97 +F1NNI,IN88,,,,,,04/02 +F1NSR,JN33JK,EME,,,,144: IC275h 2*11EL 2*4CX250,03/07 +F1NWZ,JN17CT,EME,,,,144: FT736R Mutek Front End 4x 10el 7ZB GS35B,03/07 +F1ODA,JN13FO,,,,,144: 400W,10/02 +F1PUX,JN16XL,,,,,TS690S 144: LT2S 200W 20el - 50: 5el,01/99 +F1PYR,JN19DA,,,,,,04/02 +F1PYW,JN38UP,,,,,144: 120W 9el or 2x11el - 432: 17el or Helix,03/99 +F1RAD,JN25WF,,,ex FC1RAD,,50: 5W 1/4wl. - 144: TR751e 25/200W,05/02 +F1RHS,JN03PV,,,,,,11/01 +F1TE,IN94QS,EME,,,,144: 4x 12el 2KW,09/06 +F1VJQ,IN95OL,,,EXPEDITION,,,07/07 +F1VS,JN04FV,,,,,,05/08 +F2TU,JN38LG,EME,,,,,11/01 +F3VS,JN38LF,EME,,,,144: 24x20el (6wl) & 8x20el (6wl) DJ9BVs,03/99 +F4ALP,JO10OP,,,,,,12/01 +F4APX,JN23XL,EME,,,,144: 4*18EL - 432: 4*21EL 2*4CX250,01/04 +F4ARU,IN94VT,,,,,144: 4x3.6wl 1KW 8877,11/01 +F4AZF,JN39GG,EME,,,,144: IC275h 500W 8874 4x 15el,04/06 +F4BKV,IN95PT,,,,,144: TS700 150W 9el - 432: TS440S TRV 70W 21el - 1296: TRV 1W 3x35el,04/02 +F4CIB,JN03,,,,,144: 250W 9el,05/02 +F4CYZ,JN38SF,EME,,,,144: FT897D 400W 2x 9el Yagi,05/05 +F4DDX,JN23QI,,,F0DDX,,FT897 FT817,03/08 +F4DSD,JN23JO,EME,,,,,01/05 +F4DXX,IN97LH,EME,,,,144. 17el 200W,01/06 +F4ERO,JN18JV,,,EX F0ERO,,,12/08 +F4JRC,JN23JW,EME,,,,144: 4x10el,01/01 +F4JVG,JN16UM,,,,,,07/02 +F5ANT,JN24RJ,,,,,,04/96 +F5AQC,JN05PU,,,,,,01/03 +F5BUU,JN03BO,,,,,,01/05 +F5DE,JN05DP,,,,,50: 50W 5el - 144: 100W 16el,08/07 +F5EAN,JN06CP,EME,,,,,01/94 +F5FEN,JN25JC,,,,,,01/03 +F5FHI,IN97GD,EME,,ex F1FHI,,,01/94 +F5FLN,IN94SR,,,,,144: 300W 17el,08/99 +F5FVP,IN95WB,,,,,144: 4x17el 1KW,07/00 +F5GHP,IN96LE,EME,,EX F1GHP FC1GHP FD1GHP FE1GHP,,IC745+transverter 4x14elts DJ9BV 3.6Wl MGF1302B Power 400w,10/07 +F5HRY,JN18EQ,EME,,,,144: 1KW 4x11el,11/02 +F5IF,JN12IL,,,,,,08/08 +F5IVP,JN23QI,,,,,IC706MKIIG 50 W elts F9FT,05/07 +F5JKK,IN87PR,,,= FM5JC,,,08/07 +F5JNX,JN37PV,EME,,,,144: 4x 17el 600W,02/07 +F5JRX,JN25AW,,,,,,01/94 +F5KCR,JN26IX,,,,,,08/96 +F5KDK,JN23VF,,,,,,01/03 +F5KPO,JN24,,,,,,12/01 +F5LEN,JN38BO,,,,,144: IC275A 250W 17elB2,06/05 +F5LKW,JN23SJ,,,,,144: TS700 60W 13el,04/03 +F5LRL,JN26MV,,,,,144: 400W 4x10el,05/02 +F5LUW,JO10MP,EME,,ex F1LUW,,,11/95 +F5MGD,JN07AW,,,,,FT102 + tvtr,05/04 +F5MMX,JN18CN,,,FD1MMX FE1MMX F1MMX SO9MMX SO8MMX,,Home made,11/07 +F5MSL,JN26JS,EME,,ex FC1MSL,,144: 8877 4x11el (or 4x10el) MGF1302,02/99 +F5MZN,IN87BU,EME,,,,,08/96 +F5NWK,IN97EJ,,,ex FD1NWK,,144: 9el 200W,05/04 +F5OIH,JN06,,,,,,08/03 +F5OWL,JN33CC,,,ex FC1OWL,,50w 2x9elts side by side with elevation,08/05 +F5PAU,IN88CB,,,,,144: 4x11el 150W,07/02 +F5RRS,JN36EB,,,,,144: 350W 10el Quad,10/06 +F5RSS,JN36EB,,,,,144: Kenwood TM-255 PA : TE SYSTEMS 1452G (350 Watts) ANT : 10 el. Qubical Quad,10/06 +F5SCL,JN29HP,EME,,,,FT225RD,07/08 +F5SDD,JN23RF,EME,,FD1SDD,,FT901 IC211,01/04 +F5SE,JN29BG,,,,,,06/03 +F5SIB,JN18EB,,,FD1SIB,,,03/09 +F5SJE,JN13,,,,,,12/95 +F5SJP,JN13VQ,,,,,144: TS790 180W 17B2,01/02 +F5VBW,JN03,,,,,,06/95 +F5VHX,JN04FT,EME,,ex F/G8MBI,,,06/03 +F6ANQ,IN94RT,,,,,,07/96 +F6AOI,JN33NQ,,,,,,08/02 +F6APE,IN97QI,EME,,,,144: 17el 200W,11/06 +F6BAZ,JN39EF,,,,,,06/02 +F6BEE,JN08FU,,,,,,01/03 +F6BEG,JN25JS,EME,,,,144: 3wl Antenna 300W,06/08 +F6BKI,IN94,EME,,,,,12/05 +F6CBH,JN19BH,,,,,,12/07 +F6CGJ,IN78RK,EME,,,,144: 4x11el 400W,04/00 +F6CIO,JN26JH,,,,,,09/98 +F6CJG,JN15,EME,,,,,01/93 +F6CKZ,JN09LH,,,,,,01/97 +F6CRP,IN96KE,,,,,50 MHz : 3 el - 100 W 144 MHz : 600 W- 9 el DK7ZB,09/07 +F6CTW,JN18,EME,,,,,01/93 +F6DHI,JN23RK,,,,,144: 200W 9el MGF1302,04/04 +F6DKQ,JN37BI,,,,,,11/08 +F6DKW,JN18CS,,,,,,02/01 +F6DRO,JN03TJ,,,,,2500Watt 18el BF981,03/04 +F6DWG,JN19AJ,,,,,,04/05 +F6DWH,JN19,,,,,,01/95 +F6EAS,IN98,,,,,,08/01 +F6EGV,JN33AQ,,,,,,08/07 +F6EMT,IN98FG,EME,,,,,01/94 +F6EYM,IN99,EME,,,,,12/95 +F6FHP,IN94TR,EME,,ex F1CYO,,144: 1KW 4x6 wl 432: 27el 800W,08/06 +F6FLV,JN18AT,,,,,,02/96 +F6FTN,JN08XS,,,,,TS2000X 144: 4x9el 300W,01/04 +F6GPT,IN94SW,,,,,144: 11el 400W,03/07 +F6GRB,JN25KP,EME,,,,144: 4x 10el 600W,05/06 +F6GUU,JN05CU,,,,,FT857,04/06 +F6HLC,JN26HS,EME,,,,144: gs35b or th308 17elt yagi,09/07 +F6HRO,IN88JQ,,,,,IC910 144: 17el 100W,05/06 +F6HVK,JN27LH,EME,,EX F1AUQ,,144: 4x 17el H or single Yagi 400w / kw,01/08 +F6HYE,JN36DG,EME,,,,,01/94 +F6IFX,JN07CX,,,,,,10/07 +F6ITS,JN33MP,,,,,IC706MK2G 144: 50W quad 8 el 432: 20W quad 2x11el,04/08 +F6IZZ,JN18GR,,,,,,01/03 +F6JXR,IN98HW,,,,,,09/98 +F6KHM,IN78RJ,EME,,,,,06/02 +F6KRK,JN18AS,,,,,144: 17el 120W,08/08 +F6KSX,JN18,,,,,,01/03 +F8BKD,JN38LG,EME,,,,144: TS-2000 4X11 el 1000W,01/03 +F8CS,JN27UR,,,,,,08/98 +F8DNX,IN93FJ,EME,,,,IC-7400. 100 watts. 10 elts (DK7ZB)home made quad(4x10 coming soon),05/08 +F8DO,JN26IF,EME,,,,50: TS680S 5el - 144: FT225 4CX1000 2x11el MGF1302,08/06 +F8DYR,JN07WL,,,F4DYR,,50 / 144 : homebrew,10/08 +F8ENY,JN03RO,,,,,,08/08 +F8IPS,JO00SQ,,,,,,07/00 +F8KFR,JN09RG,,,,,144: 2x9el 1-8KW - 432: 80W 26el doublequad,09/06 +F8OP,JN26MM,EME,,,,50: TS690 100W 6el - 144: FT225RD Mutek 2x4CX350 500W 17B2 Cushcraft,02/05 +F8PKC,JN38MG,EME,,,,144: TS-2000 4x17b2 qro,04/06 +F9HS,JN23AT,EME,,,,144: 4x BVO3WL 8877 MGF1302,10/07 +F9IE,IN86WW,,,,,,05/04 +FA1APX,JN23XL,EME,,,,144: IC970 4 x 22 el DJ9BV 2 x 4CX350F,04/00 +FC1DUZ,IN97NB,,,,,,01/03 +FF6KBF,JN18BW,,,,,,01/03 +FK8HA,RG37FR,,,,,,01/03 +FM5CS,FK94LI,EME,,,,144: 4x 17el B2 1.5KW 8877 LNA 0.5db,05/06 +FO4NK,BH52,EME,,,,,01/94 +FO5RK,BH52,,,,,,01/03 +FR5DN,LG78SS,EME,,,,,12/05 +FS5UQ,FK88LC,,,,,,01/03 +FT5XO,ME40VK,EME,,,,,03/05 +FY5DG,GJ35QD,EME,,,,,01/03 +G0AEI,JO01GO,,,,,,01/91 +G0AFH,JO01EI,,,,,144: 2x17el 400W,01/08 +G0BPU,JO02,EME,,,,,01/94 +G0CHE,IO90PS,,,,,50: 400W 70: 50W,05/07 +G0CUH,IO70LG,EME,,,,144: 500W 10el,04/05 +G0CUZ,IO82WM,,,,,FT726r 50: 50W 2el - 144: MGF1302 2x3CX400A7 5el or 11el - 432: 10W 5el,07/02 +G0DJA,IO93IF,,,EX G6VMQ,,TS2000X SDR1000 FT817,09/08 +G0EVT,IO93GR,,,,,144: IC202S 250Watts 3wl DJ9BV,07/01 +G0FIG,IO90UU,,,,,50: IC575h 6el 400W - 144: IC275h 400W 10el MGF1302 - IC475h 300W 2x19el,05/00 +G0GMB,IO92NB,EME,,,,IC756 PRO II TR144H MGF1302 LNA GS35 PA. Ant: 17 ele F9FT for 2m - 5 ele for 6m - 3 ele for 4m,08/08 +G0GMS,IO82XT,,,,,50: IC746 & IC756pro GS35b pre-amp,04/06 +G0HVQ,IO81UX,,,,,Icom IC7400,04/07 +G0HYP,IO84FN,,,,,FT847 IC1271E 144: 1.5KW 2x17el - 432: 2x21el,09/06 +G0ISW,IO84OQ,,,EX G1MOG,,Kenwood TS-2000 & Create Log Periodic,04/07 +G0JDL,JO02UK,,,,,,01/96 +G0JUR,IO92WT,,,,,,08/99 +G0KAD,IO91VC,,,G1JUZ,,144: FT1000MkV Elecraft XV Transverter 2x 12ele hoembrew GS35,04/07 +G0KAS,IO91UI,,,,,144: IC275h 2x4CX250b 17el Preamp,01/00 +G0KPW,JO02RF,,,,,144: 400W 2x17B2,07/06 +G0KSC,JO01,EME,, +G0KUX,IO91WP,,,,,,11/01 +G0KZG,IO80,,,,,,03/07 +G0LBK,IO93JK,,,,,,01/93 +G0MGA,JO00DT,,,,,,01/93 +G0MJW,IO91JO,,,,,50: 100W 5el - 70: 160W 4el - 144: 2x4CX250b 13el,01/97 +G0NFA,IO91NE,,,,,144: IC271A,04/01 +G0PES,IO83LS,,,,,,11/99 +G0RRJ,IO91FE,,,ex G8OPR,,1296: 100W 55el,04/04 +G0RUZ,IO93FR,EME,,ex G6ZTU,,144: IC746 GS35b 6x 4.6wl. 32JXX X-Pole MGF1801 - 432: 2003 - 1296: 5m Dish TH347,10/02 +G0SAS,IO84OQ,,,,,Kenwood TS-2000,10/07 +G0TPH,IO92IO,,,,,,12/01 +G0UWK,IO83UB,,,ex G1WEM,,FT1000mp 144: TV144/28 GS31b 400W 5WL 432: 2x 6WL GS31b MGF1302,10/06 +G0WUU,IO92SR,,,,,,08/08 +G0XDI,IO91RP,,,,,,11/01 +G1EMJ,IO82WM,,,,,,01/93 +G1GEY,IO94FW,EME,,,,,01/94 +G1KAW,IO91TK,EME,,,,144: 9el 200W,08/06 +G1MOG,IO84OQ,,,,,Kenwood TS-2000,10/07 +G1OGY,JO01GR,,,,,,09/04 +G1SWH,IO83QO,,,,,,10/04 +G1WPF,IO91RP,,,,,144: IC275E Tempo2002 3CX800 9el,08/99 +G1XRL,EN35,,,,,,01/03 +G1YJI,IO91WP,,,,,,11/01 +G1ZJP,IO92WV,,,= M1MHZ,,IC7400 IC1275e IC475H IC202s IC402 TS830s & Tvtrs 4x 12el 400W,11/08 +G3BW,IO84,,,,,,01/93 +G3JHM,IO91LC,,,= F0AKD EI4AW,,50: 100W 5el - 144: 400W 2x13el,05/01 +G3LQR,JO02QF,EME,,,,,01/94 +G3LTF,IO91GG,EME,,,,eme: 6m dish,03/06 +G3NAQ,IO91HL,,,,,50: 400W 3el - 4: 100W 2el - 144: 400W 17el - 70: 250W 21el,08/05 +G3UTS,IO94CU,,,,,144: 400W 9el M2 BF981,02/04 +G3WCS,IO83RH,,,,,144: TS430S HB Transverter HB Amp 2x4CX250B 20el DJ9BV 70: 100W 4el 50: 100W 4el,01/05 +G3WDG,IO92rg,EME,, +G3WZT,IO90UX,EME,,,,IC756PRO 50: 7el 400W - TS2000 144: 2x12el 400W - 432: 1x19el 50W,03/07 +G3YNN,JO00EU,,,,,50: 2-5W 5el - 144: FT736 100W 14el - 432: FT736 25W 11el,05/04 +G3YYD,IO91TR,,,,,FT1000MP Transverter 4CX400 400w to 3wl yagi at 22m AGL,04/05 +G4AEP,IO91NJ,EME,,,,144: 400Watt 17el ATF53045,01/05 +G4AFJ,IO92HO,,,,,144: 150W 10el,09/01 +G4ALY,IO70UL,,,,,,12/03 +G4AOA,IO83TD,,,,,,01/93 +G4APJ,IO83UP,,,G8APJ,,FT736 FT817,10/07 +G4ASR,IO81MX,EME,,,,144: FT221GTi 2x3CX400 17el (4x17el),02/04 +G4BRK,IO91HP,,,,,144: 80W 9el,05/08 +G4CBW,IO83UB,EME,,,,144: TS2000 IC756PROII 4x 9el 800W,01/07 +G4CCH,IO93,EME,,,,5.4m dish. 650W CW or 450W JT,05/07 +G4CJG,IO94CR,,,,,,01/93 +G4CLA,IO92JL,,,,,,09/03 +G4DBL,IO91JJ,,,,,144: IC746PRO 4CX350 300W 17el,11/04 +G4DDK,JO02PA,EME,,,,TS2000X IC275 FT847 FT817 FT290,04/07 +G4DEZ,JO03AE,,,= G4ZDE G9Z,,IC910 and IC7400 various Linears,10/06 +G4DHF,IO92UU,EME,,,,144: K2 txvtr GS35B 8x Yagis 2.2 wl,10/06 +G4DOL,IO80SP,,,,,,04/99 +G4DZU,IO93ES,EME,,,,1296: 800W 3m. Dish,05/07 +G4ERP,IO81XW,,,,,,01/03 +G4FDX,EN60VL,,,,,,01/03 +G4FRE,JO01KK,EME,,,,,01/94 +G4FUF,JO01GN,EME,,,,,04/05 +G4HGI,IO83PL,,,,,144: TS780 GS35b 400W 17el,08/04 +G4HGT,IO83,,,,,,01/93 +G4IGO,IO80NW,EME,,,,50: IC706 300W 6el - 144: IC706 2x 17el 400W,04/05 +G4JCC,IO90MS,,,,,,01/03 +G4JZS,IO91SO,,,G8LZE,,,06/07 +G4KLA,IO92AK,EME,,,,2x11 400w SSB SP-2000 preamp TS790 LinearAMP,12/08 +G4KLX,IO93FB,,,,,,03/04 +G4KUX,IO94BP,EME,,,,,10/07 +G4KWQ,IO92AQ,,,,,144: FT847 400W Preamp 16el Tonna,04/03 +G4LOH,IO70JC,EME,,,,,05/07 +G4ODA,IO92WS,,,,,,01/05 +G4OIG,IO92OG,,,G8CXK,,TS130V - FT736R (50 - 1296) - FT817 - C528,09/07 +G4PBP,IO82WO,,,,,,07/01 +G4PCI,IO91AL,,,,,IC756PRO,01/03 +G4PCS,IO91WV,EME,,,,indoor antennas,10/07 +G4PIQ,JO01MU,EME,,,,144: 2x3CX800 ATF10136 4x15el CueDee,10/04 +G4RGK,IO91ON,,,,,144: 300Watt 17el MGF1302 - 432: 400Watt 8x27el MGF1302,03/01 +G4RKV,JO01OI,,,,,144: IC275E EME Pwr 2x9el MGF1302,01/01 +G4RNL,IO83,EME,,,,,01/94 +G4RRA,IO80BS,,,,,144: 4x10el 400W,08/03 +G4SHC,IO83VO,,,,,,01/93 +G4SSO,IO91TO,,,,,,08/94 +G4SWX,JO02PB,EME,,,,,06/09 +G4VIX,JO01PU,EME,,,,,01/94 +G4VPD,IO92BJ,,,,,,01/90 +G4VXE,IO91QL,,,,,,03/01 +G4WQE,JO01CJ,,,,,,01/03 +G4XBF,IO91QE,,,,,,04/99 +G4XUM,IO83,EME,,,,,10/02 +G4YTL,IO92MB,EME,,,,144: IC275 1KW 4x 5wl DJ9BV,05/05 +G4ZFJ,JO01HO,EME,,,,50: 4Q 400W 70: 4Q 25W 144: 4x 9el KW,01/09 +G4ZTR,JO01KW,EME,,,,144: FT1000MP LT2S 2x4CX250B MGF1302 CC17B2 or 2x9ele OZ5HF,08/05 +G5WQ,IO91DO,EME,,,,ic756pro3 jst-245 ic706mk2g ft100d 4x 11el 500W,10/07 +G6AVK,JO01HO,EME,,,,,10/08 +G6DER,IO93GN,,,,,,01/97 +G6HIE,IO90ST,,,,,,01/09 +G6HKM,JO01FT,,,,,,01/94 +G6RAF,IO92QP,,,,,,10/95 +G6TEL,IO90AR,,,,,,05/04 +G6TUS,JO02AG,,,,,TS-2000 - 100w - 12ele ZL,02/09 +G6UT,JO01BS,,,= M0ITY OK2IT - ex OK2ITY,,,05/06 +G6XRK,IO90RN,,,,,144: IC820H Henry2002 Mutek 15el M2,01/98 +G6XVV,IO93,,,,,,11/95 +G6YAY,IO80EL,,,,,,01/03 +G6YIN,IO93ET,,,,,,01/99 +G6ZTU,IO93HN,EME,,,,,01/93 +G7KQW,IO93,,,,,,01/03 +G7LIJ,JO01GG,,,,,,01/95 +G7NCF,IO81RE,,,,,FT847,05/05 +G7RAU,IO90IR,,,,,144: FT757 Mutek 12el 400W,05/08 +G8APZ,JO01DO,EME,,,,IC-275 or IC475 on every band 144MHz - 24GHz with transverters,10/07 +G8BCG,IO70RK,EME,,= H44PT,,50: IC756POOII 400W 7el,06/06 +G8BHH,IO82WO,,,,,,07/01 +G8CLZ,JO00EU,,,,,50: 2-5W 5el - 144: FT736 25W 9el - 432: FT736 25W 11el,09/01 +G8DKK,IO91VX,,,,,,05/07 +G8DSL,IO90FW,,,,,,01/03 +G8ECI,JO03AK,,,,,50: 5el 300W - 70: 5el 160W - 144: 10el 300W,01/01 +G8GTD,IO93,,,,,,11/01 +G8GXP,IO93FQ,,,,,TS2000X + PAs for 6m 4m 2m 70cms and 23cms (see QRZ.com for details),11/08 +G8IZY,IO91VC,,,,,144: TS700G BF981 4CX250b 250W 9el M2,01/01 +G8LZE,IO91SO,,,G4JZS,,,08/08 +G8LZG,IO93SR,,,,,FT847 or FT100,11/01 +G8MYK,IO92BJ,,,,,IC275H- 100W- 17el,07/02 +G8OPR,IO91FE,,,,,,01/03 +G8PYP,IO90AS,,,,,,01/93 +G8ROU,IO92,,,,,,01/93 +G8RWG,JO01BN,EME,,,,144: FT1000MP DEM144/28 2x8874 MGF1302 9el full elv,05/02 +G8T,IN79JX,,,,,,06/02 +G8TIC,IO82VF,,,,,50: JST245+8877+6el 144: IC7400+1KW+DJ9BV-10el,08/08 +G8TOK,JO01BI,,,,,,04/02 +G8UUR,IO92ET,,,,,144: 80Watts 3ele@10mtrs,07/00 +G8VHI,IO92FM,,,,,50: 100W 4el - 70: 10W 4el - 144: 9el 200W - 432: 2x23el 100W - 1296: 67el 40W,07/04 +G8VR,JO01DJ,,,,,50: 3el 100W,05/03 +G8VYK,JO01FO,EME,,,,144: IC251E MGF1302 180Watts 15 ele Cue Dee 15m,07/05 +G8XVJ,IO83RJ,,,,,144. LT2S 8877 17el M2,08/99 +GB2LBN,IO85,EME,,,,144: 17el 100W,08/00 +GB2LD,IN79JX,,,Expedition,,,08/06 +GB2WQ,IO66,,,Expedition,,,01/92 +GB4IOM,IO74PB,EME,,,,,05/04 +GB4SPT,IO74PB,EME,,,,,05/04 +GB4VR,IO57,,,Expedition,,,01/90 +GB4XS,IO78HA,,,Expedition,,50: IC746 100W 4el - TR9130 - 70: 150W 6el - 144: 2x14el 400W,08/00 +GD0WKX,IO74SD,,,Expedition,,,10/95 +GD4IOM,IO74QD,EME,,,,50: 400W 4x7el - 144: 400W 8x9el - 432: 400W 4x20el,08/01 +GD4UFD,IO74,,,Expedition,,,01/88 +GD7HEJ,IO74SD,,,,,,10/95 +GI0OTC,IO65QE,,,,,,12/00 +GI1JUS,IO74,,,,,,01/93 +GI4KSO,IO64XK,,,,,70: 100W 3el - 144: 300W 8el,07/03 +GI4SNA,IO64XM,EME,,,,144: 4x 12el QRO,02/08 +GI6ATZ,IO74AJ,,,,,144: IC251E Mutek FE 300W 13el,12/06 +GI7UGV,IO74DO,,,= GM7UGV,,FT847 144: 200W 8el,04/06 +GI8YDZ,IO65,,,,,,01/88 +GJ0JSY,IN89XE,,,,,,12/01 +GJ0RUZ,IN89,EME,,Expedition,,,03/02 +GJ4ICD,IN89WE,,,,,,10/98 +GM0BQM,IO85CE,,,,,144: 200W 2x17el,03/02 +GM0EWX,IO67UL,,,,,144: 12el 8874,05/02 +GM0GMD,IO86AE,,,,,,07/00 +GM0HUO,IO86OI,,,,,FT736r 50: 100W 3el - 144: 180W 12el,08/99 +GM0JOL,IO78VM,,,,,,01/93 +GM0ONN,IO87,EME,,,,,03/06 +GM0WDD,IO85JV,,,BECOMING ACTIVE 07/07 -> 6M HOME 2M PORTABLE,,6m - IC756pro2 2m FT-847,05/07 +GM0WDF,IO75PW,,,,,144:TS940 Trsv IC271E 400W 17el,09/01 +GM3POI,IO88OW,,,,,,10/01 +GM3SBC,IO85IX,EME,,,,144: 100W 11el,11/05 +GM3SEK,IO74SR,,,,,,05/07 +GM3UCN,IO85RV,,,,,,04/04 +GM4AFF,IO86ST,,,,,144: 14el Tonna EME-Pwr MGF1302,08/03 +GM4CXM,IO75TW,EME,,,,144: FT736R 3cx800A7 2x9el @ 23m 432: 120w 2x23el Wimo @ 21m 23cm: 150w 4x44el @ 11m,01/09 +GM4ILS,IO87IP,,,,,,07/01 +GM4ISM,IO85AR,EME,,,,FT847,07/05 +GM4JJJ,IO86GB,EME,,,,144: 4x3wl XPOL 8877,05/01 +GM4OGM,IO85,,,,,,01/88 +GM4SIV,IO57RT,,,Expedition,,,07/06 +GM4VVX,IO78TA,,,,,50: TR751E 5W Dipol,04/06 +GM4WJA,IO87MN,EME,,,,,03/07 +GM4YXI,IO87WJ,,,,,,04/00 +GM5RP,IO66,,,QSL via G3SEK,,,08/01 +GM6HGF,IO75QP,,,MM0XPG,,,05/08 +GM6VIU,IO85,,,,,144: TR851E 25W 24el,11/99 +GM6VXB,IO97AQ,EME,,,,6M 400W-7EL 4M 100W-6EL 2M 250W-11EL 70CM 50W-2X19EL 23CM 50W-2X55EL 12CM 10W-80CM DISH 9CM 15W-80CM DISH 3CM 10W-80CM DISH,04/07 +GM7ASN,IO78TA,,,,,,06/95 +GM7LVJ,IO85,,,,,,01/94 +GM8OEG,IO86LL,,,,,,04/06 +GU7DHI,IN89RL,,,,,,12/01 +GU8FBO,IN89QK,,,,,144: 10el 50W,10/06 +GW0KZG,IO82,,,,,,12/98 +GW0PZT,IO72PT,,,,,,01/93 +GW0VWD,IO81EM,,,,,,07/96 +GW3HWR,IO71XN,,,,,FT847 IC910 + Amps - 144: 350W 9el Preamp,08/05 +GW3LEW,IO71PS,,,,,,04/03 +GW3XYW,IO71XR,EME,,,,144: 4x 10el 400W,01/06 +GW4DGU,IO71SV,EME,,,,144: 15.6dBi yagi 750W SSPA 0.4dB HEMT 432: 2x yagi (19.5dBi) 550W SSPA 0.4dB HEMT,05/08 +GW4HDF,IO81JO,,,,,,04/02 +GW4LXO,IO81,,,,,,08/98 +GW4UWR,IO81LP,,,,,,08/99 +GW4VEQ,IO73SG,,,,,,10/02 +GW4VVX,IO81JP,,,,,,06/95 +GW4ZQV,IO81LQ,,,,,,08/97 +GW6TEO,IO71LP,,,,,TS-2000. 50mhz-250W 70mhz-100W 144mhz-300W 432mhz-50W.,05/08 +GW6YAY,IO81LM,,,EX G6YAY,,144: IC821H 300Watts 17ele CC,08/03 +GW7SMV,IO81LN,EME,,,,IC910H 144: 12eleM2 432: 19ele tonna 50: ICOM 746 6ele 1wl yagi,06/08 +GW8ASA,IO81EM,,,,,FT847 IC706 Linears - 144: 220W 9el,02/04 +GW8ASD,IO83LB,,,,,Icom IC756 ProIII with Acom 1000 and 5ele for 6m.Icom IC756 ProII with transverter 100w 4ele 4m. Icom IC910X with linear for 23cm,06/07 +GW8IZR,IO73TI,EME,,EX G8IZR,,144: 2x 9el GS35 .23 dbrx - 432: 4x21Y 350W 1dbrx - 1296: 8W 2m dish,04/06 +GW8KCY,IO71VS,,,,,,04/08 +GW8OQV,IO81QR,,,,,144: FT225-Mutek 2x4CX250b 4x10el DL6WU or 17el,07/98 +GX0SAS,IO84OQ,,,,,Kenwood TS-2000,10/07 +GX4NOK,IO93FR,,,,,,01/03 +GX4WWR,IO91LL,,,,,,01/03 +H40HP,RH29,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP,QI90,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP/RI00,RI00,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44HP/RI01,RI01,EME,,EXPEDITION,,144: 18el 1500W Preamp,03/09 +H44MS,QI90XN,EME,,= DL2GAC,,144: 18el M2 1 KW,03/08 +HA0DU,KN07VN,EME,,,,,09/07 +HA0HO,KN07SU,EME,,,,144: 6x 10el 3.5KW,12/06 +HA0MS,KN17,,,,,,08/08 +HA1BC,JN87PU,,,= DL1MAJ,,144: 3CX800A7 2x17el,12/00 +HA1FV,JN87JJ,,,HG1KYY,,FT-847 2m: 2x12el 300w 6m: 5el 100w,05/08 +HA1KVM,JN87AL,,,,,,01/03 +HA1KYA,JN87HF,,,,,144: 8x13el DL6WU 200W,11/98 +HA1VHF,JN87GF,EME,,ex HG1W,,,10/98 +HA1W,JN87GF,,,,,,01/03 +HA1YA,JN87GF,EME,,ex HG1YA,,144: 8x13el & 8x14el - 432: 16x32el - 23+13:1.5m dish 6+3: 90cm dish,06/05 +HA2A,JN87,,,,,,12/99 +HA2NP,JN97EO,,,,,,05/01 +HA2RD,JN87WB,,,,,,10/08 +HA2RG,JN86RT,EME,,,,144: FT102 4x 17el DJ9BV 2KW MGF1302,10/06 +HA2RX,JN87,,,,,,12/98 +HA2SX,JN87VC,,,,,144: IC821H 600Watts 11ele,12/98 +HA2VH,JN87WG,,,,,,03/03 +HA3DXC,JN96JO,,,,,144: 5.5WL 2x8877,07/96 +HA3UU,JN96JO,,,,,144: TS711A GS35B 5.5wl 4wl 2wl MGF1100 - 432: FT736R ELH730 3CX800A7 4x10wl MGF1100,09/04 +HA4A,JN96JO,,,ex HA4XT,,144: TS711A GS35B 5.5wl 4wl 2wl MGF1100 - 432: FT736R ELH730 3CX800A7 4x10wl MGF1100,05/04 +HA4KYB,JN97DI,,,ex HG4KYB,,,01/94 +HA4WQ,JN97IF,,,,,,06/03 +HA4XG,JN86GS,EME,,,,144: FT726R 60W 10el Yagi,12/08 +HA4XT,JN96JO,,,,,,01/05 +HA5BSW,JN97JD,,,ex HA3GK,,144: IC706MKII KNW TR751 300w 2x 13ele yagi,07/05 +HA5CAR,JN97,,,,,,07/01 +HA5CBA,JN97OM,,,,,144: HF trsv+conv,04/04 +HA5CRQ,JN97,,,,,,08/02 +HA5CRX,JN97KP,EME,,,,144: IC-7000 GS31 SP2000 3wl DJ9BV-BVO2,12/07 +HA5CW,JN97PM,,,EX HG5CW,,144: FT225RD/Mutech B1016 GS35B 800W 10el MGF1302,11/07 +HA5IW,JN97LN,,,,,,08/01 +HA5KDQ,JN97LN,EME,,,,,07/03 +HA5LV,JN97ML,,,,,144: FT-897 + 300W + 3wl DJ9BV,05/08 +HA5OO,JN97OM,,,,,144: 100w 3wl DJ9BV 50: 5W FD4 HF:100W FD4 HB9CV for 28 MHz,05/07 +HA5OV,JN97NJ,EME,,,,144: FT920+Trnv GS35 1-5KW 4X10 ele. BVO2 MGF1302,06/07 +HA5PT,JN97MK,,,,,FT847,09/08 +HA5RL,JN97PL,,,,,,12/04 +HA5TS,JN97LL,,,,,144: IC-706MKII 8ele,07/04 +HA5UK,JN97OM,,,HA9TE HA5CTA,,144: 300W 10el 3wl,01/08 +HA6NA,JN98VC,,,,,144: 250W F9FT,08/01 +HA6NN,JN98VC,,,,,FT-847 6 ele YU7EF yagi for 2 m 7 ele YU7EF for 70 cm 3 ele DK7ZB for 6 m,01/08 +HA6NQ,JN98WA,,,,,144: 700Watts CF300 DJ9BV 3.2wl,01/05 +HA6NY,JN98WC,,,,,144: 1000W MHP145 17el full el - 432: 40W LNA435 18el full el - 1296: 10W 55el F9FT,12/06 +HA6OQ,JN98JC,,,ex HG6OQ,,,08/98 +HA6VV,JN97WS,,,,,,06/09 +HA6VV/P,JN97WV,,,,,,06/09 +HA6ZB,JN97,,,,,,01/05 +HA6ZV,JN97WH,,,,,,09/04 +HA7JJS,JN97OG,,,,,,10/95 +HA7KPL,JN97OG,,,ex HG7KPL,,,12/95 +HA7MB,KN07BM,,,,,IC-706 Ft200 IC910h Ant.2m-8el Quagi 6m-Moxon HF-Dipole,10/07 +HA7NK,KN07CM,,,,,144: 200W 4x15el 9BV Preamp,06/00 +HA7PL,JN97OG,,,ex HG7PL,,,11/06 +HA7RF,JN97NP,,,,,IC 735 +conv,04/03 +HA7UL,JN97KK,,,,,Yaesu FT847 W3DZZ,05/08 +HA8AR,KN06MQ,,,,,TS790A FT-897D + PA GI7B 3wl DK7ZB,12/07 +HA8CE,KN06EN,EME,,ex HG8CE,,144: GS35b 400W 16 el. DJ9BV CF300,12/05 +HA8CS,KN06BD,,,,,,01/03 +HA8ET,KN06,EME,,ex HG8ET,,,01/93 +HA8KCP,KN08DQ,,,,,,01/03 +HA8V,KN06HT,EME,,,,10w 3el -- 900w 44el -- 75w 92el -- 25w 76el -- 50w 1.2 dish -- 200mw 1.2 dish,10/06 +HA8VF,JN96UW,,,ex HG8VF,,,10/97 +HA9KRL,KN07GT,,,,,,04/05 +HA9MCQ,KN08JC,,,,,144: 150W 14el CF300,06/98 +HA9MDP,KN08DF,,,EX HG9MDP,,FT-736 FT-897,04/07 +HA9OZD,KN08DF,,,ex HG9OZD,,144: TR9130 150W 14el CF300,04/06 +HA9RC,KN08NB,,,ex HG9RC,,,01/94 +HAM3DXC,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HAM3UU,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HAM7JJS,JN97OG,,,SpecialCall,,,07/96 +HAM7KPL,JN97OG,,,SpecialCall,,,07/96 +HAM7PL,JN97OG,,,SpecialCall,,,07/96 +HAM8CE,KN06EN,EME,,SpecialCall,,,11/96 +HB2FAP,JN47CE,,,,,144: 16el 1KW,12/00 +HB5OK,JN46LA,,,SpecialCall,,144: FT847 8877 17el MGF 1302,12/98 +HB9ADJ,JN36LH,EME,,,,50: FT-897D + Acom 1000 ant. 3 el 144: FT-857D + PA 200W ant. 4 x 11 Flexa AzEl,04/07 +HB9AOF,JN36LM,,,,,,01/97 +HB9BBD,JN47EE,,,,,,01/03 +HB9BIN,JN37XH,,,HB2BIN HE7BIN,,IC-910/IC-7800,12/08 +HB9BQU,JN37VD,,,,,50: 10W - 144: 200W 17el,08/99 +HB9BZA,JN36BE,,,,,50: FT-847 V-2000 - 144: 3CX800 11Y - 432: 2*8874 19Y,01/04 +HB9CVD,JN36CD,EME,,,,,01/94 +HB9CYN,JN36RX,,,,,144: 30W 7el 10db Gaas,01/99 +HB9DBM,JN47BE,,,qrv at HB9Q,,,03/99 +HB9DDS,JN47IK,,,,,,05/02 +HB9DFG,JN37SM,EME,,,,144: FT100 - 500W - 7el - MGF1302,08/08 +HB9DKM,JN37SL,EME,,,,50: 3el vertical - 144: 150W 2x11el Flexa MGF1302 - 432: 9el X-Quad 100W CF300,03/02 +HB9DLU,JN45LU,,,,,,01/03 +HB9DSU,JN36CG,EME,,ex IK2BHX K2BHX,,,07/05 +HB9DUR,JN46ME,EME,,EX HB9SUL,,NOT QRV FROM HOME,09/07 +HB9EFK,JN46JE,EME,,ALSO CT2JTY AND EX HE9ZLE HB3YIT,,TS-2000X 12el DK7ZB + MGF 1302 / HM GS-31B PA,06/08 +HB9FAP,JN47PH,,,,,144: IC7400 2x18 el Yagi 1KW,07/08 +HB9FMN,JN47CI,,,,,TS-940s TEN-TEC 2m & 6m X-verter FT-897D FT-817ND,08/08 +HB9HLI,JN37JB,EME,,,,,03/07 +HB9HLM,JN36KW,EME,,= CN2DX - EX HB9SAX,,,06/08 +HB9LU,JN46EW,,,,,,06/96 +HB9MM,JN36HP,,,,,,08/02 +HB9MS,JN47PH,EME,,,,144: 8877,12/99 +HB9OCW,JN46LA,EME,,,,50: 4el 10W - 144: 4x13B2 1KW - 432: 2x29el 1KW,10/99 +HB9PJT,JN47FG,,,,,,05/02 +HB9Q,JN47CG,EME,,HB9PMD HB9CRQ,,50: 10W 11el - 144: 15mPb & 8x19el 1KW - 432: 15mPb 1KW - 1296: 15mPb 200W,04/07 +HB9QQ,JN47,EME,,,,50: 2x 5el 144: 17el QRO,10/05 +HB9RUZ,JN47JM,,,,,,12/96 +HB9SJV,JN36BK,,,,,50MHz: 6 el & 2x5/8 vert. 144MHz: 100W 11el,08/07 +HB9SLO,JN36LT,,,,,144: FT736r 1KW 18el LY,04/03 +HB9SNR,JN36MQ,,,,,144: FT736r 800W 12el M2,11/01 +HB9STI,JN47GJ,,,,,,01/93 +HB9STY,JN36IP,,,,,FT690R 50: 150W vert & 5el - 144: 300W 2x15el,07/98 +HB9SUL,JN46LA,,,,,,01/03 +HB9SV,JN45LV,EME,,,,,08/00 +HB9WAH,JN47FD,,,,,50: 10W - 144: 2x 11El 1kW MGF1302 - 432: 2x 18El 1kW MGF1302 - 1296: 4x 24El 10W MGF1302,04/04 +HB9ZGA,JN47CH,,,,,,10/07 +HC5K,FI07NB,,,,,,01/03 +HF75PZK,JO93AC,EME,,SpecialCall,,,01/05 +HG1DLZ,JN87HF,,,,,144: 8x13el 200W MGF1402,12/98 +HG1ZR,JN86KU,,,HA1ZR (1965-1967),,FT 817,01/09 +HG2EAD,JN97,,,,,,01/93 +HG2KNP,JN97,,,,,,01/93 +HG2NP,JN97,,,,,,01/95 +HG3DXC,JN96JO,,,,,144: 5.5WL 2x8877,08/98 +HG3O,JN96JO,,,,,144: 5.5WL 2x8877,08/98 +HG4XG,JN96,,,,,,01/93 +HG5CYT,JN97,,,,,144: FT290r 50W 5el - 432: 25W 11el,01/01 +HG5PT,JN97MT,,,,,,01/93 +HG6KNB,JN98,,,,,,01/93 +HG6KVB,KN07,,,,,,01/93 +HG6NQ,JN98WA,,,,,,01/95 +HG7AJ,JN97,,,,,,01/93 +HG7JAL,JN97KK,,,,,,07/02 +HG7JUV,KN07SP,,,,,,05/09 +HG7P,JN97KW,,,ex HG7B/p,,,04/97 +HG7WJ,JN97MP,,,,,,01/93 +HG9SM,KN08HF,,,,,,07/04 +HG9VHF,KN08EB,,,,,144: TR9130 150W 14el CF300,07/00 +HGM3DXC,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HGM3O,JN96JO,,,SpecialCall,,144: 5.5WL 2x8877,07/96 +HI3TEJ,FK49EL,EME,,QSL via ON4IQ,,144: 17el 500W,06/05 +HI8ROX,FK58AL,,,,,,01/03 +HK1DX,FJ29EM,EME,,,,144: 200W 17el - 432: 150W 8wl,11/06 +HL4GHT,PM35NU,EME,,,,144: 4x 13el 100W,03/08 +HL5XF,PM45OH,,,,,,01/03 +HP3XUG,EJ88SJ,EME,,EX KG6UH/DU1,,144: 4x 17el 1KW,01/00 +HQ8R,EK87,EME,,EXPEDITION,,,03/08 +HR9BFS,EK66UE,EME,,,,,12/07 +HS0ZIL,OK16bq,EME,,= DL2LAH,,144: QRP 2x10ele DK7ZB,02/09 +HS2CRU,OK03LE,,,,,,01/03 +HV0A,JN61FV,,,,,,01/05 +HV4NAC,JN61,,,Expedition,,,06/99 +I0EMV,JN62BK,,,,,,01/92 +I0FOV,JN62,EME,,,,,11/06 +I0NLK,JN62HB,,,,,FT736 200W 11el F9FT,03/06 +I0UGB,JN62BO,EME,,,,,11/06 +I0UZF,JN63,,,,,,06/00 +I1ANP,JN44VC,EME,,,,IC735+L4B - 144: TS700 4x4cx250b MGF1302 4x16el DJ9BV - 432: IC402+lin 26db horn,03/01 +I1BSN,JN34,,,,,,01/93 +I1CPM,JN34VI,,,,,,01/03 +I1CPN,JN34VH,,,,,,02/04 +I1DMP,JN34XU,,,,,144: 20 el LYagi 17 dBi RX 430K TX 56dbm,03/08 +I1JTQ,JN35UB,EME,,,,144: 2x18el 900W MGF1801,08/01 +I1KTC,JN45HK,EME,,,,,11/96 +I1NDP,JN45AL,EME,,,,,10/08 +I1PIK,JN44TG,EME,,,,FT736R 50: 2x5el- 144: 14+14xpol-el Preamp - 432: 32el HL130 - 1296: 35el,05/07 +I1PSC,JN44MJ,,,,,FT-225rd + 200W-20eI - IC475h-25el - Trsv DB6NT 1296-55el,03/09 +I1TEX,JN35SA,EME,,,,144: 13el 300W,03/08 +I1TXD,JN45,,,,,,01/93 +I2FAK,JN45OB,EME,,,,144: 24x19el LLY YL1056,12/04 +I2FHW,JN45,,,,,,01/93 +I2KBD,JN45PL,EME,,,,,04/07 +I2ODL,JN45KL,EME,,,,144: 4x17el 8877 - 432: 8x21el 3CX800A7 - 1296: 2m dish 2x7289,09/00 +I2OKW,JN45OO,,,,,,08/02 +I2PHD,JN45SL,EME,,,,,12/00 +I2RV,JN45PL,EME,,,,144: 4x 15el KLM,05/06 +I2SVA,JN45,,,,,,01/02 +I2UZV,JN45,,,,,,08/02 +I3DLI,JN65,EME,,,,6x19el 8877 CF379,11/00 +I3LDP,JN55LK,EME,,,,FT-736R + 144 Ampl with 2x4CX250B,04/08 +I3LDS,JN55SR,,,,,,01/90 +I3LGP,JN55WJ,,,,,144: IC746 100W 17el BF960,01/04 +I3LLH,JN65BM,,,,,,04/00 +I3MEK,JN55SJ,EME,,,,,08/07 +I4LCK,JN54RK,,,,,432: FT736 3CX800 Preamp 4x25el LY @ 950m asl (portable: /4 JN54PD),02/08 +I4RHP,JN54QL,,,,,144: TS711+PA500W 17EL,07/04 +I4TTZ,JN54VJ,,,,,,01/03 +I4XCC,JN63GV,EME,,,,144: 4x17el F9FT 3CX800A7 preamp 1db,06/09 +I4YNO,JN54KP,,,,,144: FT-736R MuTek MGF1302 3CX800 20el Shark,08/03 +I5CTE,JN53XG,EME,,,,,02/01 +I5MPK,JN53,EME,,,,,01/94 +I5MXX,JN53JU,,,,,144: 4x4el & 4x9el,10/00 +I5MZY,JN53OT,EME,,,,144: 800W 4x10el BF998,10/04 +I5PPD,JN53PS,EME,,,,10368: 3m Dish 20W,10/00 +I5PPE,JN53NS,,,,,,01/03 +I5TWK,JN53FU,EME,,EX I8TWK,,,02/08 +I5WBE,JN53JR,EME,,,,144: FT736R 4x17el 8877 MGF1302 432: Yeasu FT 847 GS35b 4x26el 1296: LT23S 4x35 el 100W,03/08 +I5YDI,JN54BB,EME,,,,144: FT736 3cx800 2x17el or 4x15el,04/02 +I6BQI,JN72AK,EME,,,,144: 4x16jxx TS2000 8877PA,03/06 +I6PNN,JN72GL,EME,,,,,01/94 +I6QGA,JN63,EME,,,,,01/94 +I6QON,JN63RL,,,,,,01/94 +I6WJB,JN72CK,EME,,,,144: 4x 16el 1 Kw MGF1302,05/05 +I6YPK,JN72,,,,,,01/95 +I7CSB,JN71QQ,,,I2CSB,,TS790-FT847-IC756PROIII,05/08 +I7FNW,JN81GD,EME,,,,,01/94 +I7HCB,JN71VT,,,,,144: 150W 13el,12/01 +I7RNI,JN80,,,,,,01/93 +I8JIT,JN71HN,,,,,,08/08 +I8KPV,JN70KO,EME,,,,,12/06 +I8MPO,JN70FP,,,,,IC746PRO Henry Radio 2002A 13el yagi Landwehr 145MAS 186m asl,09/07 +I8REK,JN70,,,SilentKey,,,01/93 +I8TUS,JM89DE,,,,,,10/04 +I8UZA,JN70AU,,,,,144: FT847 150W 10el BVO3wl,09/02 +I8WES,JN70,,,,,,01/93 +IB0CW,JN60RS,,,EXPEDITION,,144: 250W 12 el Yagi,06/08 +IC8CQF,JN70CN,,,,,50: 100W 4el Yagi - 144: 300W 10el 3wl 9BV,08/05 +IC8EGJ,JN70CN,,,,,,01/89 +IC8FAX,JN70CN,,,ex IW8BZN,,144: FT736r 300W 20el,03/04 +IC8TEM,JN70CN,EME,,,,TS2000 - TS680 - HF VHF - 50mhz 2EL DK7ZB - 144mhz 20el shark - hf vertical gp,07/07 +IH9YMC,JM56XT,,,,,,08/04 +II0W,JN51,,,QSL via IW0BET,,,06/03 +IK0FEC,JN63,,,,,,01/93 +IK0FIY,JN61GW,EME,,,,FT736r 144: 6el 800W MGF1302 - 432: 33el 600W MGF1302,01/00 +IK0FTA,JN61GV,,,,,50: TS680 GaasFet 6el,05/02 +IK0IXI,JN52VB,,,,,Homemade xvtrs for 6m & 4m,06/08 +IK0IXO,JN52WA,EME,,,,,01/93 +IK0OKY,JN61ES,,,,,50: loop quad fractal 100W - 144: 50 w jpole,06/09 +IK0OZK,JN52VC,EME,,,,350W- 2x17el- Preamp,12/99 +IK0PCJ,JN63CL,,,,,,01/03 +IK0RNL,JN61GW,,,,,,01/03 +IK0SMG,JN61ER,EME,,,,,07/06 +IK0SOI,JN62HN,,,,,,06/02 +IK0VKL,JN61GV,,,IW0DRT,,,04/07 +IK0VMO,JN62LH,EME,,,,144: 4x 9el 500W,10/06 +IK0WGF,JN52VC,,,EX IW0DAL,,144: 2x11el 200W,04/07 +IK0XIH,JN61KM,EME,,IW0CQX,,Kenwood TS-2000,06/09 +IK1DPA,JN33VT,,,,,YAESU FT-897D - ant: for 6m 5el F9FT - HF: HyGain DX-88,09/08 +IK1EFM,JN44JK,,,,,,01/93 +IK1EGC,JN35UF,,,,,50: FT650 3-500z 6el 1wl- 144: IC275 16el 4.4wl 4cx250 MGF1302,07/02 +IK1FJI,JN44LL,EME,,,,144: 4x 12el M2 GU78b LNA CA144T PHEMT preamp,08/08 +IK1GYZ,JN35TB,,,,,,11/95 +IK1HJQ,JN33,,,,,,01/90 +IK1HWG,JN44DS,EME,,,,,01/94 +IK1JXY,JN44WC,EME,,,,,08/04 +IK1LBW,JN44VC,,,,,,08/98 +IK1LGV,JN44JK,,,,,144: GS31 MGF1302 15el QD,08/00 +IK1LUT,JN34TW,,,,,,01/93 +IK1MTZ,JN35UB,EME,,,,,08/01 +IK1PAG,JN35SB,,,,,144: IC275h 1KW 2x17el F9FT MGF1302,02/08 +IK1RQT,JN34VP,,,,,,12/01 +IK1SLI,JN35UI,,,,,,01/93 +IK1SPR,JN34TQ,,,,,144: Braun SE400 500W MGF1302 2x 13el,08/05 +IK1UWL,JN33VT,EME,,,,144: 4x 14XPol 700W (1400W in circular pol.),01/08 +IK1YWB,JN34UX,,,,,,04/02 +IK2CDI,JN55GN,EME,,,,144: IC275H 3CX800A7 MGF1302 4x18el,01/00 +IK2CFR,JN54,,,,,,03/01 +IK2DDR,JN55GN,EME,,,,144: IC275H 8877 MGF1302 4x19el LY,01/06 +IK2EAD,JN55EJ,EME,,,,,01/94 +IK2EAE,JN45LL,,,,,144: FT480r 100W 17el,11/01 +IK2FIL,JN45OM,,,,,144: IC275H 9 el. F9FT + SP2000 50W,11/04 +IK2GSO,JN45NP,EME,,ex K2GSO,,IC7400 FT857 50: 1KW 10el 144: 14el DJ9BV,03/05 +IK2JUB,JN45ON,,,,,,03/05 +IK2LHP,JN45SP,,,,,144: TS790 200W 15el - 432: 100W 31el,07/01 +IK2MMB,JN45,EME,,,,,02/05 +IK2OFO,JN45KL,EME,,,,144: 4x17el 8877 - 432: 8x21el 3CX800A7 - 1296: 2m dish 2x7289,09/00 +IK2RTI,JN55AD,,,,,,01/03 +IK2TPX,JN45LL,EME,,,,,01/93 +IK2XRL,JN45NR,,,,,144: FT736r 150W 17el Preamp,01/01 +IK2YXK,JN45OP,,,,,144: IC275h 4CX250 12elM2 DSP59,05/02 +IK3MAC,JN55SH,EME,,,,144: 1100W 24 x 23el LLY + 24x 10el yagi Vert,09/05 +IK3TPP,JN65EP,,,,,,12/04 +IK3VZO,JN55XA,,,,,144: 16el 200W,02/98 +IK4DCO,JN64GB,EME,,,,,01/94 +IK4DCX,JN64GA,EME,,,,144: 4x20el 2.5KW,04/01 +IK4DRY,JN64BL,,,,,,04/01 +IK4FMT,JN54WG,,,,,144: TS790 2M5WL 4CX250 MGF1302 20dB,01/00 +IK4JOC,JN54WN,EME,,,,,01/94 +IK4NMF,JN54SM,EME,,,,,01/94 +IK4PLU,JN64FC,,,EX IW4ASW,,,10/07 +IK4PMB,JN54MM,EME,,IW4CET,,50: X-Verter 10W Dipole - 70: OZ X-VERTER 3el DK7ZB - 144: FT225RD MUTEK or TS850+X-Verter 8877 11el F9FT 14XP WiMo,10/07 +IK4WLV,JN54XK,EME,,,,,02/98 +IK5AMB,JN53FU,,,,,,11/98 +IK5JWQ,JN52NS,EME,,,,,08/98 +IK5OEA,JN53PG,,,,,,12/04 +IK5OIY,JN52NT,,,,,,03/96 +IK5QLO,JN53FU,,,,,,04/08 +IK5WJD,JN53PR,EME,,,,432: 4 x 26 elements Yagi hor Pol. - LNA 0.25 dB NF - 8877 1 KW PA - 1296: Septum Feed Cavity LNA 0.35 dB NF 3 meters solid Dish,07/06 +IK5ZUI,JN53RD,,,,,144: TS700G 11el 250W BF981,07/97 +IK6EIW,JN63RJ,EME,,,,,10/95 +IK6FHF,JN63,,,,,,01/93 +IK6IHM,JN72,,,,,,01/95 +IK6MLI,JN62UT,,,,,144: FT736 4x11el KLM Booster 8930,07/99 +IK6MMJ,JN63RL,,,,,,10/95 +IK6WDY,JN62XK,,,,,kenwood ts 790e ant. 2el quad,05/08 +IK7EZN,JN90DG,EME,,,,144: 4x 16el JXX 1 KW,04/05 +IK7UXY,JN90DC,EME,,IW7BPW,,IC-756PRO2/Xverter h.m./16jxx/8877,06/09 +IK7XLW,JN80FT,EME,,,,144: 16JXX 250W,03/06 +IK8BIZ,JN70GR,,,,,,08/08 +IK8ETN,JM89CH,,,,,144: ic275e 4x150 17f9ft,01/04 +IK8IUQ,JN70MM,,,,,,01/03 +IK8MKK,JN71DC,,,,,,01/95 +IK8TOY,JM89CH,,,,,,08/04 +IK8XLD,JN70VP,EME,,,,144: 11el GaasFet,09/00 +IK8YOQ,JN70GR,,,,,,04/09 +IK0BZY,JN61GW,,,,,07/09 +IK0BZY/MM,JN50AX,,,,,07/09 +IK0BZY/P,JN62GA,,,,,07/09 +IN3AGI,JN56,,,,,,01/03 +IN3ATM,JN56NK,,,,,,01/02 +IN3DOV,JN65WS,,,,,,01/93 +IN3FFN,JN56,EME,, +IN3KLQ,JN56RG,EME,,,,144: 180W 17el,04/00 +IQ2CJ,JN45ON,,,,,IC 275H - GS35 - 2 x 13 DJ9BV,03/05 +IQ3AZ,JN65QQ,EME,,,,144: 4x 8el 800W,10/08 +IQ4DF,JN45,EME,,,,,10/05 +IS0/DF2ZC,JN40TJ,EME,,EXPEDITION,,144: TS2000 2x 9 ele M2 2x GU74b by LZ2US,03/09 +IS0/DH7FB,JN40TJ,EME,,EXPEDITION,,144: TS2000 2x 9 ele M2 2x GU74b by LZ2US,03/09 +IS0AGY,JM49OF,,,,,144: IC211E 4CX350b 17el Gaas,07/05 +IS0BDB,JN40GT,,,,,,05/04 +IS0CAK,JM49,,,,,,01/04 +IS0CBC,JM49NH,,,IW0ULG,,,04/07 +IS0EBO,JN40GR,EME,,ex IW0UEI,,144: Icom gs35 3wl ant,03/06 +IS0GQX,JM49OH,,,,,,05/05 +IS0SWW,JN40GR,,,,,,02/04 +IT9BLB,JM68QE,,,ex IW9AJZ,,144: 2x15el 3CX800 MGF1302,08/06 +IT9CHU,JM76IV,EME,,,,,01/09 +IT9CJC,JM76IW,EME,,,,IC706MKIIG 120W 10EL DK7ZB - EME SETUP 4X10 8877 MGF4919G,06/09 +IT9GSF,JM67SS,,,,,,01/94 +IT9GSV,JM77LH,,,,,,04/01 +IT9IPQ,JM78SG,EME,,,,ic756pro ic275 ic475 transv,04/02 +IT9LCY,JM77NO,,,,,,01/93 +IT9TYR,JM78QF,EME,,IW9CER,,IC 756 pro II - Knw TS790 E - IC 706 MKII,04/09 +IV3BBR,JN65TW,,,,,,04/07 +IV3CYT,JN65TW,,,,,,06/09 +IV3DXW,JN65QQ,,,,,144: 4CX250 - 16JXX2 4.5WL,08/03 +IV3GBO,JN66OA,EME,,,,,01/02 +IV3GTH,JN65RU,EME,,,,50: FT897 5/8 vertical - 144 MHz: FT897 160W 16 el F9FT,06/07 +IV3HWT,JN65ST,EME,,,,144: FT101zd Trvt 8877 4x18el 4x20el,08/04 +IV3KTY,JN65QQ,,,,,,04/07 +IV3MPI,JN65SV,,,EX IW3QMB,,IC746 IC271E Mutek FT736R PHEMT144 PHEMT: 50: 2x 6el 9BV 500W - 144: 4x12el 6WU 500W - 432: 4x21el F9FT,03/06 +IV3NDC,JN65RV,,,,,144: 100W BF981 2x15el 3.3wl,04/07 +IV3SIX,JN65RU,,,EX IW3QYG IW3RI,,50: 6el/HyGain 144: 4x17el 432: 4x21el,05/07 +IV3VFP,JN66HD,EME,,,,,01/93 +IV3ZCX,JN65QS,EME,,,,144: Icom 275 PA 600Watts MGF1302 4x24el,01/90 +IW0AKA,JN61FS,,,,,,01/90 +IW0AYO,JN61IU,,,,,144: 16el,07/96 +IW0BTS,JN61GU,,,,,,01/88 +IW0BZD,JN61FS,,,,,,10/07 +IW0CUT,JN61TP,EME,,,,,01/93 +IW0CVK,JN61GV,,,,,,01/05 +IW0DJB,JN61,,,,,,04/02 +IW0DVG,JN61KK,,,,,,01/93 +IW0FFK,JN61FS,,,,,,04/07 +IW0GDC,JN61HX,,,,,,10/98 +IW0HLE,JN61WK,,,,,,08/08 +IW0QNX,JN62,,,,,,01/97 +IW0QO,JN63EC,,,,,,01/93 +IW0RBS,JN63FD,,,,,,01/93 +IW0RLC,JN63FD,,,,,,06/00 +IW1ARB,JN44CV,EME,,,,144: 4x4.4Wl lt2s 3cx1500,03/01 +IW1AZJ,JN35UB,,,,,144: 200W 3.8wl DJ9BV,06/00 +IW1BCV,JN44FS,EME,,,,144: IC275H 2x18el MGF1302 8877,08/08 +IW1CGB,JN35VG,EME,,,,50: 3el PA - 144: 4x17el 2x4cx250b MGF1302,06/97 +IW1CHX,JN35TH,,,,,144: C58 13el DJ9BV MGF1302 170W,04/02 +IW1DIM,JN35TC,,,,,,07/01 +IW1DJS,JN35SA,,,,,,08/01 +IW1FTY,JN35UA,,,,,,01/03 +IW1GLM,JN34PT,,,,,,08/08 +IW2BNA,JN45ON,,,,,144: IC275H 3CX800 4x11el - 432: IC475H 8930 23ele - 1296: IC1275 2C39 4x23ele,01/04 +IW2BSQ,JN45UJ,,,,,144: IC746 !7el,04/03 +IW2BZY,JN45NN,,,,,144: 500Watts 2x12ele Flexa,08/01 +IW2DAL,JN45NN,,,,,144: TenTec OII - TR144H +40 - 4x19LLY 4CX1000a,06/08 +IW2DMN,JN45KL,,,,,144: 100W 15el,10/02 +IW2DUA,JN45LL,EME,,,,,01/93 +IW2FZR,JN45WE,EME,,,,144: 9el 500W,06/09 +IW2FZR/P,JN56AE,EME,,JN56BE FOR EME,,1296: 4 mt dish VE4MA th308 400 W at feed/ 144 9el 500W,06/09 +IW2HAJ,JN45NO,,,,,50: IC706 6el - 144: IC 275H + GS35B 2X13 EL Preamp,09/08 +IW2HUS,JN45NO,,,,,,04/02 +IW2HWQ,JN55GK,,,,,144: FT736r 80W 21el,10/96 +IW2LLA,JN55AM,,,,,144: 2x17el 100W,08/96 +IW2MYV,JN45JN,,,,,144: TS711E 4CX250 GaAs 4x7el + elv.,01/02 +IW2NEF,JN46QD,,,,,144: FT847 12elXY,11/02 +IW2NOR,JN45ON,,,,,ICOM IC275H KENWOOD TS 2000 144: 100W 2x17el F9FT,06/04 +IW3BKQ,JN56NH,,,,,,07/02 +IW3HRT,JN55TG,,,,,,08/08 +IW3QTG,JN65PT,,,,,144: IC746 2x 17FT,08/04 +IW3SGT,JN65VP,,,,,,05/07 +IW3SNU,JN65OT,,,,,,11/04 +IW4ADT,JN54,EME,,,,,01/94 +IW4AR,JN64FD,,,,,,01/03 +IW4ARD,JN64FD,EME,,,,144: IC756PRO3 TXV-DB6NT 3CPX1500A7 4x8XP pre PHEMT full elevation 432: TS-2000X GS23B 4x18el pre PHEMT full elevation,01/09 +IW4AZY,JN54ML,,,,,IC275 ft817 ic706 hm xverter 2 x 20 yagi many other depending location,04/07 +IW4BET,JN54QL,,,,,,08/02 +IW4BLG,JN54VF,EME,,,,144: 4x10el k5gw 900w,01/04 +IW4BTJ,JN54QL,,,,,,01/03 +IW4CB,JN54XK,,,,,,02/01 +IW4DJE,JN64,,,,,,01/95 +IW4DLA,JN64CE,,,,,,01/94 +IW4DMH,JN64CJ,,,,,,11/98 +IW4DQY,JN64AG,,,,,,03/04 +IW4EHV,JN64AE,EME,,,,IC7400 144: 16el 432: 21el,11/07 +IW4EHZ,JN54ML,EME,,ex IW4BTE,,IC706MKIIG 20EL70CM 12EL2MT 6EL6MT,03/05 +IW4EJK,JN54ML,,,,,ICOM IC910 - 144: 2X CROSS YAGI 10EL - 432. 2X CROSS YAGI 19EL,04/08 +IW5ACZ,JN53HP,,,,,50: TS2000 HB9CV 144: TR751E 4CX250 250 WATT 12el,10/04 +IW5BLG,JN54VF,,,,,,01/03 +IW5BML,JN52JW,EME,,,,,04/99 +IW5BPE,JN52NT,,,,,,01/93 +IW5DHN,JN53GI,EME,,,,TS2000 4x 7el,04/06 +IW5DNZ,JN53,,,,,,05/02 +IW5EJM,JN53HA,,,,,,08/08 +IW5EKJ,JN54AA,EME,,EX IW1CCH,,144: IC-756 PRO2 TRSV GS31 or 3CX800,09/07 +IW6AEG,JN63RO,,,,,,10/93 +IW6BLH,JN63RO,,,,,,12/00 +IW6BNO,JN63RL,,,,,,11/95 +IW7DEC,JN81GF,,,,,144: 12db yagi 100W Preamp,08/04 +IW8QOT,JM88BR,,,,,,01/03 +IW9ELR,JM68PD,,,,,,11/02 +IW9FRA,JM68GA,,,,,,01/05 +IY1GMN,JN33VT,EME,,SPECIALCALL,,,06/09 +IZ0ARL,JN61IU,,,,,144: 200W 16el,10/96 +IZ0AYB,JN52VC,EME,,,,IC-910H 144: 4x12JXX - 432: 2x19 Tonna,05/04 +IZ0CVK,JN61GV,,,ex IW0CVK,,YAESU FT767mod YAESU FT221R mod 2x8el DJ9BV 4CX250 MGF1801,09/06 +IZ0FWE,JN62IQ,,,,,,08/08 +IZ0GYP,JN61GT,EME,,,,144: 9el 250W,11/06 +IZ1ANZ,JN45FH,,,,,,05/07 +IZ1BPN,JN34OT,EME,,ex IW1CGB,,144: 150W 9el dj9bv MGF1801 50: TS680 3el,03/06 +IZ1DBY,JN45FW,,,IW1FRO,,Icom IC706mk2g Yaesu FT847 FT817,06/07 +IZ1DXS,JN35UA,,,ex IW1FTY,,ICOM IC-7400 (746 PRO) - 50: 6el - 144: 14el,11/02 +IZ1EGT,JN44LK,,,ex IW1RDT,,IC910 100W 2.5 Wl ant,02/05 +IZ1ESM,JN45FB,,,ex IW1ESM,,KWD TS850 + LT2S MK2 + 4.4wl BV,09/02 +IZ1MKR,JN44FH,EME,,,,,01/09 +IZ2AAJ,JN45,,,,,,12/99 +IZ2DJP,JN55FO,,,,,,05/04 +IZ2EEQ,JN45,,,,,,07/02 +IZ2FOB,JN45MQ,,,ex IW2DVK,,50:5w dipole 144:150W 2x9ft MGF1302 432:4x21 ft-MGF1302-GS35b 1296:xverter50w-35ft,05/05 +IZ2GOL,JN45OL,,,ex IW2LC,,ICOM IC-761 IC-756 IC-275H YAESU FT-897 FT-847 FT-817 KENWOOD TS-480HX TS-790E,03/05 +IZ3KGJ,JN65IN,EME,,,,144: 2x 19el LLY,01/09 +IZ4AIK,JN63HV,,,ex IW4CYM,,50: 100W 5el - 144: TS790 3CX800A7 TS850 & Trvt MGF1302 17el,07/01 +IZ4BEH,JN54WL,,,,,144: 1KW 2x16el MGF2407 - 432: 2x21el 300W - 1296: 57el loop 60W - 2320: 53el loop 20W,10/02 +IZ4BEJ,JN64CE,,,ex IW4DCT,,144: 2x13el gd Pwr,11/97 +IZ4GWE,JN64BL,,,EX IW4EOQ,,,12/07 +IZ5BXF,JN53GV,EME,,ex IW5DRA,,300W- 4x11el 2.2wl- 0.3dbNF,01/01 +IZ5EME,JN52NS,EME,,ex IW5AVM,,144: 4x20el 8877 - 432: 4x25el 3CX800 - 1296: TH338 4x55ft,04/01 +IZ5GNS,JN53CX,EME,,ex IW5CNS,,144: IC275H 4x10el 2.2wl 9BV 8877 MGF1302,08/05 +IZ5MAO,JN54AA,EME,,IW5EKJ,,Transverters-GS35-2x4cx250r-2x9dk7zb-4x25jxx70,09/07 +IZ8AZB,JN70EP,EME,,ex IW8CVV,,144: 4x11el 8930(400W),01/02 +IZ8DWL,JM88BR,,,ex IW8QOT,,144: IC-746 PA 4CX250 16JXX LY MGF1302,04/04 +IZ8IBB,JN70FP,,,,,,08/08 +IZ8IFV,JN70KO,,,,,,08/08 +J44XG,KM19KE,,,EXPEDITION,,,09/07 +J45M,KM46CF,EME,,Expedition,,144: FT100 FT847 IC706 DSP59/Datong audiofilters 3CX800 4x10ele X-pol 3wl MGF1302 NF 0.3dB,06/01 +J48PL,KN20IN,,,Expedition,,,07/06 +J79MY,FK95,EME,,,,4x Yagi- 1.5KW,06/98 +JA0BBW,PM97LV,EME,,,,144: 4x 13el 150W,10/07 +JA0BLU,PM97OS,EME,,,,144: 1KW 4x19el 2x18el MGF1801,01/00 +JA0VI,PM95,EME,,,,,01/03 +JA1DXA,PM95VU,,,,,,01/03 +JA1RJU,QM06CB,EME,,,,50: 2x 14el 1KW - 144: 2x 14el 50W,12/06 +JA1VZV,PM95QL,,,,,,01/03 +JA2HMO,PM85IH,,,,,,01/03 +JA2JRJ,PM84MW,EME,,,,,01/00 +JA2KRW,PM85NE,EME,,,,,01/03 +JA2TY,PM84GS,EME,,,,,01/03 +JA3BXC,PM74SU,,,,,,01/03 +JA3IAF,PM74,EME,,,,,01/03 +JA3SGR,PM74TU,EME,,,,,01/03 +JA4BLC,PM65NM,EME,,,,2320: 6m dish 300W,04/06 +JA4CMZ,PM65MI,EME,,,,,01/03 +JA4KLX,PM95RI,,,,,,01/03 +JA5NNS,PM63,EME,,,,,01/03 +JA5OVU,PM74FC,EME,,,,,01/03 +JA5YJS,PM63,EME,,,,,01/03 +JA6AHB,PM53CP,EME,,,,432: 7m Dish 1KW,11/05 +JA6CZD,PM53FM,EME,,,,2320: 5m dish 150W,04/06 +JA6DZI,PM53GM,EME,,,,,01/03 +JA6XED,PM53,EME,,,,,01/03 +JA6ZHR,PM53,EME,,,,,01/03 +JA7BJP,QM07GN,,,,,,01/03 +JA7BMB,PM97WM,EME,,,,,01/03 +JA7JJN,PM95RQ,EME,,,,,04/09 +JA8ERE,QN02QX,EME,,,,2320: 6m dish 180W,04/06 +JA8IAD,QN03,EME,,,,2320: 5m dish 180W,04/06 +JA8PL,QN03,EME,,,,,01/03 +JA9BOH,PM86FA,EME,,,,144: 4 x 2.8 mt,04/04 +JD1BLY,QL17CC,EME,,EXPEDITION,,,01/08 +JD1BMP,QL17CC,EME,,EXPEDITION,,,01/08 +JE1KFX,QM06IR,EME,,,,144: 4x 18el 500W,05/05 +JE1TNL,PM95PH,EME,,,,2m IC910D+GU74B 4x13ele 70cm IC910D+3CX800A7 4x20ele,08/08 +JE2XBY,PM84MS,EME,,,,,03/05 +JE5FLM,PM74AH,EME,,,,144: 2x 13el Vert 50W,10/06 +JF3HUC,PM74UX,EME,,,,,01/03 +JF3IPR,PM74,,,,,,01/03 +JG2BRI,PM84LW,EME,,,,,04/05 +JH0ISW,PM97LO,,,,,,01/03 +JH0MHE,PM96HI,EME,,,,144: 4x 18el M2 500W,12/05 +JH0QBI,PM97FF,,,,,,01/03 +JH0WJF,PM86,EME,,,,,12/07 +JH0YSI,PM85VJ,EME,,,,,03/01 +JH1EFA,PM96UB,EME,,,,,01/03 +JH1KRC,QM06AW,EME,,,,PO 500 watts exc. 3cm 300 watts 4.4m dish,03/06 +JH1OFX,PM85SM,EME,,,,,01/03 +JH1OQW,PM95UX,,,,,,01/03 +JH1SWD,QM06HN,,,,,,01/03 +JH1XUJ,PM95UR,EME,,,,,01/03 +JH2COZ,PM49NW,EME,,,,144: IC821 4x14el 3.6wl ITT-4651 tube 3SK129 Preamp,09/06 +JH2OJS,PM85LD,,,,,,01/03 +JH3EAO,PM74KR,EME,,,,,01/03 +JH3VJV,PM74LP,,,,,,01/03 +JH4JLV,PM54LA,EME,,,,,01/03 +JH5FOQ,PM63JS,EME,,,,144: 4x 28 Xpol 1KW,08/06 +JH5LUZ,PM63FK,EME,,,,,01/03 +JH6RTO,PM53FA,,,,,,01/03 +JH7PAV,QM07DI,EME,,,,,01/03 +JH7SIA,QM09EN,,,,,,01/03 +JH8CMZ,QN12MN,EME,,,,144: 2x 13el 500W,11/08 +JH9TJT,PM86HK,EME,,,,144: 2x 11el V 50W,11/06 +JI1FLB,PM95WS,,,,,,01/03 +JI1MNT,PM95QH,,,,,TS-870S,03/09 +JI1NJC,QM06FL,,,,,,01/03 +JI3GER,PM75XA,EME,,,,,01/03 +JI4POR,PM65NK,,,,,,01/03 +JJ1NNJ,QM06GH,EME,,,,,01/03 +JJ1VOM,PM95,,,,,,01/03 +JJ3JHP,PM75XD,EME,,,,144: 2x 11el,11/06 +JK1HIX,PM95WH,EME,,,,4x17el 8877,03/99 +JK1KTY,QM05DK,EME,,,,144: 2x15 2.75wl 200W,01/06 +JK1LYP,PM95,,,,,,01/03 +JK1XDX,PM95,,,,,,01/03 +JK7IKU,QM09BR,,,,,,01/03 +JL1ZCG,PM59UM,EME,,,,TS790 4CX1500A 16x 2.5WL V-POL YAGIS,03/99 +JM1GSH,QM06IS,EME,,,,144: 4x 11el 500w,04/05 +JM1LQW,PM96QA,,,,,,01/03 +JM1MQE,PM95RP,,,,,,01/03 +JM1SZY,PM95SO,EME,,,,,08/05 +JM1WBB,QM05DX,EME,,,,144: IC-910D 2 x GU74B 4 x 2M32XP 432: IC-910D 50W 2X720,08/08 +JN1BMX,QM06FM,,,,,,01/03 +JN1CSO,PM95SW,EME,,,,144: 12x 15el H/V 2000W,01/03 +JN1JFC,QM06AD,EME,,,,,03/08 +JN4FNZ,PM54QD,EME,,,,144: 2x 13el 800W,01/90 +JO1LVZ,PM95RT,EME,,,,144: 4x 9el 50W,05/06 +JO3FUO,PM74RT,,,,,,06/07 +JO3JJN,PM85AC,EME,,,,,01/03 +JO3RNL,PM74TT,EME,,,,,01/03 +JR1EDE,PM95TG,EME,,,,10368: 1.8m Dish 40W,02/01 +JR1EUX,PM95TO,EME,,,,,01/03 +JR1RCH,PM96SI,EME,,,,,01/03 +JR2HCB,PM85NC,EME,,,,50: 2x 10el,04/05 +JR3REX,PM74LQ,,,,,,01/03 +JR4AEP,PM65RH,EME,,,,,01/03 +JR4BRS,PM65,EME,,,,,01/03 +JR5JXV,PM86XG,,,,,,01/03 +JR5UOY,PM64XF,,,,,,01/03 +JR6EXN,PM53FH,EME,,,,50: 4x 8el Yagi.full elev. Homebrew 1000W,01/09 +JR6LDE,PM53FS,,,,,144: 12el 50W,06/06 +JR7VXF,QM09AK,,,,,,01/03 +JR9NWC,PM85BW,EME,,,,,01/03 +JS3CTQ,PM74UN,EME,,,,144: 4x 11el 500W,05/06 +JS3SIM,PM74VW,EME,,,,,01/03 +JW5E,JQ78QF,EME,,,,144: 2 x 10Xpol 800w,02/08 +JX7DFA,IQ50OV,EME,,QSL via LA7DFA,,TS2000,08/00 +K0AWU,EN37ED,EME,,,,144: 800w 1x 4wl 13el Yagi,11/06 +K0AZ,EM37CD,,,,,144: 800Watts 17B2,09/01 +K0BLR,EN25UO,,,,,,01/03 +K0CB,EM27,,,,,,01/03 +K0CIO,EM07,,,,,,01/03 +K0CJ,EN34IS,,,,,,01/03 +K0CQ,EN32EC,,,,,,01/03 +K0CXJ,EN26,,,,,,01/03 +K0DAS,EN42,EME,,,,,01/03 +K0FF,EM49HO,,,,,50: 1-5KW 7el or 4x6el - 144: 1-5KW 2x17el M2 or 4x17el,01/01 +K0FQA,EN35FE,,,,,,01/03 +K0FZG,EN36,,,,,,01/03 +K0GCJ,EN43,,,,,,01/03 +K0GEI,EM49,,,,,,01/03 +K0GRM,DN96OT,,,,,,01/03 +K0GU,DN70MQ,EME,,,,144: FT1000DEM 8877 4x17elB2 SSB Preamp,01/01 +K0HH,EM48,,,,,,01/03 +K0HU,EN10,,,,,,09/99 +K0HWE,EN41BX,,,,,,01/03 +K0IDC,EN12TL,,,,,,01/04 +K0IDT,EN10PS,,,,,,01/03 +K0IK,EN34JR,,,,,,01/04 +K0ILC,EN36,,,,,,01/03 +K0IR,EN25,,,,,,01/03 +K0JO,EN34,,,,,,01/03 +K0KE,DM79,,,,,,01/03 +K0KFC,EN34,,,,,,01/03 +K0KJX,EM48,,,,,,01/03 +K0KP,EN36VW,EME,,,,50M:7 ele 100 144: 5WL 1.5 KW,10/07 +K0KQY,DM98,,,,,,08/00 +K0LGI,EN42,,,,,,01/03 +K0LLS,EM29,,,,,,01/03 +K0MQS,EN31UH,,,,,,01/03 +K0NG,EN10,,,,,,01/03 +K0NL,EM48MK,,,,,,01/03 +K0NY,EN44DB,,,,,,01/03 +K0OG,EM47CW,,,,,FT100D 50: 100W G5RV 144: 50W 3el beam,10/06 +K0PFX,EM48SR,,,,,,01/03 +K0PG,EN61AU,,,,,,01/03 +K0PJ,EN34,,,,,,01/03 +K0PS,DM59VG,,,,,,01/04 +K0PW,EN34CV,EME,,ex NJ0M,,144: 1.5KW 2x17el 5lb MGF1302,09/01 +K0RDF,EM29,,,,,,01/03 +K0RI,DM78PX,EME,,,,144: 1x 17el KW,06/05 +K0RL,EM49HU,,,,,,01/03 +K0RP,DM88AD,,,,,50: 150W - 144: 150W - 222: 110W - 432: 110W - 1296: 10W,01/01 +K0RRY,EN36,,,,,,01/03 +K0RZ,DM79JX,,,,,,01/03 +K0SDH,EN34JS,,,,,,01/03 +K0SE,EN34,,,,,,01/03 +K0SHF,EN34JV,,,,,,01/03 +K0SM,EN10RT,,,,,144: 160W Preamp 13B2,01/01 +K0SQ,EN35,,,,,,01/03 +K0TAR,EN34,,,,,,01/03 +K0VM,EN42,,,,,,01/03 +K0VSV,EN41LK,,,,,50: 8W 5el - 144: 170W 12el,01/98 +K0WLU,EN13XS,,,,,,01/03 +K0XP,FN31,,,ex KO0U/1,,144: 350W 3219 - 222: 450W KLM16,01/02 +K0XXX,EM46FF,,,KD5LUN,,IC-746 FT-736R,05/07 +K0YW,DM67ED,EME,,,,,03/06 +K0ZPO,EM15,,,,,,01/03 +K1ABC,FN42,EME,, +K1DS,FN20JE,EME,,,,144: 10el 120W,07/06 +K1FO,FN31QJ,EME,,,,,01/03 +K1IM,FN31WX,,,,,,01/03 +K1JT,FN20QI,EME,,,,144: 4x 14XP 1KW,01/08 +K1MS,FN42,,,,,144: 1KW 2x M2 5wl,01/01 +K1OR,FN42IR,EME,,,,144: 4x 13el no elevation 1500W - 432: 1500W,02/08 +K1OYB,FN43TP,,,,,,01/03 +K1POP,FN51,,,,,,01/03 +K1RC,FN42HQ,,,,,,01/03 +K1RO,FN31,,,,,,01/03 +K1RQG,FN54LM,EME,,,,,04/05 +K1RS,EN53wb,EME,, +K1RZ,FM19JH,,,,,,01/03 +K1SG,FN42FE,EME,,WA1AYS,,50 MHz: IC756PRO 3-1000Z Terrestrial: 2 x M2 6M2.5WLC EME: 4 x 6M5X w/full elevation.,09/07 +K1TEO,FN31,,,ex WA2TEO,,144: 800W 4x12el - 222: 500W 2x23el,01/01 +K1TR,FN42IU,,,WA1OAM,,,05/07 +K1UHF,FN31FH,EME,,ex KD1DU,,144: 1-5KW 4x12el - 222: 500W,01/01 +K1VOW,DM25VF,,,,,,01/03 +K1ZE,FN41,,,ex WA1HYN,,144: 300W 2x4218 - 222: 60W 220B - 432: 400W 2xK2RIW,01/98 +K2AAX,FN12CS,EME,,ex KA2RDO,,144: 4x 9el 400,11/05 +K2AH,FN20,EME,,,,,01/03 +K2AXX,FN12CS,EME,,,,144: TS-930S Transverters 4x 9el 400W - 432: TS-830S Transverters,11/05 +K2BLA,EL99IA,EME,,,,144: 400W 8x 2.5WL,04/05 +K2DH,FN13FB,EME,,,,,01/08 +K2DRH,EN41VR,EME,,ex KA2DRH,,144: 2x 18el 1KW,03/07 +K2DRM,EN41VR,EME,,,,144: 2x 18el 1KW,06/06 +K2EVW,EM96SS,,,,,,01/03 +K2GAL,FM29PH,EME,,,,,01/98 +K2LME,FN31UI,EME,,,,,10/98 +K2OS,FN13CD,EME,,,,,12/00 +K2OVS,FN30,,,,,50: 250W 6el - 144: 200W single yagi - 432: 60W single yagi,01/01 +K2PGB,FN20,,,,,50: TS680S 10W 3el - 144: IC251A 80W 13B2,01/01 +K2STO,EL88PH,,,,,,01/03 +K2TXB,FM29PT,EME,,,,144: 2x KLM 16LBX 28,04/05 +K2UYH,FN20QG,EME,,,,432: 28 dish 1KW,09/05 +K2VEE,EM79WP,,,,,,01/03 +K2WKA,FN20RF,,,,,,01/03 +K2YAZ,EN74AV,,,,,,01/03 +K2ZD,FN21NR,EME,,,,50: 7el QRO,12/07 +K3ACE,FM29DR,,,,,,01/03 +K3AX,FN20,EME,,,,,01/00 +K3BFA,FN10XI,,,,,144: 1-5KW 4x15el,01/01 +K3CB,FM18VR,EME,,K6LEW,,Orion,02/09 +K3DJC,FM19LL,,,,,,01/03 +K3EAR,FM19HX,,,,,,01/03 +K3EOD,FM29LL,,,,,,09/06 +K3FOR,FM19SB,EME,,,,,01/03 +K3FU,FM18,,,,,,01/03 +K3GNC,FM29KX,,,,,,01/97 +K3HZO,FN20AG,,,,,50: 350W 5el - 144: 350W 17el - 432: 100W 24el,01/98 +K3IB,FM19UU,EME,,,,50: 200W 6M5XX - 144: 1-5KW FO12 - 222: 300W - 432: 300W 2xRIW,12/07 +K3JT,EM99XO,,,,,,01/03 +K3JYD,FM18,EME,,,,432: 4x 19el 400W 144 2 x K1FO-15 1500W,05/07 +K3LFO,FM19,EME,,,,,01/03 +K3LOW,EN91BK,,,,,,01/03 +K3MF,FM19XP,EME,,,,432: 8x 25 K1FO GS23b 1500w,01/08 +K3ROJ,FM19SH,,,,,,01/03 +K3SIW,EN52,,,,,,01/03 +K3TKJ,FM28EM,,,,,,01/03 +K3TUF,FN10WE,,,,,,01/04 +K3TV,FN20EP,,,,,,01/03 +K3UZY,FN20,,,,,,01/03 +K3VLQ,EM92,,,,,,01/03 +K4AL,EM66QF,EME,,,,144: 15el 400W,05/05 +K4AR,EM76,EME,,,,432: 8x28el (9lb) Yagis 1-5KW 0.25db,01/00 +K4BTY,EM66,,,,,TS-870 TS-850 FT-736R,05/09 +K4CSO,EM73,,,,,,01/03 +K4DD,EM60NP,,,,,,01/04 +K4DRF,EM74QA,,,,,,01/03 +K4DXA,EM95pe,,, +K4EJQ,EM86,,,,,,01/03 +K4EME,FM08JF,EME,,,,432: 8x 33el 800W,09/05 +K4FJW,EM86,,, +K4HJE,EM96,,,,,,01/01 +K4JAF,EM70EK,,,,,,01/03 +K4KAE,FM02AT,,,,,,01/03 +K4KO,EM66UD,EME,,,,144: 100W 15el,05/06 +K4MRW,EM64PW,,,ex WB4AXQ,,,01/01 +K4QF,EM64,,,,,,01/03 +K4QI,FM06,EME,,,,,08/05 +K4QXX,EL87RM,,,,,,01/03 +K4RF,EM84DJ,,,ex WS4F,,,01/01 +K4SDI,EM56TQ,,,,,,01/03 +K4SSO,EM48SR,,,,,144: 160W 16el,01/02 +K4SSP,EM47,,,,,,09/99 +K4TAX,EL96WF,,,,,,01/03 +K4VJ,EL96LX,,,,,,01/03 +K4WRI,EL98LM,,,,,,01/03 +K4WY,FM18IS,EME,,,,IC-7000xvcr to 2MPX20 xpol yagis(2) Commander II amp avg 500watts out preamp etc,11/08 +K4XR,EM64NL,EME,,,,144: 2x 18el QRO,09/04 +K4YA,EM25,,,,,,01/03 +K4YNT,EM74KW,EME,,,,,02/05 +K4ZFY,EL18,,,,,,01/03 +K5AIH,EL09TK,EME,,,,,01/98 +K5AM,DM62NI,EME,,,,144: 1x 17el 1500W,11/06 +K5APM,EM10BL,,,,,,01/03 +K5AZU,EM40SN,EME,,,,,01/03 +K5BYS,EM13,,,,,,01/03 +K5CBL,EM15,,,,,,01/03 +K5CFM,EM15,,,,,,01/03 +K5CM,EM25,,, +K5CPZ,EM15,,,,,,01/03 +K5CZD,EM32VN,EME,,,,144: 2x 13el 375W,05/06 +K5DNL,EM15LJ,EME,,,,50: 7el 144: 2x 17el 400W,04/07 +K5EGW,EM30,,,,,,01/03 +K5EWS,EM10,,,,,,01/03 +K5FA,EM44,,,,,,01/03 +K5GE,EL09,,,,,,01/03 +K5GMX,FN31NU,EME,,,,144: 4x 13el 600W,04/05 +K5GNA,EM20,,,,,,01/03 +K5GW,EM13PA,EME,,,,144: 48x10el,04/05 +K5IS,DM96,,,,,,01/03 +K5IUA,EL29CD,,,ex KB5IUA,,,01/01 +K5JL,EM15DQ,EME,,,,,01/05 +K5LLL,EM10KF,,,,,,03/07 +K5LZO,EM20,,,,,,01/03 +K5MAT,DM65,,,,,,01/03 +K5MQ,EM31WQ,EME,,,,144: 17B2 1500W,11/06 +K5OGE,EM20UX,,,,,,01/01 +K5PHD,EM12,,,,,,01/03 +K5PHF,DM61,,,,,,01/03 +K5PJR,EM37KA,EME,,,,1296: 4m dish 300W 0.2db lna,09/06 +K5QE,EM31,EME,,,,144: 8x 18el M2 QRO - 432: 19x 9wl,11/06 +K5QQ,DM65SB,,,,,,01/03 +K5QXJ,EM30XA,,,,,,01/03 +K5RFI,EM16,,,,,,01/03 +K5RHR,DM65UV,,,,,,01/03 +K5RUS,EM32VM,,,,,,01/03 +K5SO,DM66XW,EME,,,,1296: 250W 8.6m dish 0.2db LNA,04/06 +K5SXK,EM12,,,,,,01/03 +K5TN,EM15,,,,,,01/03 +K5TNP,EM32,,,,,,01/03 +K5TTT,EM26CH,,,ex KB5ZUD,,,01/02 +K5UHF,EM10DJ,,,,,,01/03 +K5UJC,EM20VB,,,,,,01/04 +K5VH,EM00XE,,,,,,01/03 +K5WO,EM12,,,,,,01/03 +K5WPN,EM14AL,,,,,144: 100Watt 11el cushcraft 50: omni 432: 50watts 11el M2,05/07 +K5WXN,DM61,EME,,,,,01/03 +K5YPV,EM54MR,,,,,,01/03 +K5YY,EM26,,,,,144: 1KW 13el,01/03 +K5ZMJ,EM12,,,,,,01/03 +K5ZMS,EL09,,,,,,01/03 +K5ZSJ,EM12,,,,,,01/03 +K5ZXE,EM14KL,,,,,,01/03 +K6AAW,CN80TE,EME,,,,144: 4x15el 3wl 1.2KW MGF1302,06/06 +K6ALF,CM97BH,,,,,,01/03 +K6CYS,DM12KT,,,,,,01/03 +K6DV,DM13NI,EME,,,,,01/03 +K6FQ,DM12NL,EME,,,,144: 4x7ele crossed 1.3KW,03/05 +K6HLH,DM14CP,EME,,,,,05/07 +K6IAH,DM12,,,,,,01/03 +K6IBY,DM13,EME,,SILENTKEY,,,10/08 +K6JEY,DM03WT,EME,,,,432: 4x25el K1FOs 500W 0.4db,10/06 +K6KL,CM97,,,,,,01/03 +K6LEW,FM18LT,EME,,,,,11/00 +K6MBY,CN88KD,,,,,Icom 746 144: M2 17 el 3000K ERP,09/07 +K6MXI,CM88QL,,,,,,01/03 +K6MYC,DM07DB,EME,,,,144: 4x 32XP M2 1KW,04/07 +K6PF,DM13AR,,,,,144: FT726r 175W 4xM 2MXP20,01/01 +K6QXY,CM88QL,EME,,,,,10/05 +K6SUE,CM98AK,,,,,144: 650W 2x17el- 222: 120W 7wl- 432: 175W 2x9el,11/99 +K6UCY,FN42HM,EME,,,,4x 25el 1KW,03/07 +K6UIY,DM14,,,,,144: FT726r 1KW 2Yagis,01/97 +K6UM,CM88,,,,,,01/03 +K6ZX,CN82GM,,,,,144: 160W 2x2M9,01/97 +K7AD,DN06ID,EME,,,,144: 4x 14el 1kW,10/05 +K7BV,FN31VI,EME,,,,50: 1000w 4x7el,03/05 +K7CA,DM37,EME,,,,144: 8x 16el 1500W,09/08 +K7CAI,DN27KF,,,,,,01/03 +K7CW,CN87LJ,EME,,,,6m kW 8elem - 2m kW 16elem,04/07 +K7FB,DN17HN,EME,,,,400W 11db ant,05/07 +K7IEY,CN88,,,,,,03/98 +K7JA,DM03XS,,,,,144: 190W 19el,01/98 +K7KX,DN55,,,,,,01/03 +K7LNP,DN30,EME,,,,,09/99 +K7MAC,DN13SN,EME,,,,50: 7el 1000W 144: 4x 15el 1500W,09/05 +K7MDL,CN87XT,EME,,,,144: 2x 3wl 300W,04/05 +K7MI,CN73TC,EME,,,,144: 4x 17el 500W,12/07 +K7ND,CN87QF,,,,,144: 1KW 2x5wl M2,01/01 +K7NEP,DN53NF,,,ex N2NEP,,FT1000MP 144: HM 1KW PA 13el,01/98 +K7OO,DM04,,,,,,01/03 +K7PVT,CN88SA,,,,,,01/03 +K7TRM,DM33VP,,,,,,01/03 +K7UOP,DM33XN,,,,,,01/01 +K7UV,DN31XM,,,,,,01/03 +K7WIA,CN87TR,EME,,,,,03/05 +K7WUP,DM49IG,EME,,,,,01/03 +K7XC,DM09NM,EME,,EX NC7K KD7DH A35WZ,,50: IC746 100W 6el 144: IC746 350W 18xxx 222: xvtr 400W 27el 432: IC706IIG 300W 33el,05/07 +K7XD,CN85,EME,,,,144: 400W 2x23el,01/97 +K7XQ,CM97QI,EME,,ex KO6RD,,50: 2x 7el 1KW - 144: 4x 2MPX18 Xpol 3lb 1.5KW MGF1302 - 432: 4x 9wl 1KW,10/06 +K7XW,CN96XI,EME,,,,50: 1-5KW 5el - 144: 600W 2x3.5wL - 222: 50W 5wl - 432: 200W 4x5.3wl,01/01 +K7YVZ,DN13TL,,,ex KC7YVZ,,144: 1-5KW 4x18XXX 2x13el Quagi Preamp - 432: 350W 4x38el,01/01 +K7ZL,CN84JC,,,,,144: 150W 36foot yagi,01/98 +K8BHZ,EN75DB,,,,,144: 1-5KW 4x17B2,01/98 +K8DGY,EN63WW,,,,,,01/03 +K8EB,EN73CB,EME,,,,144: 1500W 2x 18el,12/05 +K8EME,EN72EH,EME,,ex NP4C,,144: FT847- 4x11el 2.2lb- 8877 (1-5KW),03/00 +K8GUN,FM09WH,EME,,WB8VAZ,,ICOM,04/07 +K8IE,EN52,,,,,,01/03 +K8ISK,FM18DV,EME,,,,,01/03 +K8MD,EN82,,, +K8MM,EN83IB,,,,,,01/04 +K8RAY,EN72XK,EME,,,,144: 4x 9el 400W,10/07 +K8ROX,EN80LO,,,,,,01/03 +K8SD,EN12,,,,,,01/03 +K8TL,EM89CV,EME,,,,144: 360W 2MXP28,12/07 +K8UC,EM99EG,EME,,,,,01/03 +K8UK,EN82LK,EME,,,,,01/03 +K8VEB,EN72NN,,,,,,01/03 +K8VP,EN91,EME,,ex KB8ZW,,,07/01 +K8XK,EN42,,,,,,01/03 +K9AKS,EN41,,,,,,01/03 +K9AM,EN52,,,,,,01/03 +K9BCT,EL96UE,EME,,,,,01/03 +K9BMB,EM69OG,,,,,,01/03 +K9CA,EN61ML,,,,,,01/03 +K9CFA,EN52,,,,,,01/03 +K9CT,EN50BQ,EME,,,,IC7800 IC756 ProII Demi xvtr LunarLink 4x18 XXX Demi LNA,09/07 +K9DMW,EN52UI,,,NT9E,,756PROII(6m) 910H(144/432),09/07 +K9DQ,EN62AS,,,,,,08/06 +K9DRO,EN54fn,,, +K9DTB,EM89,,,,,,01/90 +K9DX,EN52XC,EME,,,,144: 8x 19el Amp. 8877,09/06 +K9EA,EN94CB,,,,,,09/01 +K9EK,EM79BF,,,,,,01/03 +K9FYV,EN41,,,,,,01/03 +K9HJZ,EN50ES,,,,,,01/03 +K9HMB,EN52VI,EME,,,,,12/00 +K9HSK,EN51,,,,,,01/03 +K9IJ,EN52,,,,,,01/03 +K9ILT,EN61AU,,,,,,01/03 +K9IMM,EN52,,,,,,01/03 +K9IMX,EM38,,,,,,01/03 +K9IZV,EN53,,,,,,01/03 +K9JK,EN52XC,,,,,,01/03 +K9KFR,EN71GG,EME,,,,,01/03 +K9KHW,EN63AD,,,,,,01/03 +K9KL,EN64,,,,,,04/06 +K9KNW,EL96EC,EME,,,,,03/05 +K9MB,EM57,,,,,,01/03 +K9MRI,EN70IU,EME,,,,144: 8x m2 yagis and 1.2kw,04/05 +K9MU,EN44HW,EME,,ex KB9UZV,,,01/06 +K9NS,EN52RL,,,,,144: 2M18XXX,05/06 +K9OQN,EN52,,,,,,01/03 +K9PO,EN52VF,,,,,,01/03 +K9PW,EN52,,,,,,01/03 +K9SLQ,EN70KK,EME,,,,432: 16x FO22 1.5 KW,07/07 +K9SM,EM59EE,EME,,,,144: 4x 9el 500W,11/05 +K9SQL,EM69RF,,,,,,01/04 +K9TI,EN51,EME,,,,144: 4x K1FO 12 el PA 8877,02/01 +K9VHF,EN53,EME,,,,144: 17el 400W,05/05 +K9VNM,EN63,,,,,,01/03 +K9VS,EN52,,,,,,01/03 +K9XI,EN61,,,,,,01/03 +K9YR,EN52,,,,,,01/03 +K9ZZH,EN61,EME,,,,,01/03 +KA0EWM,EN30,,,,,,01/03 +KA0KCI,EM17,,,,,,01/03 +KA0KUY,EM07XD,,,,,,01/03 +KA0MOW,EM17,,,,,,01/03 +KA0MR,EM18GE,,,,,,01/03 +KA0MWA,DM79LL,,,,,,01/03 +KA0NNO,EM24TL,,,,,,01/97 +KA0OGU,EM29,,,,,,01/03 +KA0PQW,EN33,,,,,,11/01 +KA0RYT,EN34DW,EME,,,,,01/02 +KA0UZZ,EN34,,,,,,01/03 +KA0Y,EN41,EME,,,,,08/00 +KA0YSQ,EN42,,,,,,01/03 +KA0ZOZ,EN23,,,,,,01/03 +KA1JBG,FN42,,,,,,01/03 +KA1OTP,FN41,EME,,,,,01/03 +KA1R,FN42NE,EME,,,,,05/09 +KA1VHF,EM89LL,EME,,,,144 2x 17el 1KW,10/06 +KA2DRH,EM64KT,,,,,,01/03 +KA2HZO,FM29US,,,,,,01/03 +KA2KQM,EM74QA,,,,,,01/03 +KA3DQD,FM29DO,,,ex N3ZWW,,Ten-Tec 526 ICOM 735,03/06 +KA3HED,FM27,,,,,,01/03 +KA3WSZ,FM29GK,EME,,,,,01/03 +KA4WJA,EL89WE,,,,,,01/03 +KA5AAE,EM06,,,,,,01/03 +KA5AIH,EL29NW,EME,,,,,10/96 +KA5DWI,EM12JU,,,,,Yaesu FT-290R FT-726R and FT 747GX,01/09 +KA5PVB,EM13,,,,,,01/03 +KA5TQY,EM43,,,,,,01/03 +KA5UEL,EM12,,,,,,01/03 +KA5UEV,DM93,,,,,,01/03 +KA5ULI,EM30,,,,,,01/03 +KA5WMJ,DM96,,,,,,01/03 +KA5WRG,EM15,,,,,,01/03 +KA5YJJ,EM44NN,,,,,,01/03 +KA6NBC,CM98,,,,,,01/03 +KA7V,DN14MA,,,,,144: 13B2 1500W,11/03 +KA8EDE,EM79,,,,,,01/03 +KA8HOK,EM89LL,EME,,,,144: 2x 19el 600W,10/06 +KA8HQL,EM89VU,,,,,,01/03 +KA8SFP,EM12,,,,,,01/01 +KA8SSB,EM79,,,,,,01/03 +KA8TER,DN43AL,,,,,,01/03 +KA9CFD,EN40OM,,,,,,08/05 +KA9LDS,EN51,,,,,,01/03 +KA9LLF,EM71,,,,,,01/03 +KA9LNP,DN30,,,,,144: 800W KLM13LBA,01/01 +KA9MGR,EN41,,,,,,01/03 +KA9OIL,EN62,,,,,,01/03 +KA9UVY,EM58NG,,,,,,01/03 +KA9YCB,EM57QQ,,,,,,01/03 +KB0BFI,EM29LL,,,,,,01/03 +KB0BVR,EN26AH,,,,,,01/03 +KB0CY,DM79,,,,,,01/03 +KB0EMR,EN31,,,,,,01/03 +KB0FHP,FN20GE,,,,,,01/03 +KB0FRX,EN10,,,,,,01/03 +KB0G,DM79PA,EME,,,,,09/06 +KB0GL,EN35,,,,,,01/03 +KB0GR,EM29,,,,,,01/03 +KB0GU,EM28TW,,,,,,01/04 +KB0HH,EM07QD,EME,,,,,01/04 +KB0IKP,EN25UQ,,,,,,01/03 +KB0LRI,DM79,,,,,,01/03 +KB0LXX,DN96,,,,,,01/03 +KB0MNK,EN34IW,,,,,,01/03 +KB0NR,EN35OG,,,,,,01/03 +KB0OBT,EN35KB,,,,,,01/03 +KB0OZN,EN34,,,,,,01/03 +KB0PYO,EN24GP,,,,,,01/97 +KB0THN,EN44DB,,,,,,01/03 +KB0TZA,EN35ID,,,,,,01/03 +KB0USF,DM79LR,,,,,,01/03 +KB0VUK,EN34PK,,,,,,09/01 +KB1CJ,FN42JG,,,,,IC746 50: 100W 2el - 144: 100W 13el,09/03 +KB1DFE,FN42ES,,,,,,01/03 +KB1HGB,FN53EU,,,,,,01/03 +KB1LKB,FN31RS,EME,,,,144: 2x 12el 300W,09/06 +KB2AH,FN20,,,,,,01/03 +KB2M,FM29PE,,,,,,01/03 +KB3EDF,FM18RH,,,,,,04/07 +KB3HWO,FN10UB,,,,,,01/03 +KB3PD,FM29,EME,,,,,01/03 +KB3PMR,FN10,EME,, +KB4FQ,FM04GR,,,,,,01/03 +KB4RSM,EM66OG,,,,,,01/03 +KB4WM,EM63,EME,,,,,01/03 +KB4ZGO,FM06BQ,EME,,,,144: 160W 13B2,08/05 +KB5DAK,DM96,,,,,,01/03 +KB5EK,EM15,,,,,,01/03 +KB5MR,EM26,,,,,,01/03 +KB5MY,DM13NC,,,,,,01/03 +KB5UBE,EM12LQ,,,,,,01/03 +KB5ULP,EM15,,,,,,01/03 +KB5VL,DM73RK,,,,,,01/03 +KB5VQQ,EM15,,,,,,01/03 +KB5WII,EM15,,,,,,01/03 +KB5WMY,EM32,,,,,,01/98 +KB5YAJ,EM14,,,,,,01/03 +KB5YUA,EM44,,,,,,01/03 +KB5ZMY,EM12,,,,,,01/03 +KB5ZUD,EM26,,,,,,01/03 +KB6IGC,DM15DO,,,,,,01/03 +KB7FUV,DN44,,,,,,01/93 +KB7XO,DN41AB,,,,,,01/03 +KB8GC,EN74HD,,,,,,01/03 +KB8JVH,EN80,,,,,,01/03 +KB8O,EN82JJ,,,,,,03/00 +KB8RQ,EM79SV,EME,,,,144: 8x 19el M2,03/05 +KB8U,EN71SW,EME,,,,,01/06 +KB8VAO,CM87XW,EME,,,,,02/09 +KB8ZUZ,EN83JL,,,,,,01/03 +KB8ZW,EN91IJ,,,,,,01/03 +KB9GPW,EN61,,,,,,01/03 +KB9II,EN52WA,,,,,,01/03 +KB9KCJ,EN52,,,,,,01/03 +KB9MLA,EN61CX,EME,,,,18el- 160W,10/98 +KB9NKM,EN70NS,EME,,,,144: 4x 13el 1KW,11/06 +KB9NLM,EN53UO,,,,,,01/03 +KB9PCL,EN41,,,,,,01/03 +KB9PJL,EN44DV,EME,,,,144: 400W 18el,11/06 +KB9Q,EN52VV,,,,,,01/03 +KB9RQZ,EM59,EME,,,,144: 13el 100W,07/06 +KB9TLV,EN45MW,,,,,,01/03 +KB9UMT,EN50DP,,,,,,01/03 +KB9VQC,EN53,,,,,,01/03 +KB9VUG,EN52,,,,,,01/03 +KB9YXF,EN61,,,,,,01/03 +KB9ZK,EN62,,,,,,01/03 +KC0AKJ,EN42,,,,,,01/03 +KC0AMG,DM98GK,,,,,,01/03 +KC0BMF,EN31BE,EME,,,,50: 5ele 100W 144: 13el 100W,12/08 +KC0CHW,EN41IN,,,,,,01/03 +KC0CRE,DM28,,,,,,01/03 +KC0FTQ,DM79OB,,,,,,01/03 +KC0FXY,EN34,,,,,,01/03 +KC0HLN,EN32tl,,, +KC0HTB,EN34JT,,,,,,01/03 +KC0LBT,EN35IB,,,,,,01/05 +KC0LMS,EN34IW,,,,,,01/03 +KC0MLS,EM19QU,,,,,,01/03 +KC0OG,EN10,,,,,,01/03 +KC0P,EN34SB,,,,,,01/03 +KC0QR,EN10,,,,,,01/03 +KC0UWS,DN70KE,EME,,,,50: 3el,08/05 +KC0Y,DM79,,,,,,01/03 +KC2TN,FM29NS,,,,,,01/03 +KC3AK,FM19UU,,,,,,01/04 +KC3RE,FM18DP,EME,,ex TF3XUU TA3/KC3RE,,144: 280W 0.5dB 15el can elevate manually to 10 eme from car - 432: 110W 0.5dB 19 el can elevate manually to 30,04/06 +KC4PX,EL98QG,EME,,,,,06/05 +KC4VI,EL88SD,EME,,,,144: 4x 3.5wl 1000W,05/05 +KC5BQS,EL29,,,,,,01/03 +KC5BRO,EM15,,,,,,01/03 +KC5LOW,EM22,,,,,,01/03 +KC5NOA,EL08,,,,,50: 150W 5el - 144: 100W 10el - 432: 20W 19el,01/01 +KC5NOB,EL07,,,,,50: 10W 5el - 144: 170W 8el - 432: 10W 19el,01/01 +KC5UOO,EM26,,,,,,01/03 +KC5WX,EM13LB,,,,,,01/03 +KC5YKX,EL17HS,,,,,Icom 746 w/ DEM 22 and 432 xverters 50: 5el - 144: 13el - 222: 15el - 432: 25el,05/02 +KC5ZXE,EM45AM,,,,,,01/03 +KC6A,DM03,EME,,,,,01/03 +KC6TEU,CM98MQ,,,,,,01/03 +KC6WFS,DM04RK,,,,,50: 100W 5el - 144: 100W 2x12el - 432: 50W 2x18el,08/01 +KC6ZWT,CM98NO,EME,,,,144: 300W 17el M2 - 222: 250W 15el - 432: 150W 19el,10/08 +KC7MRP,CN88,,,,,,01/97 +KC7OTV,CN84KA,,,,,,01/03 +KC7V,DM43AS,EME,,,,Rig Kenwood TS2000 Amp Antenna Works 8877 Ant 4 x 2M5WL,10/06 +KC8CCD,EM79VM,,,,,,01/03 +KC8DLL,EN66,,,,,50: 150W M25 - 144: 200W 2x13B2 - 432: 100W KLM,01/98 +KC8GYW,EM79,,,,,,01/03 +KC8NST,EN91QB,,,,,,01/03 +KC8OIT,EN83,,,,,,07/01 +KC8QVO,EM79VP,,,,,,11/05 +KC9AAX,EN52,,,,,,01/03 +KC9AER,EN52,,,,,,01/03 +KC9AYO,EN52,,,,,,01/03 +KC9BTW,EN52,,,,,,01/03 +KC9CMT,EN63LA,,,,,,01/04 +KC9ELU,EM79hj,,, +KD0BT,EN41,,,,,,01/03 +KD0DW,DN70LF,,,,,,01/03 +KD0HE,EN00,,,,,,01/03 +KD0KUK,EN35dw,,, +KD0LO,EM48,,,,,,01/03 +KD0PY,EN41UX,,,,,144: IC275A 2516g 150W 13el - 432: IC471H 70W 15el,01/01 +KD0SU,DM78,,,,,,01/03 +KD1DU,FN31FH,EME,,,,,01/03 +KD3UY,FM19LG,EME,,,,144: 2x 4WL antenna 1KW,05/05 +KD4ESV,EL87RH,,,,,,01/01 +KD4FNB,FM17TD,,,,,,01/03 +KD4LT,EM81CG,EME,,,,,01/03 +KD4MZM,EL87RG,EME,,,,50: FT107m - 144: FT726r 170W 19el,07/01 +KD4NOQ,EM55BE,,,,,,01/03 +KD4NUD,EM91HB,,,,,,01/03 +KD4TJN,EM55CE,,,,,,01/03 +KD5FFW,EM12,,,,,,01/03 +KD5FZX,EM12MP,EME,,,,,01/03 +KD5HIO,DM65UV,EME,,,,,01/03 +KD5KJD,EL29IR,,,,,,01/04 +KD5LDQ,EM26IH,,,,,,01/03 +KD5LWU,DM66AU,,,,,,01/03 +KD5OMJ,EM04UO,,,,,,01/03 +KD5OUG,EM12,,,,,,01/03 +KD5QQU,EM12QX,,,,,,01/03 +KD5QWO,EM15AJ,,,,,Yaesu ft-847,01/04 +KD5XB,DM84,,,,,,12/06 +KD7ETC,DM54AH,,,,,,01/04 +KD7YZ,EM88,,, +KD9KX,EN42,,,,,,01/03 +KE0MO,EN41,,,,,,01/03 +KE0UQ,EM29,,,,,,01/03 +KE2N,FM18EW,EME,,G0VSN,,432: 16x 28el 1000W,08/07 +KE3PL,FN20PM,,,,,,01/03 +KE4ENX,EM84GM,,,,,,01/03 +KE4IKM,EM73,,,,,,01/03 +KE4KDB,EM55,,,,,,01/03 +KE4MKW,EM84DJ,,,,,,01/03 +KE4VUN,EM67MS,,,,,,01/03 +KE4WBO,FL96VW,EME,,,,222: 4x 16el 120W,10/06 +KE4YH,EL88OA,,,,,,01/01 +KE4YYD,EL97RV,,,,,,09/06 +KE5CO,EL29,,,,,,01/03 +KE5ML,EM15,,,,,,01/03 +KE6NDG,CN90QJ,,,,,,01/03 +KE6PT,CM88UE,,,,,,01/03 +KE7CX,CN85LJ,,,,,,01/03 +KE7NR,DM33WM,EME,,,,144: 4x 13el KW 432: 2x 28el 1KW 50MHZ 5 ele L/B & KW,05/07 +KE7NS,DN41AF,,,,,,01/02 +KE7OI,DN13SU,EME,,,,,01/01 +KE7V,CN88JB,,,,,,01/04 +KF0AU,EN31HI,,,,,,01/03 +KF0CK,EM38JC,,,,,,01/03 +KF0DS,DM41,,,,,,01/03 +KF0FE,EN41,,,,,,01/03 +KF0M,EM17HO,EME,,,,,01/01 +KF0OA,DM79,,,,,,01/03 +KF0Q,EN44EA,,,,,,01/03 +KF4HOU,EM86VE,,,,,,01/03 +KF4JU,EL87,,,,,,01/03 +KF5AL,EM13,,,,,,01/03 +KF5IU,EM31WR,,,,,,01/03 +KF5PE,EM12,,,,,,01/03 +KF6BXH,CM87VQ,,,,,,01/03 +KF6HQC,DM14ED,,,,,,01/03 +KF7CN,DN16LV,,,,,,01/01 +KF7IS,DN41AC,,,,,,01/04 +KF7VY,DN17IQ,,,,,,01/03 +KF8QL,EN72FU,,,N8MXK,,IC-746-Flexradio 1000-DEMI transverters,01/09 +KF9CY,EM59,,,,,,01/03 +KF9YR,EN54,,,,,144: 170W 13B2,01/97 +KG0MW,EN13,,,,,,02/01 +KG0SV,DM79,,,,,,01/03 +KG4BMH,EM76JK,,,,,144: 1000 Watts sp144vdg GasFet 40 Element Collinear Array 7/8Heliax,05/02 +KG4CHX,EM95LL,,,,,,01/03 +KG4FET,EM90FH,,,,,,07/01 +KG4KAK,EL96VG,,,,,,01/05 +KG4MLA,EL88OA,,,,,,01/03 +KG5RK,EM12,,,,,,01/03 +KG5SF,EM44,,,,,,01/03 +KG5UN,EM02,,,,,,01/03 +KG6DX,QK23KL,EME,,,,144: 4x 13el CushCraft 900W,06/05 +KG6ENA,DM04DK,,,,,,01/03 +KG7CN,DN23BF,,,,,50: 5el 1KW,11/06 +KG7FU,CN83KA,,,,,144: 2x11el 1KW,01/01 +KH7K,AL08UJ,,,,,,01/03 +KH7X,BL11CG,EME,,EXPEDITION,,,04/07 +KH7Y,BL11,EME,,W6YM,,,08/07 +KI0LE,EN36US,EME,,KB0PDO,,Kenwood TS-790A Yaesu FT-847,09/07 +KI4BYV,FM15CX,,,,,,01/04 +KI4M,EM95AQ,,,,,144: 800W M2 18XXX,01/01 +KI4TZ,EM95LD,EME,,,,144: 2x 13el 400W,05/08 +KI6FF,DM13AR,,,,,,01/03 +KI7JA,CN85RL,,,,,,01/04 +KI7WB,DN62,,,,,144: 200W 10el,01/01 +KJ5EY,DM65XA,,,,,,01/03 +KJ5Q,EM15,,,,,,01/03 +KJ6HZ,DM13HX,EME,,,,50: 3el 100W - 144: 2x 17el 500W - 222: 10W - 432: 4x 19el 500W - 1296: 10W dish - 10G: 2W dish,09/06 +KJ7A,DM03,EME,,,,432: FT-817 8 x 25 ele,11/00 +KJ7F,DN13VO,EME,,,,,01/04 +KJ7OG,DM42MH,EME,,,,,01/03 +KJ9I,EN53QB,EME,,,,50: 1 Yagi,11/08 +KK4NO,EM92,,,,,,01/03 +KK5WA,EM45,,,,,,01/03 +KK7B,EN57RB,,,,,,01/03 +KK7LK,CN88SS,,,,,,01/03 +KK8O,EN80OR,,,,,,01/04 +KL6M,BP51DC,EME,,ex AL7OB,,9.2m dish,10/06 +KL7FB,BP51HO,EME,,,,,01/03 +KL7FH,BP41BB,EME,,,,432: 16X12 ele polarity rotation FT-847 100 W preamp K0RYT .18db NF,09/05 +KL7HFQ,BP51,EME,,,,,01/03 +KL7IZW,EM13SE,EME,,,,,12/04 +KL7UW,BP40IQ,EME,,ex AL7EB,,FT847 144: 4 Xpol-20el M2 170W MGF1801 432: 16.5dbd Antenne 50W,09/05 +KL7X,BP51AE,EME,,,,,02/01 +KM0A,EM84UT,EME,,,,144: single Yagi,10/06 +KM0T,EN13VB,,,,,,07/01 +KM1H,FN42,,,,,144: 1-5KW 2x4218XL,01/01 +KM4ID,EM93WA,,,,,,01/03 +KM5OL,EM13RB,,,,,,01/03 +KM5PO,EM12KO,EME,,ex KD5BUR,,144: 13KW ERP,04/05 +KM6WC,CM97OP,,,,,FT100,09/02 +KN4SM,FM16QT,,,,,144 : 1.5KW 5wl M2 - 432: 1.5KW 13wl M2 - 222: 300w K1FO 22el,12/07 +KN6DD,DM03,EME,,,,,01/03 +KO0Z,EM48,,,,,,01/03 +KO2R,EN52,,,,,,01/03 +KO4FR,FM16UV,,,,,,01/05 +KO4QR,FM26,,,,,,01/98 +KO7N,CN84IA,EME,,,,,08/01 +KQ0Z,EM37,,,,,,01/03 +KQ4I,FM06JB,EME,,,,144: DISH,01/90 +KQ6JI,CM87UJ,,,,,,01/03 +KQ6MU,DN16WF,EME,,,,144: 17el 100W,07/05 +KQ6UH,DM14BC,,,,,,01/03 +KR5E,EL29JN,,,,,,01/03 +KR5V,EM13,EME,,,,,01/02 +KR5Vex,EM13SD,,,,,,01/03 +KR7O,DM07BA,EME,,ex N7STU,,HTX100 144: Trvt 1KW 2M5wl - 222: Trvt 450W 7wl yagi,10/06 +KR8L,DN43AL,,,,,,01/03 +KS0F,EM48SL,,,,,,01/97 +KT4HA,FM15BH,,,,,,01/03 +KT4KB,EM93,,, +KT8O,EN71KI,,,,,,04/08 +KT8U,EN80OR,,,,,,01/03 +KU0KU,EM28QV,,,,,,01/03 +KU2A,FN42DW,EME,,,,144: 12el 1500W,12/07 +KU3T,FN20,EME,,,,,04/98 +KU4F,EL99AF,EME,,,,,01/03 +KU4R,EM86SK,EME,,,,144: 2x18XXX 200W,01/01 +KU7Z,DN41AF,EME,,,,144: 2x 12el 600W,10/06 +KV4EB,EM66FL,,,,,144: 7el 14el,11/01 +KV6J,BK29AQ,,,,,,01/03 +KW0A,EM48RI,,,,,144: 1KW 24el,08/01 +KW0T,EM19WF,,,,,,01/03 +KW1AM,FN41CT,EME,,,,,05/07 +KX7V,DM42,,,,,,01/03 +KX8XX,EN74HD,,,KB8GC WB8CKZ WN8CKZ,,,01/08 +KX9X,EN60AC,,,ex KF9PL,,IC706MKII - 50: 100W 3el - 144: 100W 11el,09/01 +KY7B,DM43,,,,,,01/03 +KZ2S,FN20XD,,,,,,01/03 +LA0BY,JO59FW,,,EX DF9PY,,144: 180W 9el - /p JO59ix: 144: 180W 2x9el MGF1302 - 432: 120W 2x13el Preamp - 1296: 20W 43el Preamp,01/08 +LA0FX,JP40LM,,,ex SP9CSO,,,11/95 +LA0GE,JO59NJ,EME,,,,Icom IC-7000,03/07 +LA1BEA,JO29XB,,,Expedition,,,01/91 +LA1K,JP53EK,EME,,,,144: 2x4CX250b MGF1402 preamp 4x17el,01/95 +LA1KHA,JO49SE,,,,,,01/93 +LA1TV,JO49TQ,,,,,,01/04 +LA2AB,JO59FV,EME,,,,,07/02 +LA2MOA,JP50HW,,,,,,12/08 +LA2PHA,JO38IB,,,,,144: 100W 10el,07/02 +LA2RZ,JP30AI,,,,,144: 160W 17el,05/02 +LA2YMA,JP32LK,,,,,144: 40W 9el,02/04 +LA2Z,JO59EJ,EME,,,,1296: 4.2m dish 300w f-d=0.5 VE4MA feed NF 0.3dB,10/06 +LA3BO,JO59CD,,,,,,04/04 +LA3EU,JP32BG,,,,,,01/93 +LA3HPA,JP50QM,,,,,Icom IC-746pro Icom IC-706MkIIG,09/08 +LA3WU,JP20QH,EME,,,,,01/93 +LA4DL,JP32EL,,,,,,03/04 +LA4XGA,JP33VC,,,LB7ZC,,144: 10 5m ant 800w,10/07 +LA4YGA,JO48BE,EME,,SP8DXL SP2DXL,,IC910 / IC706 144: 300W 15el - 432: 17el 100W,04/07 +LA5IH,JP20NK,,,,,,01/93 +LA5KJA,JP50IV,,,,,,01/98 +LA5KO,JO38HC,,,,,144: 300W 17el MGF1302,06/06 +LA5NNA,JO38MA,,,,,144: 100W 19el,12/06 +LA5PH,JO49XA,,,,,,01/92 +LA5SAA,JO29SE,,,,,,01/93 +LA5TFA,JP99LQ,,,,,IC751-IC706-FT736r-FT225rd - 50: 2x5el HL166V - 144: 3CX800A7 15el,05/07 +LA6CU,JP20QL,,,,,144: TS790e 150W 16el MGF1302,09/99 +LA6HL,JO28TW,EME,,,,,01/02 +LA6I,JP41,,,Expedition,,,01/93 +LA6K,JP33VC,,,,,,05/03 +LA6LU,JO28,,,,,,07/96 +LA6MV,JO59FJ,,,,,,08/02 +LA6QBA,JP61BJ,,,,,50: 100W 2x5el - 144: 600W 4x11el,07/04 +LA6TPA,JP54RL,,,,,FT-2000 IC-7000,03/08 +LA6VBA,JO48,EME,,,,,01/93 +LA7KK,JP50,EME,,,,,01/93 +LA7SP,JP99MQ,,,,,,07/05 +LA8AE,JO59CC,EME,,,,,01/94 +LA8AJA,JP50HP,,,,,,07/06 +LA8AV,JO59DS,EME,,,,FT-1000MP + transverter,05/07 +LA8G,JP53EJ,,,,,,01/05 +LA8GKA,JO59FS,,,ex LC1PAT,,IC706,08/05 +LA8KV,JP52QQ,EME,,,,144: IC746 - 1Kw (or 1.8Kw) 4x15 el. Fullelv.,06/06 +LA8LF,JO59BS,EME,,,,1500W 4.6M NEC solid Dish Autotracking,05/07 +LA8NK,JO48KM,,,,,Ft-736 Ft-897 5 el yagi on 6 9 el yagi on 144,04/07 +LA8OW,JP50NC,,,,,,05/02 +LA8SMA,JP42GE,,,,,,05/07 +LA9BM,JP40CM,,,,,,03/98 +LA9DFA,JP60AE,,,,,144: IC-706MKIIG + SLA200 250w + 2M5WL 17el / 50: IC-756 PROII 100w 5el,06/09 +LA9DL,JO59KE,EME,,,,,04/04 +LA9FY,JP40,,,,,144: 160W 16el,02/09 +LA9IY,JP53,,,,,,01/03 +LA9NEA,JO59DX,EME,,OP LA2AB,,144: 4x 19el K1FO 1-5KW,02/05 +LA9Z,JO38HC,,,,,50: 100W 5 ele Tonna 144: 150w 15 ele CueDee,07/06 +LB7FA,JO38LM,,,,,144: IC821 9el 180W,03/05 +LM9K75Y,JO48AD,,,SPECIALCALL,,144: 3wl Preamp GS35B,01/09 +LU1C,GF05OM,EME,,,,4 x 3WL and 600 Watts,10/08 +LU1CGB,GF05OM,EME,,,,144: 4x 14 ele 600 W Pre RX - 432: low Pwr,02/09 +LU4HO,FF78RA,,,,,,01/03 +LU5BOJ,FG75HF,EME,,,,FT757GXII 144: 2x 12el 600W,03/07 +LU6DW,GF05SF,EME,,,,,01/03 +LU7DZ,FF78RA,EME,,,,144: 4X16 el 1 KW Pre RX 432: 4X22 el 1KW Pre RX,02/09 +LU7FA,FF96,EME,,,,144: 2x 12el 140W Preamp (maybe 4x 12),02/09 +LU7FIA,FF97PA,EME,,,,144: 2x 12el 300W Preamp - 432: 1x 19el 100W,02/09 +LU8EDR,GF05TF,EME,,,,1296 EME under construction,02/09 +LU9AWH,GF05SJ,,,,,,03/07 +LU9MBK,FF57NR,EME,,,,144: 4el Quad 100W,10/06 +LX1DB,JN39CO,,,,,,10/06 +LX1FX,JN29WT,,,,,,07/08 +LX1GR,JN39,,,,,,01/93 +LX2DX,JN29WO,,,,,,10/02 +LX2SM,JN39,,,,,,07/04 +LX8M,JN29XX,,,EXPEDITION,,,08/08 +LX8X,JN29XX,,,EXPEDITION,,,08/08 +LY2AAM,KO23,,,Expedition QSL via DL3BQA,,,06/06 +LY2BAW,KO25KA,,,,,FT-736R+home made PA - 144: 24el 2M8WL M2 - 432:-30el KLM - 1296: 44 el KLM,05/03 +LY2BIL,KO24PQ,,,ex UP1BWR - not qrv MS nw! (01/01),,144: FT736r 30el 1KW,08/02 +LY2BUU,KO15XH,,,,,IC-706MKII,10/07 +LY2BW,KO24,,,,,,01/95 +LY2CI,KO14WV,,,,,TS-790A- 144: 150W 11el - 432: 25el yagi - 1296: 36el,08/03 +LY2FE,KO05NQ,,,not qrv MS nw! (01/01),,144: FT736r 300W 13el,10/02 +LY2FR,KO15VR,,,,,,07/04 +LY2GC,KO25KA,EME,,,,,10/04 +LY2MW,KO24PS,,,,,IC746 + PAs 50: 100W 6el - 144: 100Watt 13el DJ9BV SP2 - 432: 200w 23el DJ9BV SP70,08/04 +LY2R,KO15VR,EME,,LY2FR,,FT857D 144: 4x 10el 800 W,09/07 +LY2SA,KO14LL,EME,,,,144: IC821H 300W 17el 5wl MGF1502 - 432: 175W 30el,06/07 +LY2WR,KO24FO,EME,,UP1BWR,,144: FT736r 11el 1KW+ - 432: 50W 24el - 1296: 10W loopyagi,03/09 +LY3BF,KO24OR,,,,,,01/96 +LY3GM,KO14LL,,,,,,12/97 +LY3W,KO14XW,EME,,LY3BW,,ICOM 706 mk-2g FT1000mp mark-V,10/07 +LY4U/P,KO24FO,EME,,LY2BIL,,,03/09 +LY8O,KO24OP,,,LY2MW,,IC-275H IC-475H IC-910H,05/08 +LY8X,KO24PQ,,,SpecialCall,,,08/99 +LZ1AG,KN22ID,EME,,,,144: 14el 100W,12/99 +LZ1BB,KN12PQ,EME,,,,,07/09 +LZ1DP,KN22TR,EME,,,,144: 4x5 WL DJ9BV cross+MGF1302 FT-736R PA 1-8 KW 2xGU74B,01/05 +LZ1DX,KN22,,,,,,01/93 +LZ1FG,KN12,,,,,,08/08 +LZ1JH,KN32FR,,,,,,06/99 +LZ1KDP,KN12SP,EME,,,,,01/98 +LZ1KDZ,KN32,EME,,,,,01/93 +LZ1KG,KN31CS,,,,,50: 4el transv. 10W - 144: 2x16 F9FT IC275e - 432: 15el FT790r,09/03 +LZ1KJ,KN31CS,,,,,50: FT987 4el 15W - 144: FT987 250W 2x8el GaAs Fet,09/03 +LZ1KQ,KN22TK,,,,,,12/96 +LZ1KRB,KN32,,,,,,01/93 +LZ1KSN,KN32SL,,,,,,01/93 +LZ1KSW,KN31CS,,,,,,12/95 +LZ1KU,KN32,,,,,,01/93 +LZ1KWT,KN22TK,,,QSL via LZ1DP or LZ1JH,,144: FT736 1KW 2x16el F9FT GaAsFet 3SK129,11/03 +LZ1NO,KN12,,,,,,12/01 +LZ1OA,KN22TK,EME,,,,,06/06 +LZ1QI,KN12,,,,,,11/01 +LZ1QM,KN12,,,,,,01/93 +LZ1R,KN42AA,,,Expedition,,,01/93 +LZ1UB,KN22TK,,,,,,01/94 +LZ1UK,KN22ID,,,,,144: 60W 8el Quagi,06/06 +LZ1V,KN12QQ,,,,,,01/90 +LZ1VPV,KN32AS,,,,,,08/05 +LZ1ZP,KN22ID,,,,,144: 150W 14el DJ9BV,05/03 +LZ1ZX,KN32IO,,,,,,12/99 +LZ2FO,KN13KX,EME,,,,144: 500W 15el 9BV,10/07 +LZ2HM,KN12QP,EME,,,,144: FT847 17el yagi,07/03 +LZ2HV,KN23UB,,,,,144: 600W 12el Quad,12/98 +LZ2JF,KN23,,,,,,01/93 +LZ2KRU,KN33FL,,,,,144: 500W 17el,08/97 +LZ2PP,KN33,,,,,,01/93 +LZ2US,KN13RJ,EME,,,,144: 4x KLM17LBX 2x 4CX800A 2KW FSC11LF,08/00 +LZ2UU,KN12QP,,,,,,08/96 +LZ2ZY,KN13OT,,,,,,05/08 +LZ3BD,KN12QQ,,,,,432: 250W 32el GaasFet,12/99 +LZ3CQ,KN12PQ,,,,,,01/03 +LZ3GM,KN32RL,,,,,144: IC735 20W 3wl 10ele BVO2 MGF1302,05/08 +LZ3YH,KN22,,,,,,12/95 +LZ4KK,KN23XU,,,,,TS-2000 Mirage B2516G 160W 4el DK7ZB,05/08 +LZ5GM,KN32QL,,,,,144: IC-720 50W 13eleFT MGF1302,04/03 +LZ5N,KN21JX,,,,,,01/95 +LZ5UV,KN12PR,,,,,144: FT847 IC271 4cx250 PA 17el DJ9BV,11/02 +LZ5Z,KN12PR,,,,,144: 2x15el 1KW,12/99 +LZ6T,KN22IS,,,,,,12/99 +LZ7A,KN43HL,,,Expedition,,,01/94 +LZ7P,KN22,,,,,,12/96 +LZ7Y,KN41AX,,,,,,08/99 +LZ9M,KN32RL,,,,,,12/03 +LZ9W,KN12MO,,,,,IC-746 FT-847,01/05 +LZ9X,KN32AS,,,= LZ1KWT,,144: 2x 15el 1KW,08/08 +M0AFJ,IO92OB,,,G8GGP,,200W,04/07 +M0BCG,IO91DO,EME,,,,144: ic706mk2g 2x4cx250b 4x9el elvation mgf1302 - 50: jst245 p50vdg 2x3-500z 2x6el,04/05 +M0BPQ,IO91WP,,,EX G7ACQ G5YC,,50: 400W 5el 144: 7el 400W 432: 13el 120W 1296 19el 50w,05/09 +M0CQZ,IN69UW,,,Expedition,,,09/00 +M0CTP,IO93,,,,,,03/02 +M0EME,IO93GF,EME,,,,432: FT847 4x 19el 100W,09/05 +M0IKB,IO94SG,,,,,,11/06 +M0ITY,JO01BS,,,OK2ITY OK2IT G6UT,,2m - 15+2x13+4x4el QRO / 70cm - 200w - 23el / 6m - QRO + 5el,11/07 +M0MIG,IO90WX,,,,,,10/06 +M0VHF,IO82VF,,,,,FT847 JST245 3CX800 8877 - 50: 5el - 144: 10el,10/02 +M1DRK,IO93US,,,,,50: TS60 5el 90W,01/02 +M1GSM,IO94BU,,,,,144: 150W 8el,08/03 +M5FUN,JO00DX,,,ex 2E0ATF+2E1GOM,,144: TR751E 100W 12el,03/04 +M5MUF,IO92JP,,,ex GU6AJE,,IC202 IC706 various transverters,09/03 +MI/DL1YMK,IO74DU,EME,,EXPEDITION,,,06/09 +MI0AYR,IO64VQ,,,,,144: TR9130 150W 19el,04/05 +MI0JST,IO65SE,,,,,144: IC910 100W 10el,06/05 +MI0KAM,IO65PE,,,,,,06/05 +MM0BQI,IO85KX,,,,,50: 100W 5el - 144: 13el,03/00 +MM0CCC,IO85MW,,,,,144: FT1000MP TVVF144A 17el 100W,05/04 +MM0CEZ,IO75XU,,,,,IC910 IC775DSP Transverter,03/04 +MM0DQP,IO88KI,,,,,100W,05/04 +MM0KOS,IO85CR,EME,,EX MM3KOS,,ICOM 290D MK2,07/07 +MM0MMK,IO85EV,,,,,,06/05 +MM1BXF,IO76PA,,,,,,01/03 +MM3ENW,IO85BS,,,,,,03/05 +MM5AJW,IO88KI,,,,,144: 100W 11el Vargaarda,01/08 +MM5DWW,IO89ID,,,ex MM1MVJ,,KENWOOD TR751/TS690 100W 11el,04/04 +MS0FNR,IO88KK,,,,,,12/04 +MW0HMV,IO71XT,,,2W0CDJ,,FT2000 & EXPERT 1K 6M - IC910X 2M 70CM 23CM - TS2000 with TRC410sl & te 0650g,06/09 +N0AB,EM28,,,,,,01/03 +N0AE,EN51,,,,,,01/03 +N0AJU,EN11,,,,,,01/03 +N0AKC,EN44GU,EME,,,,144: 4x 18el 1KW 222: 350W 16el,10/05 +N0ATV,EN34JX,,,,,,01/03 +N0BTN,EN21,,,,,,01/03 +N0CIH,EN42,,,,,,01/03 +N0CKK,EN34,,,,,,01/03 +N0DAG,EM29QF,,,,,,01/03 +N0DQS,EN22GD,,,,,,07/01 +N0DY,EN42FA,,,,,,01/03 +N0EC,DN70LF,,,,,50: 1KW - 144: 1-5KW - 222: 120W - 432: 1KW - 902: 200W - 1296: 100W - 2304: 15W - 3456: 1W - 10G: 1W,01/01 +N0ECI,EM37,,,,,,01/03 +N0EOQ,EM24,,,,,,01/03 +N0FFO,EM17,,,,,,01/03 +N0FQW,EM39,,,,,,01/03 +N0GPH,EM48,,,,,,01/03 +N0GXA,EN13QH,,,,,144: 1KW preamp 18el,01/98 +N0GXN,EM48,,,,,,01/03 +N0HJZ,EN34FV,,,,,144: TS700S 200W preamp 12el,01/01 +N0HKT,EM17,,,,,,01/03 +N0HZ,EN34,,,,,,01/03 +N0ICV,EN52XA,,,,,,01/04 +N0IDT,EN10,,,,,,01/03 +N0IS,EM48,,,,,,01/03 +N0IT,EM48RN,,,,,144: 170W,01/01 +N0JCF,EN35,,,,,,01/03 +N0JEQ,EM27,,,,,,01/03 +N0JK,EM17,,,,,,01/03 +N0KE,DM69,,,,,,01/03 +N0KEV,EM17,,,,,,01/03 +N0KIS,EN10QT,,,,,,01/03 +N0KM,DM67VR,,,,,,01/97 +N0KN,EM28,,,,,,01/03 +N0KQY,DM98GK,EME,,,,144: 15/19dbd antenna 1KW,02/01 +N0LIK,EM48,,,,,,01/03 +N0LL,EM09,,,,,,01/01 +N0LNO,EN42,,,,,,01/03 +N0LRJ,DM78,,,,,,01/03 +N0NAS,EN35,,,,,,01/03 +N0NEG,EM29,,,,,,01/03 +N0NHS,DN70LF,,,,,,01/03 +N0OIB,EN35,,,,,,01/03 +N0OYQ,EN25,,,,,,01/03 +N0PB,EM39WO,,,,,,11/01 +N0PJU,EN41,,,,,,01/03 +N0POH,DM79OP,,,,,,01/01 +N0QBF,EM48SR,,,,,,01/03 +N0REN,EN34,,,,,,01/03 +N0RHL,EN10RT,,,,,,01/03 +N0RQ,EM13RG,,,,,144: Icom IC-746PRO,06/06 +N0SBU,EN35,,,,,,01/03 +N0SHR,EN26,,,,,,01/03 +N0SRQ,EN18,,,,,,01/03 +N0SWV,DM79,,,,,144: 170W 2x16el - 432: 35W 2x18el - 1296: 60W Rhombic Array,05/98 +N0TOU,EM29,,,,,,01/03 +N0TVJ,FM03UW,EME,,,,,10/05 +N0UGY,DM79,,,,,,01/03 +N0UK,EN34JV,,,,,50: 10W KLM661 - 144: TS930/DEM Tvtr 300W K1FO-12 - 222: TS820/HB Tvtr Amp,07/01 +N0US,EN10,,,,,,01/03 +N0UU,EM18,,,,,,01/03 +N0VSB,DM79RJ,,,,,50: 1KW 7el - 144: 1.5KW 18el MGF- 222: 200W 23el MGF- 432: 200W 38el MGF- 902: 25W 4x33el - 1296:50W 2x55el,01/02 +N0WJY,EN10QT,,,,,,01/03 +N0WVU,DM79HV,,,,,,01/03 +N0WX,EN34,,,,,,01/03 +N0XKS,EM29,,,,,,01/03 +N0XPI,EM29,,,,,,01/03 +N0YGM,DM78OV,,,,,,01/03 +N0YK,DM98MG,EME,,,,144: 18xxx with 350W,05/06 +N0YNP,DN81CW,,,,,,01/03 +N0ZEB,DM79,,,,,,01/03 +N0ZKK,EM29,,,,,,01/03 +N1BUG,FN55MF,EME,,,,50: 400W 5el 144: 1500W 20el Yagi 222: 500W 24el 432: 550W 22el,11/04 +N1CPE,FN42QH,,,,,,01/03 +N1EKV,FN42JK,,,,,,01/03 +N1GMV,FM05TU,,,,,,01/04 +N1GOD,FN41VQ,,,,,,01/03 +N1HOQ,FN41TP,EME,,,,144: 12el 400W,11/06 +N1IW,EN75ve,,, +N1JEZ,FN34IM,,,,,FT736 FT847 FT920 FT290 DSP10 ACOM1006,05/07 +N1KI,EM75WX,EME,,WB4KMH,,144: 4x 12el 1500W - 432: 2x 9wl 1000W,04/07 +N1KTM,FN41SR,,,,,144: 1kw- 2x2M9,01/97 +N1LDY,FN41JR,,,,,IC-746 IC-910 DEMI-222 DEMI-903,01/04 +N1LF,EM63NF,,,,,IC-910H 736R Icom 746 Pro,04/08 +N1MIW,FN41EQ,,,,,FT847 FT736,05/08 +N1NCO,FN42GL,,,,,,01/03 +N1OFZ,FN31HL,,,,,FT-847 SDR-1000 FT-726R,03/07 +N1RWY,FN54NO,,,,,50: 100W 3el CC - 144: 800W 18el - 222: 350W FO16 - 432: 350W 2xFO22,01/01 +N1RZ,FN44EI,,,,,,07/01 +N1SZ,FM19NE,,,,,IC 756Pro,10/07 +N1VQR,FN42JJ,,,,,,01/03 +N2CEI,FN20,,,,,,01/03 +N2FKF,FN30BR,,,,,,01/04 +N2HLT,FN12LN,EME,,,,,01/03 +N2IQ,FN13TD,EME,,,,,01/03 +N2IQU,FN13,,,,,,01/03 +N2JDQ,FN20VG,,,KB2GWI,,IC820H,09/07 +N2JMH,FN13AF,,,,,,01/03 +N2JQR,FN13,,,,,50: 500W 5el,01/01 +N2JR,FM18CP,,,,,50: 100W 5el,09/01 +N2KW,FN03XE,,,,,,01/03 +N2MB,FN30CO,,,,,,01/03 +N2MCY,FN30AR,,,,,,01/03 +N2MKT,FN13LK,,,,,,01/03 +N2MSS,FN31AA,,,,,,01/03 +N2NEP,FN13EB,,,,,,01/03 +N2NZI,FN32,,,,,,01/03 +N2OLA,FN12MM,,,,,,01/03 +N2OTO,FN30CR,,,,,144: TS850 LT2SMKII 200W 4el,01/01 +N2PC,DM78QX,,,,,,01/03 +N2UO,FM06BG,EME,,,,All homebrew,09/07 +N2VR,FN12SK,EME,,ex KC2EAL,,144: 4x13B2,08/01 +N2WK,FN03XE,EME,,,,144: 1-5kw 4x2.2 wl full elv. MGF1302,10/00 +N2WLS,FN02RQ,,,,,,01/03 +N2XK,FN20RF,,,K2WKA,,FT1000MP MKV with FTV-1000 6M Icom IC706MKIIG 2M/70CM,11/08 +N3AHF,FN20SF,,,,,,01/03 +N3AJX,EN71KC,,,,,,01/03 +N3FA,FN21,EME,,ex WB3FAA,,144: LT2S 8877 700W 4x12el M2 - 432: FT736 SP7000 3CX800 700W 4x19el,10/99 +N3JNP,EN91,,,,,,01/03 +N3KKM,EM28,,,,,,01/03 +N3LL,EL86,EME,, +N3NDY,DM09CJ,,,,,Kenwood TS-60,03/08 +N3OPM,FM19PH,,,,,,01/01 +N3RN,FN11WH,,,,,144: 500W 16el KLM,07/01 +N3TAD,FM28FH,,,,,TS-480HX FT-847,09/07 +N3WT,FM19EJ,,,,,,01/04 +N3WXW,FN20CE,,,,,,01/03 +N3XI,EN90XJ,,,,,,01/03 +N3YGA,FN20BI,,,,,50: 160W 4el - 144: 170W 14el,01/98 +N4BH,EM95OC,EME,,,,144: 400W 17el,10/08 +N4CAG,EM86PI,,,,,,01/03 +N4EQT,EM77,,,,,,01/03 +N4FRE,EL06LL,,,,,,01/03 +N4GJV,EM95PS,EME,,,,,05/98 +N4GKO,EM65LO,,,,,144: FT736r 350W 2M18XXX,01/01 +N4HN,EM95OE,,,,,TS-2000X,05/09 +N4HY,FN20RG,,,,,,01/04 +N4IP,EM73WV,,,,,,01/03 +N4IPB,EM66,,,,,,01/03 +N4IS,EL96UB,,,ex AB6WC- PY2DP....,,FT1000MP+Trsv 144: 350W 18el M2,06/01 +N4KWX,FM08WF,,,,,,01/97 +N4KZ,EM77GT,,,,,,09/01 +N4LXB,EM83VL,,,,,,01/03 +N4MW,FM17KN,EME,,,,,01/03 +N4OYS,EM65,,,,,,01/03 +N4PZ,EN52,EME,,,,,04/97 +N4SC,EN72,,,,,,11/04 +N4TWX,EL89TW,,,,,50: 5el 75W - 144: 15el 150W Preamp,01/01 +N4UK,EM84XP,EME,,,,144: 1KW 13/13el - 222: 750W 23elM2 - 432: 750W 4x19el,01/97 +N4WI,FM14IL,,,,,,01/04 +N4XD,FM05,,,,,144: TS700SP 160W,01/01 +N4ZKR,EM65,,,,,,01/03 +N4ZRW,EM17KN,,,,,,01/03 +N5AC,EM13QC,,,WD5EMG,,Many,01/08 +N5AF,EM20,,,,,,01/03 +N5AHD,EL17,,,,,,01/03 +N5AMA,EL29,,,,,,01/03 +N5ARS,EM26,,,,,,01/03 +N5AXJ,EM86,,,,,,01/03 +N5BA,EL29FX,,,,,144: 150W 18el,07/05 +N5BHO,EM31,,,,,,01/03 +N5BHX,EL09,,,,,,01/03 +N5BHZ,EM22,,,,,,01/03 +N5BLK,EL29,EME,,,,,02/05 +N5BLZ,EM20AB,EME,,temp. QRT now 10/05,,144: IC746 to homebrew 8877 PA 1 5/8 Andrews 4x 28 Xpol preamp 0.3db,09/06 +N5BO,EM60UR,EME,,,,6M5X/100 2x2m9/400w 70cm 13wl/200w,04/07 +N5DL,EM36,,,,,,01/03 +N5EIL,EM12UR,EME,,,,144: 15el 50W,05/05 +N5EM,EL29,,,,,,01/03 +N5FV,EM03,,,,,,01/03 +N5HHS,EL29,,,,,,01/03 +N5IRM,EM13RC,EME,,,,144: 2x 12el 300W,01/06 +N5IS,DM96,,,,,,01/03 +N5ITO,EM12MR,EME,,ex KA9JLU,,144: 17el 750W - 432: 4x 18el 250W,11/05 +N5JM,EL49,,,,,,01/03 +N5KDA,EM41HM,EME,,,,144: 4 x 17el 1.5 KW,09/07 +N5KWB,EM32QB,,,,,,01/03 +N5MP,EM12,,,,,,01/03 +N5MWS,EM13,,,,,,01/03 +N5MYH,EM32,,,,,,01/03 +N5NDV,EM15,,,,,,01/03 +N5NSH,EM14,,,,,,01/03 +N5OCP,EM15,,,,,,01/03 +N5OSK,EM25FI,EME,,,,144: 26B2 350W,06/05 +N5QGH,EM13QC,,,,,,01/03 +N5QS,EM45,,,,,,01/03 +N5QT,EM45,,,,,,01/03 +N5RZ,DM81XW,,,,,,01/03 +N5SAL,EM28,,,,,,01/03 +N5SIX,EM42XI,EME,,,,144: 500W 9el,06/05 +N5TML,EM14,,,,,,01/03 +N5TQB,EM31PJ,,,,,,01/03 +N5TX,EL09,,,,,,01/03 +N5WS,EL09RU,,,,,,01/01 +N5XCX,EL09,,,,,,01/03 +N5XU,EM10DG,,,,,,01/01 +N5YLS,EM54,,,,,,01/03 +N5YSM,EM15,,,,,,01/03 +N5ZLU,DM95,,,,,,01/03 +N5ZWO,EM32,,,,,,01/03 +N6CL,EM26,,,,,,01/03 +N6CV,DM04UF,,,,,,01/03 +N6CW,DM12JT,EME,,,,50: 7el 1KW 144: 4x 9el 1KW,12/07 +N6DHN,CM98,,,,,50: 150W 4el - 144: 150W 22el - 432: 100W 40el,01/98 +N6ENU,DM04,,,,,144: 270W 13el Yagi - 50: 100W 7el,01/01 +N6HV,DM04,,,,,,01/03 +N6KBX,CM98,,,,,50: 400W 2x5el - 144: 350W 4x17el - 432: 175W 2x33el,01/97 +N6KK,DM03TV,EME,,,,144: 2x 5wl Ant 1500W,10/06 +N6KMR,CM97MO,,,,,,01/03 +N6NB,DM05,,,,,,01/03 +N6OVP,CM87,EME,,,,,01/03 +N6PYI,DM05KJ,,,,,,01/03 +N6RA,CM87SR,,,,,,01/03 +N6RJM,DM14CP,,,,,50: 1KW 9el - 144: 1-5KW 4x18el - 222: 350W 2x7wl - 432: 1KW 2x13wl,01/01 +N6RMJ,DM14CP,EME,,,,IC-910H / IC-756Pro,05/07 +N6RPM,DM04UA,,,,,,01/03 +N6RZ,CM87WB,,,,,144: 1KW 17B2,01/01 +N6SPP,CM97AX,EME,,,,10ele 2m IC746 FT857D Elk,10/07 +N6TQS,CM87UU,,,,,,01/03 +N6TX,FN11LH,EME,,,,,01/03 +N6VHF,DM13,,,,,,01/01 +N6VMO,CM94SP,EME,,,,144: 2x 17el 350W,08/06 +N6YM,CM88XF,,,,,,01/01 +N6ZE,DM04NE,EME,,ex K1FJM,,IC756 PRO II 50: 100W 5el - 144: 8930Amp 2M5wl Preamp - 222: 75W 10el - 432: 75W 21el - 1296: 20W 33el,08/03 +N7AM,CN87QN,EME,,,,,08/03 +N7AMA,DM33,,,,,,01/03 +N7ART,CN87,EME,,,,,01/03 +N7AVK,CN84,,,,,,01/03 +N7BSN,CN87QQ,,,,,,01/03 +N7CZ,DN47HM,,,ex KQ7K,,FT736 IC706,01/02 +N7DMA,DM42NL,,,,,,01/03 +N7EMD,DM26JE,,,,,,01/03 +N7EY,CN96QO,,,,,,01/03 +N7IJ,DN44GB,,,,,,01/03 +N7LQ,DN01FA,EME,,ex WB7TDI,,432: 1.5KW 4 x FO-25's,06/00 +N7MWV,CN87VQ,,,,,144: 250W CC3219,01/01 +N7QJP,DM33VM,,,,,,01/98 +N7SKT,DM33SN,,,,,,01/01 +N7WNX,CN83OW,EME,,,,,12/04 +N7WS,DM42JH,,,,,144: 8877 17el GaAs,01/01 +N7YAG,CN85,,,,,144: FT736r 300W 11el KLM,01/98 +N7YAP,DN07HJ,,,,,,08/01 +N8AIA,EN82KL,,,,,,01/03 +N8ASB,EM89,,,,,,01/03 +N8AXA,EM79UP,EME,,,,,01/03 +N8BSG,EN82,,,,,,01/03 +N8BXP,EN81,,,,,,01/03 +N8CGY,EN74OH,,,,,,01/01 +N8CJG,EN84FG,EME,,,,,03/05 +N8CJK,EN84FG,EME,,,,,11/05 +N8CQ,FM05OT,EME,,,,,01/04 +N8DJB,EN81FJ,EME,,,,,01/03 +N8ITP,EN81XF,,,,,,01/03 +N8JMK,EN90,,,,,,01/03 +N8KWX,EN62AD,,,,,,01/03 +N8LCU,EN72,,,,,,01/03 +N8NPX,EM79XR,,,,,,01/03 +N8OC,EN83AO,EME,,,,50: 100Watts 7el hb - 144: 1500Watts 17ele M2 5wl,08/05 +N8PUM,EN66DL,,,,,144: 200W 2x17B2,01/98 +N8PVT,EN64,,,,,,01/03 +N8QOD,EN79,,,,,,01/03 +N8TDL,EN90BN,,,,,,01/03 +N8VES,EM79VT,,,,,,01/03 +N8ZAT,EM79,EME,,,,,01/00 +N8ZAW,EM79,,,,,,01/03 +N8ZM,EM79,,,,,,01/03 +N9AB,EN52XG,EME,,,,432: 16x 22el 1KW,09/05 +N9AQ,EN51,,,,,,01/03 +N9AU,EN62BX,,,,,,01/03 +N9AZC,EM68,,,,,,01/03 +N9AZZ,EM57MV,,,,,,01/03 +N9BD,EM28,,,,,,01/03 +N9BJG,EM57,,,,,,01/03 +N9BMH,EN62,,,,,,01/03 +N9BX,EN52VL,EME,,,,144: 2x 18el 1KW,01/07 +N9CIQ,EN44,,,,,,01/01 +N9DCA,EN71GG,,,,,,01/03 +N9DG,EN53BJ,,,,,,01/03 +N9EGT,EN70,EME,,,,,02/05 +N9EMC,EN52UI,,,,,,01/03 +N9ESH,EN52XB,,,,,,01/03 +N9FH,EN63,,,,,,01/03 +N9FTC,EL79IX,,,,,IC 756 PRO IC746,10/07 +N9GVF,EN62,,,,,,01/03 +N9HF,EN52,,,,,,01/03 +N9IJ,EN52XI,,,,,,01/03 +N9IW,EN65KF,EME,,,,50: 3 yagi,02/09 +N9JIM,CM87XI,,,ex WB9AJZ,,50: 9el 150W - 144: 16el 700W - 432: 21el 50W - 1296: 55el 30W - 10G: 1M 8W,11/03 +N9KC,EN52,EME,,,,,01/03 +N9LAG,EM57,,,,,,01/03 +N9LHD,EN62BA,,,,,,01/03 +N9LR,EN50DU,EME,,,,144: 4x 8el 1500W,08/05 +N9MEH,EN44,,,,,,01/03 +N9MSG,EN50ES,,,,,,01/03 +N9MYK,EN-53W,,,,,,01/03 +N9NHC,EN61DU,,,,,,01/03 +N9NJY,EM58AM,,,,,,01/03 +N9NOQ,EN51,,,,,,01/03 +N9OO,EN62,,,,,,01/03 +N9PXI,EN61CU,,,,,,01/03 +N9RLA,EM78CQ,,,,,,01/03 +N9SBV,EN61UQ,,,,,,01/03 +N9SS,EN50DP,EME,,,,TS-2000,08/07 +N9SU,EN62BI,EME,,,,2x 3wl 400W,02/09 +N9TZL,EN52SH,,,,,,01/03 +N9UDO,EN53DL,,,,,,01/03 +N9UM,EN52wg,,, +N9UUR,EN63,,,,,,01/03 +N9VSV,EN63,,,,,,01/03 +N9WWR,EN62CS,,,,,,01/03 +N9XG,EN60VL,EME,,W9/G4FDX LX2GB,,144: 4x 18el 1.5KW,03/09 +N9XIX,EN53,,,,,,01/03 +N9YKE,EN62,,,,,,01/03 +NA0IA,EN42FB,,,,,,01/03 +NA2NY,FN23DV,,,NA1VT,,FT-1000 MP MK5 FTV-1000 IC-910,09/07 +NA3T,FM05LW,EME,,,,,10/97 +NA4AL,EM63OF,,,,,IC746 FT817,08/01 +NA4M,EM10DP,,,,,,01/03 +NA4N,FM18,EME,,,,,01/03 +NA6E,CN82,EME,,,,,01/03 +NA6MF,CM87,EME,,,,,04/08 +NA7D,DM43AS,,,,,,01/03 +NB2V,FN30,,,,,,01/03 +NC1I,FN32OB,EME,,,,,01/05 +NC1T,FN32,,,,,,01/03 +ND2X,EL09,,,,,,01/03 +NE0P,EM04,,,,,,09/01 +NE1H,EM84AC,,,,,,01/03 +NE7O,FN53HX,,,,,,01/05 +NE8I,EN82JM,,,,,,06/04 +NF0Q,EM48,,,,,,01/03 +NF2V,FN33KT,EME,,,,144: 4x 17el 350W,09/07 +NF5B,EL29,,,,,,01/03 +NF7P,DM09GH,EME,,,,,01/03 +NG9R,EN40LA,,,KC9OA,,,07/08 +NG9Y,EM78JT,EME,,,,144: 4x 13el 400W,10/08 +NH2CM,QK23KL,EME,,,,144: 4x 13el CushCraft 900W,12/05 +NI4Z,EL98HJ,,,,,,01/03 +NI6G,DM06,,,,,,01/03 +NJ0C,DM78,,,,,,01/03 +NJ0U,EN71IB,EME,,,,144: 2x 18el 500W,05/05 +NJ0X,EM29,,,,,,01/03 +NJ2L,FN13,,,,,,01/03 +NJ7A,DN30XP,,,,,144: 170W 16LBX Preamp - 222: 120W 5wL,01/01 +NK5F,DM65,,,,,,01/03 +NK7J,DM33,,,,,,01/01 +NK8Q,FN20KL,,,,,144: 170W 13el - 50: 7W 5el,01/01 +NL7F,BP64DV,EME,,,,,01/03 +NL7Z,BP51EN,EME,,,,FT920,03/05 +NL997,JO22XU,EME,,,,FT726 + Mutek TH F7E 8el 2wl @2m 10 el @70cm,05/09 +NM1A,EL96UG,,,,,IC-746,02/08 +NM5BB,DM65UV,,,,,,01/03 +NM5X,EM26,,,,,,01/03 +NM9H,EM59CD,,,,,,01/03 +NN5DX,DM80NV,,,,,,01/03 +NN6RF,CM87UW,,,,,,01/03 +NN7J,CN85,,,ex WA7BJU,,,01/05 +NN7K,DM09CN,,,EX K7ZFG,,50 FT847 MK6 7el M2,05/08 +NN9K,EN41,,,,,,01/98 +NO3I,EN90,EME,,KD3CC,,FT-1000 MP FT-920 FT-736R,05/07 +NP4B,FK67,EME,,,,,01/03 +NQ2O,FN13,EME,,EX DL1SM,,,05/01 +NQ7R,DM42DT,EME,,,,144: 120W 2.5wl Ant,10/06 +NR0X,EN42JH,,,ex DL4AT,,144: 12el,07/05 +NR5A,DN84LC,,,,,,01/03 +NR6E,CM88,,,,,,01/03 +NS4W,EM76VC,,,,,500: 1KW - 144: 1kw 2.5wl - 222: 400W - 432: 150W,01/01 +NS7K,DN31XC,,,,,,01/04 +NS7N,CN87,,,,,,01/03 +NT0V,EN08OC,,,,,,01/03 +NT0Z,FN31,,,,,,01/03 +NT4P,EM95KF,,,,,,01/04 +NT9E,EN52VI,,,K9DMW WB9SES,,756ProII (HF+6)-Elecraft XV Series Xvrtrs for 144-220-432,02/09 +NU3E,FN20PB,,,WB3GNB,,TS-2000,09/07 +NU5O,EM55,,,,,,01/03 +NU7Z,CN87RT,,,,,,01/93 +NU8I,DM43AN,,,,,144: IC706 1KW,01/99 +NV3Z,FM15,,,,,,01/03 +NW0X,EM40,,,,,,01/03 +NW7O,DM26,,,,,,01/03 +NX2Q,FN20WV,,,,,,01/03 +NX7U,DM43DI,,,,,,01/03 +NX8M,EM79PE,,,,,,01/01 +NZ1I,FN41AI,,,KA1KOJ,,Yaesu FT-897 Yaesu FT-736R,04/07 +NZ5N,EL96UC,EME,,,,144: 9el 500W,12/07 +NZ5P,DM95,,,,,,01/03 +OA4CVT,FH17KW,EME,,,,144: 15el 160W,04/06 +OA4O,FH17FV,EME,,,,432: 8m dish 400W,07/05 +OD5NJ,KM73TW,,,,,,01/03 +OD5RAK,KM74WH,,,Expedition - QSL via F6FLV,,50: 6el - 144: 17el+ PA,05/98 +OE1ILW/3,JN77XX,EME,,,,,04/09 +OE1MCU/P,JN88HE,,,,,144: 700W 13el,01/09 +OE1MSB,JN88DF,,,,,,10/03 +OE1SMC,JN88DD,,,,,IC7000,03/08 +OE1SOW,JN88FF,EME,,,,6m: 100W 5el - 2m: IC-756 Pro II + DB6NT-Transverter 400W 4x13el SP-2000 or IC-821 130W 13-El. Yagi SP-2000,05/08 +OE1XVC,JN88ED,,,,,144: 2x11el- 432: 2x21el gd Pwr,03/98 +OE3A,JN77XX,EME,,,,,04/09 +OE3CEW,JN88,,,,,,01/88 +OE3FVU,JN78VE,EME,,= PE0WGA,,144: 4x10el XPol 1500W MGF1302 - No 432 MHz - 50: 100W / 6 ele,07/08 +OE3HHB,JN87AQ,,,,,FT847 50: 100W 5el - 144: 50W 17el GaAs - 432: 50W 19el,07/99 +OE3JPC,JN88EW,EME,,2ND QTH,,,06/08 +OE3JTB,JN78QN,,,,,144: 17B2 160W,08/05 +OE3MWS,JN88DC,,,,,50: 100W 7el - 144: TR751 1-2KW 2x17el MGF1302 - 432: TS811 400W,01/05 +OE3NFC,JN88,,,,,,01/93 +OE3OBC,JN88,EME,,,,,01/94 +OE3OKS,JN87AR,,,,,,12/98 +OE3R,JN88FD,,,Contest Call,,,01/96 +OE3SJA,JN88GH,EME,,= OE1SJA SAME OPERATOR,,144: 1x19 250W 432: 4x19 250W LNA 1296: 2mDish H-feed 80W LNA,01/09 +OE3UP,JN87CT,EME,,,,,01/93 +OE3XAC,JN88FD,,,,,,11/96 +OE3XMU,JN78XD,,,,,144: 150W 15el,06/02 +OE4KLU,JN87KS,,,,,,01/96 +OE4WHG,JN87BB,,,ex OE6WHG,,50: F850 100W 6el,05/06 +OE5EFM,JN78,EME,,,,,01/94 +OE5EYM,JN68SK,EME,,,,,08/98 +OE5FD,JN68SC,,,,,,01/03 +OE5FDM,JN68SC,,,,,50: FT-847 5el-Yagi 100W - 144: FT-847 9el 100W,08/02 +OE5JFL,JN68RL,EME,,,,,01/94 +OE5KE,JN78,,,,,,05/02 +OE5MPL,JN78CJ,EME,,,,FT847 - 50: GS35 100W 5el Y 144: 2x 4CX250R 800W 4x 13elY MGF1302 432: 600W 4x 21 el MGF1302,05/07 +OE5VHL,JN68SI,EME,,,,,01/94 +OE5VRL,JN78DK,,,,,,01/97 +OE5WHN,JN67TR,,,,,IC756 IC970 100W,05/09 +OE6AHD,JN76RS,,,,,,12/95 +OE6BMG,JN77JE,,,,,,07/00 +OE6IWG,JN77PK,EME,,,,144: GS35b 4x10el (2-2wl) MGF1302,06/07 +OE6JGD,JN77QC,,,,,,12/95 +OE6KDG,JN77JF,,,,,,07/03 +OE6NLD,JN76SS,,,,,,01/93 +OE6RKE,JN76OT,EME,,,,,03/06 +OE6XHF,JN76RS,EME,,,,,01/94 +OE75SOW,JN88FF,EME,,SpecialCall,,50: IC736 100W 5el - 144: IC821H 300W 2x13el or 2xBW - 432: 120W 2x19el - 1296: 10W 2x26el,03/01 +OE8CIQ,JN76FU,,,,,,08/02 +OE8HBQ,JN76KP,,,,,,05/04 +OE8HWQ,JN76,,,,,,03/00 +OE8OLK,JN76DM,,,,,144: FT817 30W 6el,07/04 +OE9ERC,JN47VL,EME,,,,,02/05 +OE9HHV,JN47,EME,,,,,01/94 +OE9XXI,JN47UL,,,,,,01/03 +OF8UV,KP34VJ,EME,,SpecialCall,,144: Ft225RD 130W 2x14el BF981,11/97 +OG6MAZ,KP21IG,,,SpecialCall,,144: FT767GX 4CX350 200W 15el,01/00 +OG8HDL,KP34VJ,,,SpecialCall,,144: 130W 2x14el BF981,01/00 +OG8UV,KP34VJ,EME,,SpecialCall,,144: FT225RD 130W 2x14el BF981,01/00 +OH0BT,KO09KW,,,Expedition,,,01/92 +OH0JFB,JP90XI,,,,,144: 2x17el 800W,04/04 +OH0JN,KP00BB,,,,,IC706MKIIG,02/09 +OH0LIZ,KO09KW,,,Expedition,,144: 180W 2x23el,05/98 +OH0N,KP00,,,EXPEDITION,,,07/01 +OH0V,KP00,,,Expedition,,,07/01 +OH10TA,KP10DH,,,EXPEDITION,,,04/07 +OH1AK,KP01TE,,,,,,12/03 +OH1AYQ,KP12JB,,,,,,08/98 +OH1BAP,KP12AA,,,Expedition,,,01/91 +OH1CF,KP00TC,,,,,,01/94 +OH1FA,KP10PL,EME,,,,,10/02 +OH1HSC,KP10CM,,,,,144: TR9130 60W MGF1302 17el,01/01 +OH1JCS,KP10AE,EME,,,,144: 2x 10el 20W,03/05 +OH1JJC,KP10DK,,,,,,01/04 +OH1JV,KP10DK,,,,,144: IC7800 TR144J 4x 6el HL500V Preamp 0.35db,02/07 +OH1LEU,KP01UE,,,,,50: 150W 8el,09/03 +OH1LSQ,KP03SD,,,,,144: 100W ant-3WL,01/02 +OH1MDR,KP01VJ,EME,,= OH1TM,,,07/07 +OH1ND,KP00XL,EME,,,,,01/07 +OH1NOR,KP00XL,EME,,,,144: 2x 3.9wl antennas,04/05 +OH1QC,KP10MU,,,,,,01/89 +OH1TM,KP01VJ,EME,,= OH1MDR,,,07/07 +OH1XT,KP01UK,,,,,FT736r 50: 8el 150W - 144: 300W 2x15el MGF1302,11/01 +OH1XTK,KP01UK,,,,,,01/03 +OH1ZAA,KP01,,,,,,01/95 +OH2AUK,KO19TX,,,,,,01/94 +OH2AV,KP20JD,,,ex OH9NLO,,,01/94 +OH2AXH,KP20OK,EME,,,,,08/00 +OH2BAP,KP20PP,EME,,,,,01/93 +OH2BC,KP20,EME,,,,,03/05 +OH2BNH,KP20LG,EME,,,,,05/00 +OH2BYJ,KP10QO,EME,,,,144: ft-897 120 wtts ant 6wl yagi,04/08 +OH2DG,KP30CK,EME,,,,DISH 8m,03/07 +OH2HEJ,KP20ME,,,,,144: 4el 100W,08/05 +OH2JRR,KP20HE,,,,,,10/05 +OH2KKP,KP20MH,,,,,,11/95 +OH2LAK,KP10XL,,,,,50: FT847 FT817,11/01 +OH2LHE,KP11MK,EME,,OH1IT,,IC-910 4x 9el 500W,02/08 +OH2MFE,KP20JE,,,,,IC-575H IC-275E 170W FT-817 100W FT-736,04/02 +OH2MOH,KP30CR,,,,,,05/04 +OH2MPH,KP20KD,,,,,,01/04 +OH2NHP,KP20IF,,,,,144: IC970E 3CX800 MGF1302 preamp 2x15el,01/01 +OH2NY,KP20CM,,,,,144: IC202 RE035XB 320W Preamp 4x9el,04/03 +OH2PO,KP10XH,EME,,,,,11/97 +OH2TI,KP20KE,EME,,,,,01/01 +OH2Z,KP30CR,,,,,,08/04 +OH3AWW,KP11VJ,EME,,2nd QTH,,144: 150W 9el,09/04 +OH3BHL,KP10RR,,,,,IC746+ACOM1000 144: 100W 4x5el - 50: 200W 6el,08/03 +OH3BZY,KP10XP,,,,,,01/92 +OH3EX,KP20JR,,,,,,01/94 +OH3HOV,KP20MQ,EME,,= OH3JP,,144: ft847 sr-200 17b2 Ant,01/07 +OH3JP,KP20MQ,EME,,= OH3HOV,,144: ft847 sr-200 17b2 Ant,01/07 +OH3KLJ,KP21PH,EME,,,,144: 300W 4x 10el,08/08 +OH3KRH,KP21EB,,,,,,12/05 +OH3LPW,KP11WK,EME,,,,,01/94 +OH3NWQ,KP11WL,,,,,50: FT847 + GU74b,10/07 +OH3QN,KP20TX,,,,,FT-897,02/08 +OH3UW,KP21FA,EME,,,,144: 2x 17el 250W,04/06 +OH3VJ,KP21,,,SilentKey,,,01/94 +OH3XR,KP11TH,,,= OH9XX,,IC746,08/04 +OH4EA,KP32MG,EME,,,,144: FT2000D + XV-144 + LNA 0.4 dB ANT 4 x 18 el 5WL,04/08 +OH4GGW,KP31PQ,,,,,,12/04 +OH4HXK,KP21UM,,,,,,05/02 +OH4LA,KP20LG,EME,,,,144: 4x 17el 600W,07/06 +OH4MS,KP31WL,EME,,OH8LRB,,IC-910H 144: 15el X 100W 432: 24el X 75W 1296: 4x32el 10W,12/07 +OH5A,KP53NE,,,,,,09/99 +OH5AG,KP31,,,,,,02/98 +OH5HCJ,KP41EC,EME,,,,144: 4x 11el 600W,10/06 +OH5HMV,KP41EC,EME,,,,,04/05 +OH5IY,KP30HV,EME,,,,144: 1KW 4x15el - 432: 750W 8x21el,12/03 +OH5KJQ,KP41JC,,,,,FT847 144: 19el yagi 160W - 50: 4el 100W,10/98 +OH5KNG,KP30GU,EME,,,,144: 4x 9el yagis 1.2kw,03/06 +OH5LID,KP41KL,EME,,,,,07/09 +OH5LIZ,KP30HW,,,EXPEDITION,,144: 180W- 2x23el,08/01 +OH5LK,KP30ON,EME,,,,144: 1KW 4x15el,04/04 +OH5YW,KP30FU,,,,,,05/98 +OH6AA,KP03SD,,,,,144: 2x12el,12/05 +OH6AAO,KP14,,,Expedition,,,01/93 +OH6AI,KP13MW,,,,,,11/00 +OH6AW,KP03,,,,,,06/02 +OH6DD,KP22,EME,,qrv only at OH2TI,,,01/94 +OH6GDX,KP02QU,,,,,144: 60W 2x12el CueDee,08/03 +OH6HFX,KP14RA,EME,,,,FT847 400W 2x12el,06/07 +OH6JKW,KP02RN,,,,,FT847,12/06 +OH6JW,KP12AJ,EME,,ex OH6MPC,,FT847 IC7400 600W,09/03 +OH6JYW,KP22OR,EME,,,,Yaesu FT-817,01/08 +OH6KTL,KP02OJ,EME,,,,50: 6el 150W - 144: FT847+GI46B 4x15el 100W,05/06 +OH6LRL,KP13,,,,,,11/00 +OH6M,KP12KR,,,,,,06/04 +OH6MAZ,KP21IG,EME,,ex OH2MAZ,,144: FT847 4CX350 250W 2x15el MGF1302,12/04 +OH6MPC,KP12AJ,,,= OH6JW,,FT847 50: 200W - 144: 2KW - 432: 250W,01/02 +OH6MRD,KP12EP,,,,,,12/02 +OH6MSZ,KP21XU,,,,,,08/99 +OH6MW,KP20IM,,,,,144: 200W 11el,08/05 +OH6NDD,KP23VH,,,Expedition,,,01/94 +OH6NVQ,KP13IP,EME,,,,,02/05 +OH6PA,KP02PL,,,,,,08/04 +OH6QU,KP03SD,,,,,FT-1000MP + Kuhne TR 144 H + GU-78B 16 el (4.5 WL) at 44 m agl/50 m,09/05 +OH6UW,KP22WH,EME,,,,,07/07 +OH6ZZ,KP12BO,EME,,,,TS790E 2x 32XPol,02/04 +OH7AXB,KP32WH,,,,,,10/05 +OH7EU,KP33MQ,,,,,,01/95 +OH7HXH,KP53HG,EME,,,,144: 8x 3wl Antenna,08/07 +OH7LIX,KP43JQ,,,,,,09/95 +OH7MA,KP52EL,,,,,144: 4 x 10el,11/99 +OH7PI,KP32XG,EME,,,,,01/05 +OH7RJ,KP32TV,,,,,,08/02 +OH7TE,KP20IE,,,EX OH9NLO,,JUMA TRX2A 50: 200W - 144: 4el 300W - 1296: 10W - 5600: 3W,04/09 +OH7TX,KP32UV,,,,,144: FT847 50W 20el,07/05 +OH7UV,KP33MQ,,,,,50:Yaesu FT950 100W Dipole or 4 el (HB9CV 4),05/09 +OH7X,KP20IE,,,OH7PS,,IC-7700,06/08 +OH8GEJ,KP25QC,,,,,,05/02 +OH8HDL,KP34VJ,,,,,144: 130W 2x14el BF981,08/99 +OH8HTG,KP34DI,,,,,144: 9el 80W 432: 19el 80w,04/07 +OH8LRB,KP24HQ,EME,,OH4MS,,icom ic-910H,10/07 +OH8MFH,KP34UG,,,NO MS Skeds!,,144: TR751A 15el 6WU,01/00 +OH8MGK,KP23PQ,,,,,,03/08 +OH8N,KP34VJ,,,Expedition - QSL via OH8UV,,,12/98 +OH8NW,KP24SX,,,,,,01/85 +OH8NXE,KP25SB,,,,,144: TM255E Preamp 160W 2x14el,01/02 +OH8R,KP24HQ,,,ex OH8LBR,,144: 200W 8el,04/05 +OH8SW,KP22UP,,,,,,11/04 +OH8UV,KP34VJ,,,,,50: Yaesu FT950 100 W 6el (JP6m6) 144: FT225RD 350W 4CX250R 2x14el (QDee) BF981,05/09 +OH8VJ,KP22UN,,,,,,11/04 +OH9AB,KP26,,,not qrv now,,,10/05 +OH9AEM,KN08AJ,,,Expedition,,,01/93 +OH9GDT,KP26VL,,,,,144: 4 Yagis,04/06 +OH9MNO,KP46BI,,,Expedition,,,01/91 +OH9MTY,KP46BI,,,Expedition,,FT847 - 144: 700W 6x9el,06/04 +OH9NDD,KP26UM,,,,,FT847 144: 150W 4x15el preamp,08/03 +OH9NMS,KP36GA,EME,,,,,08/06 +OH9O,KP12BO,EME,,QSL VIA OH8MSM,,IC7400 gd power 15el 16el 37el loop,12/05 +OH9SCL,KP46BI,EME,,Expedition,,TR751/FT847 144: 6x9el LY 700W,06/01 +OI7UV,KP33MQ,,,SpecialCall,,,12/95 +OI8UV,KP34VJ,EME,,SpecialCall,,144: Ft225RD 130W 2x14el BF981,01/97 +OJ0LA,JP90NH,EME,,Expedition,,144: 9el 150W,09/06 +OK1AXH,JO70UR,,,,,,01/97 +OK1CA,JO70GM,EME,,,,,03/08 +OK1CDJ,JO70VA,,,,,144: 250W 17el MGF1302,08/06 +OK1COM,JN79GX,,,,,,01/03 +OK1CT,JN69TR,,,ex OK1URY,,144: 250W 2x16el CF300 - 50: 20W 5el,05/00 +OK1CU,JO80CF,EME,,,,144: 4x 17el 700W,09/06 +OK1DCF,JO80BJ,,,,,,04/02 +OK1DFC,JN79GW,EME,,,,144: 750W 18elM2 10m dish - 432: 750W 38elM2 10m dish - 1296: 100W 10m dish and up,08/06 +OK1DIG,JO60XJ,EME,,,,144: 4x17el M2 GS35 1.5KW MGF1302,04/02 +OK1DKZ,JN69XP,,,,,144: IC275H 100W MGF1302 11el,11/01 +OK1DO,JO60JD,,,ex OK1DDO,,IC7400 144: 150W 7el 50: 100W 5el,03/06 +OK1DQA,JO60TC,,,,,,08/99 +OK1DRY,JN79OW,,,,,,07/02 +OK1DST,JN79EX,EME,,,,,04/07 +OK1DTC,JO60TO,,,,,,08/03 +OK1DUO,JO80CA,,,,,HF: TS120S 500W 3el - 144: IC746 PA0MS ant,08/01 +OK1FAV,JO60CK,,,,,,01/97 +OK1FD,JO60CF,EME,,ex OK1FFD,,50: IC706 5el QUAD - 144: 300W 4CX250 10el 7ZB,08/06 +OK1FF,JN78GR,EME,,,,,01/95 +OK1FM,JN69QQ,,,not qrv MS now! (01/01),,144: 250W 17el MGF1302,11/02 +OK1FXX,JO70WL,,,,,144: TS790E 2xGI7B 3KW 4x17el F9FT 0-4db NF - 432: TS790E GI7B 1-5KW 4x21el 0-9db NF DSP,01/90 +OK1FZA,JO70FC,,,,,,01/92 +OK1HAG,JN79,,,,,,01/97 +OK1IBL,JO60CG,,,,,,01/91 +OK1IN,JO60XA,EME,,ex OK1UND,,TS515 FT221 144: 16el 100W Preamp,02/06 +OK1KEI,JO60JL,,,,,,01/97 +OK1KF,JN79IW,,,OK1DFM,,,01/09 +OK1KHI,JO70ED,,,,,,05/02 +OK1KIR,JN79,EME,,,,,01/94 +OK1KJB,JN79IO,,,,,,08/99 +OK1KKH,JN79,,,,,,01/93 +OK1KRQ,JN69QR,EME,,,,144: 400W 17el M2 CF300,10/99 +OK1KRY,JN69TR,,,,,50: 20W 5el - 144: 250W 2x16el CF300,04/05 +OK1KT,JO70WE,,,,,FT 847 - 50: 20W 5 el - 144: 600 W 15 el CueDee - 432: 50W 21 el F9FT,05/07 +OK1MAC,JN79PQ,,,,,,08/08 +OK1MDK,JN79TO,,,,,,06/08 +OK1MS,JO70SL,EME,,,,,10/08 +OK1MZM,JN69PR,,,,,144: 300W 9el 360m asl,06/04 +OK1NH,JN69UH,,,,,144: 10el 20W,05/04 +OK1RK,JO70KD,EME,,,,144: FT847 250W 10el DK7ZB,08/05 +OK1TEH,JO70FD,EME,,,,144: FT847 1KW 10el - 432: 500W 23el K1FO,12/06 +OK1UGA,JO80DD,,,,,144: Icom 821 + 200W + 5WL,01/07 +OK1UWA,JN69QT,EME,,,,1296: par 2.4m 180W 0-45db NF,08/00 +OK1VAO,JO70EB,EME,,OL1VAO,,,02/09 +OK1VBN,JN78,,,,,,01/97 +OK1VHF,JO70EB,,,,,144: 10ml M2 1200W - 432: 6m Tonna 600W - 1296: 5m Tonna 10W,01/05 +OK1VHH,JO70CK,,,,,144: 20W,04/02 +OK1VKC,JN79OW,,,,,,05/02 +OK1VSC,JN79OW,,,,,144: 100W 7el Quad,03/02 +OK1VT,JN79IX,,,,,,07/01 +OK1VVT,JO60TP,,,OL4VTD,,TS-790,04/07 +OK1WCF,JO80BJ,,,,,144: R2CW PA 100W 2x 16el F9FT,04/04 +OK1WN,JN69LK,,,,,144: 100W 16el CF300,10/01 +OK1XXT,JO70GA,,,,,,04/02 +OK1YA,JO70GC,EME,,,,144: 4x 11el 1500W,03/06 +OK1YK,JN78GX,EME,,ex OK1AYK,,FT 847 144: 750W 4x 17el MGF1302 - 432: 1kW 5m dish MGF 1801,10/06 +OK2AB,JN89TI,,,,,,12/03 +OK2BDS,JN79WF,,,,,144: BMT226 100W 10el.7ZB - 432:IC706MKIIG 100W 2x 23el.7ZB - 1296: FT817+transv. 50W 32el.9BV,04/06 +OK2BMU,JN99BU,,,EX OL7AVX,,TM255E/TM455E + PA 150W 144: 13 el 432: 21el,04/07 +OK2BON,JO70,,,,,,07/02 +OK2BRD,JN99ET,,,,,IC706MKIIG,08/03 +OK2BXE,JN89SJ,,,,,144: FT847 100W 16el MGF1302 - 10368: 1.5W Dish,07/01 +OK2DL,JN89AO,EME,,,,,06/02 +OK2GM,JN99GM,,,ex OK2BZQ,,FT897D+LNA,03/07 +OK2ILA,JN89WW,,,,,,12/08 +OK2IT,JN99BO,,,= M0ITY G6UT - ex OK2ITY,,TRX210 Snezka 750W 2x4el Yagi,07/06 +OK2KET,JN89JN,,,,,,03/01 +OK2KUB,JN89,,,,,,01/93 +OK2KZR,JN89BO,EME,,,,,01/93 +OK2MWR,JN99HQ,,,,,144: IC706 100W 14el PBM,08/00 +OK2PM,JN99AO,,,ex OK2BGQ,,IC706 FT736,08/03 +OK2PMA,JN89HF,,,,,FT-897,10/07 +OK2PMG,JN89SJ,,,,,144: FT847 100W 16el MGF1302 - 10368: 1.5W Dish,07/01 +OK2PMS,JN89WW,,,,,FT847 300W DK7ZB,04/08 +OK2PMX,JN88IW,,,,,IC706,04/04 +OK2POI,JN99AJ,EME,,,,,07/08 +OK2PTC,JN89MM,,,,,,08/04 +OK2PWY,JN89IW,,,,,,05/06 +OK2PZW,JN89HI,,,,,,01/03 +OK2QI,JO80OC,,,,,,01/95 +OK2SBL,JN99HQ,,,,,,08/00 +OK2SGY,JN89SS,,,,,,08/96 +OK2SLC,JN89ED,,,,,,04/05 +OK2TUH,JN89RB,EME,,,,144: 7el 200W,03/06 +OK2UGG,JN89EN,,,,,,12/01 +OK2UZL,JN79UG,EME,,,,144: 4x 9el 50W,12/05 +OK2VMD,JN89HI,,,,,,01/94 +OK2VSO,JN99AJ,EME,,,,,03/06 +OK2WO,JN89IH,,,,,,04/04 +OK2XPJ,JN89,,,,,,04/02 +OK2YT,JN88IW,,,ex OK2PMN,,144: 100W 15el,08/06 +OK2ZAW,JN79XN,EME,,,,144: IC-706 12el ZZ212 300W GI7bt,02/05 +OK2ZC,JN89HI,,,OK2BEE,,ICOM 746-PRO 100W 7EL DK7ZB YAGI,05/08 +OK2ZI,JN89AD,,,EX OK2XTE,,,06/08 +OK2ZW,JN89HI,,,ex OK2PZW,,,08/02 +OK2ZZ,JN89DF,,,,,,08/96 +OK3RM,JN69MS,,,,,,12/07 +OK5ACR,JO60NX,,,,,,05/00 +OK5TK,JO70MB,EME,,OK1UAK,,100W 10el 2.2wl Yagi,05/07 +OK6TW,JN89,,,,,,08/08 +OK8BXF,JO70VA,,,,,,06/04 +OL2O,JN79IO,,,,,,12/01 +OL5MS,JN69MJ,,,,,,08/99 +OM2TW,JN88UG,,,,,144: IC746 17el LY,07/01 +OM3AU,KN08OR,,,SilentKey,,,01/93 +OM3BC,JN98VG,EME,,EX OM3WBC,,144: 1KW 4x 12el 432: 1kW 4x 23el,06/08 +OM3KDX,KN19DB,,,Expedition,,144: IC-746 GS35b 4x6 el. 18el. M2 - 10368: 5W 60cm dish,06/04 +OM3KKF,JN88MD,,,,,144: 700W 13el,07/05 +OM3KMY,JN88MK,,,ex OK3KMY,,,01/94 +OM3LQ,JN88MK,,,ex OK3LQ,,,08/01 +OM3TZZ,JN88TI,,,,,FT847+PA 400W+7el. QUAD,12/08 +OM4EX,JN98HS,,,,,,07/04 +OM5CM,JN98DF,EME,,EX OK3YCM OM3YCM OM7YCM,,IC910H 144 MHz: 100W 9el 432 MHz: 75W 18el 1296 MHz: 10W 55el,10/07 +OM5KM,JN98AH,,,,,,01/02 +OM5UM,JN98EO,,,,,,04/02 +OM7AC,JN98NN,,,EX OM3YIH OK3YIH,,FT225RD FT780 FT897D/2x10el DK7ZB/2m+17el DK7ZB/70cm+crossyagi for satellite,07/08 +OM7AQ,JN98UI,EME,,OL9CQN OK3TEM OM3TEM,,144: FT897D 600W 16el F9FT MGF1302 - 432: 400W 4x18el or 4x21el MGF1302 - 1296/2320: 10W 1m dish,03/07 +OM7CM,JN98NR,EME,,OK3CKJ,,144: FT - 847 50W F9FT - 9el,04/07 +OM7JG,JN98TI,,,,,,01/02 +OM9AAW,JN98EP,,,Expedition,,,07/95 +OM9M,KN18AM,,,,,,08/99 +ON1AEN,JO10UV,,,,,,01/03 +ON1AFN,JO20SW,,,,,144: FT290r 150W,09/98 +ON1ALJ,JO10SS,,,,,144: TS790E 3CX800 MGF1302 10el 9BV - 432: TS790E 400W 2x18el 9BV MGF1302,11/01 +ON1DDC,JO21UD,,,,,144: 16el 800W,08/97 +ON1RR,JO11XA,,,ex ON1AXO,,FT100,09/01 +ON2MRT,JO21MB,,,,,,07/03 +ON3VHF,JO20EM,,,ex ON2VHF,,144: ft290r microset RV45,08/05 +ON4ADC,JO21FA,,,,,,09/03 +ON4AMX,JO20KV,,,= OQ4U,,144: IC910 2x8wl GS35b,05/08 +ON4ARF,JO10MV,,,,,,05/02 +ON4ASL,JO21,,,,,,01/94 +ON4AVJ,JO11UB,,,,,144: IC275HE 3CX800A7 17el MGF1302,10/04 +ON4BBD,JO21NA,,,ex ON1CBT,,FT736 TS440S,01/04 +ON4BG,JO10WM,,,,,,12/01 +ON4CHP,JO21JD,,,,,144: 150W B5016G 11el FX224 SP2000,10/07 +ON4CJU,JO20,,,,,,11/01 +ON4DPX,JO10NT,EME,,ex ON1DPX,,FT736 FT847 144: 4x 3wl 1KW - 432: 2x 26el 9BV - 1296: 4x 44el 6WU,09/06 +ON4FI,JO20IV,,,,,144: 3CX800 600W 13el MGF1302,12/99 +ON4GG,JO20AR,EME,,,,50: 9el MGF1302,04/05 +ON4IMM,JO11UB,,,EX ON1IM,,144: TS440S + LT2S MK2 Preamp PA3BIY design 4x7el 3CX800A7 600W,02/08 +ON4IQ,JO20AR,EME,,ex ON4ANT,,50: 4x 6M9KHW FT1000mpMkV FTV1000 - 144: 8x 2M18XXX TS2000X GS35,05/05 +ON4KEP,JO10WI,,,,,,08/08 +ON4KHG,JO10XO,EME,,EX ON1KHN,,144 : 300W 4 WL MGF1302,10/08 +ON4KNG,JO20DU,EME,,,,,01/04 +ON4KST,JO20HI,,,,,,05/04 +ON4LDP,JO10UM,,,,,50: HM tsvter 2m/6m 30W GP - 144: 150W 13el MGF1302 432: 35W 21el - 1296: tsvter DB6NT 20W FHX35,06/02 +ON4LN,JO20IV,EME,,EX ON4CGP,,144: IC-746/IC-7000 GS35b 17ele M� MGF1302,05/07 +ON4LUC,JO20TM,EME,,,,144: ft1000mp transverter 800w hf max amplifier 13 el Flexa (soon 4x 13el),01/04 +ON4MU,JO20SS,EME,,ex ON1KPW,,Ft847 150W 0.5dB 3wl,08/03 +ON4PS,JO20KQ,,,,,Yaesu Ft 847 + 8874,03/07 +ON4QQ,JO20FS,,,,,,07/95 +ON5AEN,JO10VW,,,EX ON1AEN,,FT225RD TS770e FT690RII,04/08 +ON5GS,JO20SS,,,EX ON1DLL,,144: IC821 600W 15el,08/08 +ON5LGS,JO10OS,,,ex ON1LGS 3X1SG,,,09/03 +ON5UE,JO11LF,,,EX ON1BCD,,TS2000DX,05/07 +ON6AB,JO21EC,,,,,TS930S,03/04 +ON6JY,JO20WP,EME,,,,HF + Transverters,10/05 +ON6NL,JO21UE,,,,,144: IC756PRO 125W 13el DL6WU,04/08 +ON6OD,JO20HW,,,,,,01/93 +ON7EH,JO20FV,EME,,,,,08/04 +ON7KGK,JO20BL,,,ON1KGK,,k3,02/08 +ON7RB,JO11VA,EME,,,,144: 8x13el hor. & 8x12e vert. Full Az/El 1KW,11/03 +ON7UC,JO11ND,EME,,,,144: 3CX800A7 4x16el 4.2wl,05/07 +ON7YK,JO20XL,,,,,TS2000,04/07 +OQ1AEN,JO10VW,,,,,FT225RD TS770E,11/01 +OQ4U,JO20KV,,,= ON4AMX,,144: IC910 2x8wl GS35b,05/08 +OT4G,JO10XO,,,= ON4KHG,,144 : 300W 4 WL MGF1302 - 1296 : 10W 35 el,04/06 +OU9S,JO54TU,EME,,= 5P9S OZ9S OV9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +OV9S,JO54TU,EME,,= 5P9S OU9S OZ9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +OX2K,GP47TA,EME,,,,144: 4x5wl - 432: 4x28el - 1296: 32m dish,05/00 +OY3JE,IP62OA,EME,,,,,03/08 +OY4TN,IP62NB,,,,,144: 300W 8el,03/08 +OY9JD,IP62OA,,,,,,01/04 +OZ0JX,JO54VU,,,,,IC761 IC756 50: 5el F9FT,01/03 +OZ1ALS,JO45VA,,,,,144: 2x9el 500W,04/07 +OZ1CDE,JO65CO,,,,,50: FT847 6el 850W,02/02 +OZ1CLL,JO65GQ,,,,,,06/05 +OZ1CTZ,JO46OE,,,,,,01/02 +OZ1DJJ,JO65HP,EME,,,,FT847 IC756pro2 transverters,04/07 +OZ1DPR,JO45IG,,,,,50: Yaesu FT-920 GS35b 1000W 5el,08/03 +OZ1FDH,JO65CS,,,,,,07/99 +OZ1FF,JO45BO,,,OZ9KY,,1296: 145W LNA 1 5m dish 2320: 125W LNA 1 5m dish - 5760: 7W 1 5m dish - 10368: 65cm dish 2W- 24048: 65 cm dish 2W,09/07 +OZ1FTU,JO55WW,,,,,,01/93 +OZ1GEH,JO65AL,EME,,,,,01/93 +OZ1HNE,JO57,EME,,,,144: 4x18el crossyagi 8877,12/05 +OZ1HTB,JO75,,,,,,11/96 +OZ1IEP,JO55XU,EME,,,,50: 100W 6el - 144: FT736 1KW 2x11el - 432: 600W 2x23el,03/05 +OZ1IPU,JO57JH,,,,,,01/93 +OZ1JFK,JO47WL,,,,,,10/08 +OZ1JVX,JO46DS,,,,,,01/96 +OZ1LPR,JO44UW,EME,,,,144: IC756PROII LT2SMK2 Transv. 2x M2XP20 Xpol full elevation 1KW YL1050 PA or TH347 PA,04/06 +OZ1MAX,JO57GI,,,,,Kenwood TS-2000,03/05 +OZ1MFP,JO55SK,EME,,,,kenwood ts 790e ts 2000e,08/08 +OZ1PIF,JO65AN,EME,,= 5Q2M,,FT847 50: 100W 4el - 144: 350W 17el Preamp,02/09 +OZ2BZQ,JN99GM,,,,,,05/06 +OZ2EEZ,JO45,,,,,,01/03 +OZ2ELA,JO65,,,,,,01/97 +OZ2M,JO65FR,EME,,,,,07/09 +OZ2TF,JO46PE,EME,,,,144: IC271h 750W 4x9el Preamp,10/02 +OZ3K,JO45TL,,,EX OZ1ELF,,IC746PRO,04/07 +OZ3TT,JO66CB,EME,,ex OZ1IUK,,144: ICOM 275H Amp. CS31 M2 18 el MGF130,12/04 +OZ4MM,JO55GH,EME,,,,10m dish,10/02 +OZ4VV,JO46QU,EME,,,,50:1000w 9el - 144:1000 Watt 15el MGF1302,02/05 +OZ50MHZ,JO55EJ,,,OZ1IZB G0DJJ & OZ7M,,,03/08 +OZ5AGJ,JO47IA,,,,,144: ICOM 706MK2G 160W 9Elem 2.2wl,05/07 +OZ5IQ,JO65AO,EME,,OZ1EME AS WELL STILL OK,,,06/07 +OZ5QF,JO45VB,,,,,,10/95 +OZ6ABA,JO57DJ,EME,,,,144: FT736r Mutek Preamp 1KW 15el DJ9BV,08/08 +OZ6EI,JO45TT,,,,,,08/01 +OZ6OL,JO65DJ,EME,,,,,09/06 +OZ6OM,JO55EJ,,,OZ1IZB G0DJJ & OZ7M,,,03/08 +OZ7LE,JO45,,,= DJ3LE,,144: 9el 400W,03/01 +OZ7U,JO45RL,,,ex OZ1BVW,,TS940S FT847,09/06 +OZ7Z,JO44VW,EME,,OZ1DSK,,144: FT736 500W WX20 Yagi,03/07 +OZ8FR,JO55SK,EME,,,,,03/05 +OZ8ZS,JO55RT,EME,,,,144: IC706 GI7b 400W 17 elm,02/08 +OZ9AAR,JO45TS,EME,,qrt EME,,8x15el Crossyagis- 1KW,12/99 +OZ9FW,JO65CO,,,,,Homebrew 1kW(2m 70cm),04/07 +OZ9S,JO54TU,EME,,= 5P9S OU9S OV9S 5Q9S,,See www.oz9s.dk (click rig) for actual and updated info,05/07 +PA0AVS,JO22,EME,,,,,01/94 +PA0BAT,JO31FX,EME,,,,,01/03 +PA0BWL,JO21SS,,,,,,08/08 +PA0C,JO22FD,EME,,ex PA0CIS,,Ft 847 QBL 5/3500 0.4 dB NF 2x 17 el,02/06 +PA0HIP,JO21JO,,,,,,01/93 +PA0JMV,JO21PM,EME,,,,144: 1x12 and 4x10 el 2x 3CX800A7 0.18dB NF,01/08 +PA0LPE,JO20WW,,,,,50: FT847 7el - 144: IC202 400W 2x11el,01/01 +PA0O,JO33HG,,,ex PA0OOS,,,08/03 +PA0PVW,JO22VA,,,,,144: 18el M2 3CX800,07/02 +PA0RDY,JO22KJ,,,,,144: 500W 15el MGF1302,10/99 +PA0RLS,JO22,,,,,,01/93 +PA0TBR,JO22PI,,,ZS4BU,,,05/07 +PA0V,JO33II,EME,,ex PA0OOM,,144: 6 x DJ9BV 4 WL Xpol 8 BLF278 Mos fet PA MGF 1801 preamp,04/05 +PA0WWM,JO22FE,,,,,144: 160W 9el MGF1302,04/01 +PA0ZH,JO33AB,EME,,,,,01/07 +PA1AW,JO21GU,EME,,EX PA3DMH PC1A PE1JUP PD0LGF,,144: IC7400 + 11el F9FT. 50: IC756Pro+ACOM10000+5 el.,05/09 +PA1BVM,JO21RI,,,ex PE1BVM,,50: IC202 Transv. dipol - 144: FT-225 IC 746 MGF1302 2x17ele,05/03 +PA1GYS,JO22WW,EME,,EX PA3BXH PE1DWI PD0HKC,,144: TS850 TR144H 2 x 2MXP20 700W,03/08 +PA1LA,JO32LS,EME,,EX PE1RWS,,144: FT857d - LNA atf54143 - 9 ele. vargarda - GS35b QRO.,12/08 +PA1T,JO33JF,EME,,EX PA9KT PA3FBN,,144: FT1000MP MV TR144H 8877 4x17el M2- 50: 1y. 70cm: 1y. 23: 1.2dish,08/07 +PA1VW,JO22IN,,,EX PE1OLD AND PA3GNF,,FT-897 100 Watt PA 16JXX2 4.4 wave13 m ASL,12/08 +PA25FMF,JO22XW,EME,,SpecialCall,,144: 4x 12el DK7ZB 600W no preamp,10/06 +PA2CHR,JO32DB,EME,,,,144: 2x 16el XPol,01/08 +PA2DW,JO22GD,EME,,ex PA2DWH- PE0DWH- GM5CJF,,144: TenTec Trvt 400W(2x4CX250b) 10el,09/04 +PA2GER,JO21EW,EME,,,,,09/99 +PA2KW,JO22SB,,,ex PE1FYJ PA3BZL,,144: 1x16el KLM 1.2KW MGF1302,10/04 +PA2M,JO21IP,,,ex PA3DYS,,FT847 144: 2x blf278 9el 432: 16 el,11/04 +PA2MRT,JO32HI,EME,,PD0HP,,144: 4x 7el DK7ZB ME1500V with GS35B 1200 W Icom 910H icom 7400 YAESU FT1000d,08/07 +PA2V,JO22IM,EME,,ex PA2VST,,Homebrew + IC756pro2 & IC706mk2g,03/07 +PA2XHF,JO32HN,,,PA2B,,,04/09 +PA3BGM,JO33CE,,,,,,08/99 +PA3BIY,JO22EB,,,,,144: 400W 2x9el,03/02 +PA3BZO,JO21RS,EME,,,,,08/03 +PA3CEE,JO33JI,EME,,PE1FMG PD0GIK,,144: 600W 2x 5wl M� MGF1302,08/07 +PA3CMC,JO21WI,EME,,ex PA9LB,,144: LT2s mod. MGF1801 PA8877 4x 16el X-pole I0JXX or FT736 Mutek or TS2000 MGF1302 PA 500W 13 el. DJ9BV,04/06 +PA3COB,JO32MF,EME,,,,144Mhz only: FT756proIII - Kuhne TR144H +40 - 4X7el - 1Kw,02/08 +PA3CPI,JO22JW,,,,,FT847,08/08 +PA3CSG,JO21WD,EME,,,,,01/07 +PA3CWI,JO11TK,EME,,,,144: FT736 6x12 el M2 MGF1302 8877-Ampl,10/06 +PA3CWN,JO33AH,EME,,,,144: 600 W 4x 9el 7ZB,03/07 +PA3DOL,JO22MT,EME,,,,144: 17el 3cx800 amplifier abt 700w EME 4x9el DK7ZB abt 700w,09/08 +PA3DRL,JO21PS,,,,,K2 + XV144 Elecraft 4x 7el dk7zb GI7-b preamp 20 dB nf 0.8,05/07 +PA3DUU,JO21IU,,,,,,01/93 +PA3DZL,JO21HM,EME,,,,144: 4x17el 3.6ld MGF1302 EME Pwr - 432: 2x21el EME Pwr - 1296: 2.5m Dish 150W,03/07 +PA3EAQ,JO31CI,,,,,FT767 50MHz: 100 watt 3 el 144MHz: 100 watt 7 el,08/08 +PA3ECU,JO32CF,EME,,PD0NEN PE1JSB,,144: Ft847 8877 2x8Xpol DK7ZB LNA .19Db,12/08 +PA3EON,JO21,,,,,,01/93 +PA3EPX,JO22RC,,,,,,01/93 +PA3EQS,JO22TI,,,,,,01/93 +PA3FOC,JO21FW,EME,,,,144: TenTec Paragon LT2S 17el (2x17el) PA MGF1302,07/05 +PA3FPQ,JO22XE,EME,,PE1GXU PD0JNN,,144: TS850 + TR144H 2x10 elem. DJ9BV H + V pol. 1KW,01/08 +PA3FSA,JO23RF,EME,,,,,10/05 +PA3FVE,JO21WG,,,,,,01/93 +PA3FXB,JO33KC,EME,,PE1CIO,,12 el DK7ZB 350 W,06/08 +PA3FXW,JO22QD,,,,,,01/93 +PA3FYF,JO22DB,,,,,,01/93 +PA3FYG,JO22SI,,,PE1GTE,,TS870,01/08 +PA3GBR,JO32LH,,,,,,01/93 +PA3GCV,JO32LU,EME,,,,50: FT897 7el 9.40 m Boom 21m asl 1kw,02/09 +PA3GVC,JO22MU,,,,,,12/04 +PA3HJG,JO32BG,,,,,TS2000 50: Dipol - 144: 13el,08/03 +PA4EME,JO20WX,EME,,PE1FEY - ON8YA - ON4AUD - PA3GIJ,,144: 0.22 dB 2.5 kW 3.2 wl DJ9BV,12/07 +PA4PS,JO33GH,EME,,PD2PS PE2PS,,144: 4x10 from YU7EF,01/09 +PA4VHF,JO32JE,,,EX PA3FJY,,50: 100W 7elM2 - 144: TS850 LT2S 400W 17B2,12/08 +PA5DD,JO22IC,,,ex PA3HDD OZ1DOQ,,144: GS35b 15ele CUE DEE,01/05 +PA5KM,JO11WL,EME,,,,144: IC 910 H +8877 2x12 EME 1x9 TR MS AU ES,09/07 +PA5M,JO21BS,,,ex PA5MD PA3GST,,,08/03 +PA5MS,JO21RQ,EME,,EX PE1OGF,,144: 11el GS35b 400W MGF1302,05/07 +PA60SHB,JO21OS,,,SpecialCall,,,12/04 +PA6BN,JO13OF,,,Expedition - QSL via PA3BIY,,,07/98 +PA6MS,JO32QF,,,SpecialCall,,,10/96 +PA6T,JO32GF,,,SpecialCall,,,12/98 +PA7AL,JO23VG,,,,,,12/04 +PA7C,JO32GF,,,ex PA2TAB,,50: 100W 6el - 144: R2CW GS31b 400W 14el MGF1302,09/03 +PA7FA,JO21PT,EME,,EX PE1OUC,,IC756-III,04/07 +PA7FE,JO22OC,,,ex PA3BFM,,50: 6el leg pwr,03/99 +PA7FM,JO21,,,ex PE1PZS,,,08/00 +PA7N,JO23WB,EME,,PE1LZX,,IC-910H TS-480HX,01/09 +PA7PYR,JO21UQ,,,ex PD0PYR,,TS450SAT HF: FB33 - 144: 25W 2x17el Tonna - 432: 25W 23el,09/03 +PA7RP,JO22EC,EME,,ex PA3BBA,,144: 400 Watt (GS35b) 17 el F9FT,01/06 +PA7WM,JO23TA,,,ex PA3DWD,,,03/99 +PA9RX,JO32MT,EME,,,,144: FT847 4x17el 200W,04/07 +PA9T,JO22KA,,,PD0TKS,,,06/09 +PB0AHX,JO22,EME,,,,icom 910H for 2-70-23 and icom7400 for 50mhz,04/08 +PB0ALS,JO21RV,,,,,,01/93 +PB1TT,JO22FF,,,ex PA3EFC,,144: 100W 10el CueDee,09/01 +PC7M,JO32GF,EME,,ex PA2TAB PE0TAB,,50 MHz : FT847/120W/6el - 144 MHz : FT847/400W/14el,04/06 +PD0ANQ,JO31EW,,,,,,11/01 +PD0CIF,JO32KT,,,,,FT-847 and FT-817,07/07 +PD0HCV,JO31FW,,,,,IC821 144: 15el QD 50W 432: 18el M2,08/05 +PD0ORT,JO23RE,,,,,,03/06 +PD1AIQ,JO22RM,,,,,144: 25W 4x9el,04/03 +PD1ALD,JO32FI,,,,,Yaesu FT897- Kenwood TR9130- Yaesu FT817,06/03 +PD2GCM,JO21ET,,,,,FT847,11/04 +PD2TW,JO33FI,,,,,,04/09 +PD2VDV,JO23RF,,,,,,08/04 +PD3AHW,JO32LF,,,,,,05/05 +PE1AHX,JO21OS,,,,,,02/05 +PE1BTX,JO22XW,EME,,,,144: 4x 12el DK7ZB 600W no preamp,10/06 +PE1DAB,JO23RD,,,,,144: 2x 8el JXX 100Wh,12/08 +PE1DCD,JO21FU,,,,,,05/03 +PE1GNP,JO31IX,,,,,,05/03 +PE1GUR,JO22TH,,,,,144: 16el 350W,07/05 +PE1HWO,JO21GV,,,,,144: FT101ZD + TRV FT225RD PA 17el MGF1302,04/07 +PE1IKX,JO11TM,,,,,144: 400W 15el Quedee,06/05 +PE1ITR,JO21QK,EME,,,,144: 2x10el 200W 3SK183 432: 2x16el GS35b 0 35db - 70: rx 5el - 222: rx 10el 3SK183 - 1296: 10W 26el,09/07 +PE1L,JO23WF,EME,,EX PE1LCH,,2 x 14 dk7zb,04/07 +PE1LWT,JO22VA,EME,,,,144: 300W 2x3wl-Xpol,07/05 +PE1M,JO23XE,,,ex PE1MCD,,,08/03 +PE1MVJ,JO21FV,,,,,,11/96 +PE1OID,JO33KI,EME,,,,144: TR 751e 160W 10el,10/05 +PE1OPK,JO23UE,,,PD0NXG,,IC821/IC202,12/08 +PE1PQX,JO32LS,,,ex PD0RJH,,,06/06 +PE1RBG,JO21,,,,,,11/01 +PE1RDP,JO21QK,EME,,,,FT847 144: 2x 10el DK7ZB GS35 MGF1801,09/07 +PE1RLF,JO32CG,,,,,144: TS850 LT2S 4CX250F 10el,05/07 +PE1RMN,JO11WR,EME,,,,FT857 FT847,08/07 +PE1RWS,JO32BM,,,,,,01/05 +PE2PE,JO21LU,,,ex PE1BNK,,144: 400W 15el Cue Dee - 50: 20W 6 El Cue Dee - HF: 10W,03/07 +PE2RMI,JO23MH,,,,,,01/02 +PE2S,JO31AU,EME,,EX PE2SVN,,FT1000 LT2s BLF278/3CX800,03/08 +PE9DX,JO33MD,EME,,,,144: TS711 600W 10 elm dk7zb VV atf 54143,10/07 +PE9GG,JO33NA,,,ex PE1PJG,,,04/05 +PE9HNE,JO22FB,EME,,ex PD1ABZ,,TS711,09/03 +PI4NYV,JO32EH,,,,,144: 400W 9el or 17el (/p JO32FI),12/96 +PI9CAM,JO32ET,EME,,,,,01/09 +PJ4CX,FK52UD,EME,,EXPEDITION,,,05/07 +PJ4EME,FK52UD,EME,,EXPEDITION,,,05/07 +PJ4LS,FK52UD,EME,,EXPEDITION,,,05/07 +PP2KR,GH53IG,EME,,,,TR9130,02/05 +PP5XX,GG53QW,EME,,,,144: 150W single yagi,05/08 +PR8ZX,GI64GL,EME,,EX CT1DYX,,144: 13 el dl6wu 150w mgf1312,05/07 +PT7ZAP,HI06RG,EME,,,,TS-2000,05/08 +PT7ZAP,HI06RG,EME,,,,TS-2000,05/08 +PT9FH,GH11EA,EME,,,,144: 4x12el 2x4CX250,04/00 +PT9PA,GG49DF,,,,,,04/08 +PY0FF,HI36TD,EME,,,,144: 4x 12el 100W,05/08 +PY1EPU,GG87KD,EME,,,,144: 6 x 16el 160W FT 1000 Mark V Field + Transvert,02/08 +PY1IAM,GG87,EME,,,,,04/04 +PY1RO,GG87LB,EME,,,,IC706MKIIg 1000W 8 over 8 el,09/06 +PY2ALR,GG66UB,EME,,,,,08/08 +PY2ANE,GG66SH,EME,,,,,05/05 +PY2BL,GG67LE,EME,,ex ZZ2RED,,144: TS2000 IC910 2x 15el 1KW,05706 +PY2BS,GG66PJ,,,,,,09/08 +PY2BVF,GG66TB,EME,,,,144: 4x 10el 1KW - 432: 2x 28el 800W,08/05 +PY2CLL,GG66RF,EME,,,,144: Kachina 505DSP Trvt 4x18el M2 LNA 300W,01/00 +PY2NI,GG66RK,EME,,,,,07/01 +PY2OC,GG66OT,EME,,,,50: 8el 100W - 144: 12el 160W,08/05 +PY2PD,GG66RF,EME,,,,MP1000- LT2S- 4xM2XP28- 3CX800 0-4db,03/99 +PY2PLL,GG66RF,EME,,,,144: 750W 16el or 2x15el - TS790A xverters for 432 and 902 and 1.2,03/01 +PY2SRB,GG48BC,EME,,,,144: 160W 4x 10el,06/06 +PY3CRX,GG66RF,,,,,144: 750W 16el or 2x15el,08/00 +PY3FF,GF49IU,EME,,,,,05/05 +PY4EPU,GG88PO,EME,,,,YAGI FULL SIZE FOR 14 21 28 50 144 220 440 MHZ,04/06 +PY4OG,GG78QQ,EME,,PY4LOG,,4x 12el 1KW,09/07 +PY5EW,GG46IP,EME,,,,144: 15el 100W,05/08 +PY5ZBU,GG54,EME,,,,,01/00 +PY8ELO,GI25AR,,,,,,01/08 +PZ5CY,GJ25JT,EME,,,,50: 1x 6el,03/06 +R1MVA,KP40GP,EME,,Expedition,,144: 150W,07/99 +R1MVW,KP40GP,EME,,EXPEDITION,,144: 2x 9el or 18el 500W - 432: 40el 500W,11/05 +R1MVZ,KP40GP,EME,,,,144: 4x14el 1.2KW,10/99 +R3VHF,LO16XG,,,SpecialCall,,,01/96 +RA0ACM,NO76EB,EME,,,,144: 4x 9el 300W,08/06 +RA0CGT,PN78NL,EME,,,,,10/08 +RA0FCA,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,11/06 +RA0FU,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,04/06 +RA0FW,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,11/05 +RA1ASA,KP50FB,,,,,,01/76 +RA1AY,KP50EA,,,EX UA9KG,,144: 15 el TS2000 GI7B 300 W,04/07 +RA1QA,KO99WF,,,,,144: 300W 2 x10el 9BV,12/06 +RA1QAX,LO09CC,,,,,144: IC706 10el PA,10/04 +RA1QIB,KO99WG,,,,,,11/05 +RA1TBH,KO58PN,EME,,,,TS-2000X 100 W 10 el DK7ZB Pre Amp,03/09 +RA1TC,KO58ON,,,,,,01/92 +RA1TL,KO67,,,,,,05/04 +RA1TM,KO67PX,,,,,IC746,11/04 +RA1WL,KO47EV,,,,,Kenwood-2000X,03/08 +RA1WU,KO47ET,,,,,,05/08 +RA1WZ,KO47EV,,,,,,06/09 +RA1ZC,KP59JK,EME,,ex UA1ZCG,,IC706MK2 144: 2x10el DJ9BV 1KW,11/01 +RA1ZK,KP68MV,,,,,,11/04 +RA3AGS,KO85UU,,,,,,01/90 +RA3AQ,KO85JE,EME,,,,144: 6x 6.3 wl cross yagi 1500W,05/07 +RA3DHK,KO95JH,EME,,,,144: FT-736R Toshiba NB 500W 2x2M12,10/06 +RA3DQ,KO85US,,,,,144: IC746 100W 16el,09/01 +RA3DQT,KO95JH,,,,,144: FT-736R Toshiba NB 170W 1x2M12,07/06 +RA3DRC,KO95AP,,,,,144: FT-847 50Wtts 17el DJ9BV 9.2 m long,03/04 +RA3EC,KO82PT,EME,,,,1296: 3m Dish RA3AQ septum feed 200 W output,10/08 +RA3EL,KO82AX,,,ex UA3EAT,,144: 50W 16el,03/04 +RA3FO,KO86SI,,,,,,01/95 +RA3GES,KO92SO,EME,,,,144: 4x 7el 200W,11/05 +RA3IM,KO56UM,,,,,,06/04 +RA3IS,KO76WU,EME,,EX UA3IFI,,2m: 1 hp 1x19el SM2CEW 5wl crossyagi 70cm: 21F9FT 23cm 2m dish,09/07 +RA3LBK,KO65QA,,,,,144: 200W 17el,01/00 +RA3LE,KO64AR,EME,,ex UA3LBO,,144: 2x LY Xpols 400W,12/06 +RA3LW,KO54MQ,,,UA3LAW,,IC-7000 144:2x7el 432:24el 1296:22el G3JVL and PA,11/08 +RA3MR,KO98JC,,,ex UA3MEP,,IC910,08/05 +RA3QTT,LO01GQ,,,,,144: GS35 0.5KW 4 x 3.3wl 9BV 0.35db,11/03 +RA3TES,LO15WJ,,,,,,11/95 +RA3WDK,KO81BR,,,,,144: 60W 11el,04/04 +RA3XAL,KO84DM,,,,,,08/05 +RA3YCR,KO73DH,EME,,SilentKey,,,01/94 +RA4HCN,LO43SL,EME,,,,144: 1KW 4x13el,09/07 +RA4HGN,LO53BE,,,,,,08/07 +RA4NAK,LO58GH,,,,,,08/08 +RA6AAB,KN94UR,EME,,SilentKey,,,01/92 +RA6AX,KN95,EME,,,,,04/07 +RA6DA,KN96SA,EME,,,,144: 8x 12el 600W,05/06 +RA6HHT,LN04WX,EME,,,,144: 16el 1.2KW,06/07 +RA6HTT,LN05,,,,,,08/08 +RA9CAE,LO97,,,,,,08/08 +RA9FMT,LO87BW,EME,,,,,01/06 +RA9SO,LO71NS,,,,,,08/96 +RA9YDL,MO93HA,EME,,,,,10/08 +RA9YMI,NO13VI,EME,,,,144: 16el 250W,01/90 +RD3BD,KO85UQ,EME,,,,144: 4x 18el 1500W,04/06 +RD3DA,KO85PT,EME,,,,1296: 2m dish 35W,08/06 +RD3WAL,KO71IM,,,,,144: 100w 14el yagi(DK7ZB) Kenwood TS-790a,04/09 +RK1NA,KP71ET,EME,,ex UN1CD - QSL via DK3WG,,144: FT847 100W 14el circular,04/04 +RK1QWA,LO09AC,,,EXPEDITION,,,08/07 +RK2FWA,KO04FT,EME,,ex UZ2FWA,,,04/04 +RK3AF,KO75WO,,,EX UZ3AF- UA3AJK,,144: IC746 2xGI7B 450W ANT - DK7ZB 5WL,09/07 +RK3FG,KO86HP,EME,,,,144: 4x 14el 1200W,03/05 +RK3MWI,KO98JB,,,Expedition,,144: 100W 10el,01/07 +RK3PWJ,KO83XC,,,QSL via UA3PNO,,,05/04 +RK3WKB,KO81BR,,,,,,05/06 +RK3WWF,KO72QI,EME,,,,144: 4x 13el 1KW 432: 4x 26el 300W,09/06 +RK6GC,LN05AU,EME,,,,144: 50W 2x 12el,02/08 +RK6LXN,KN97LE,,,,,,06/06 +RK6MC,KN97LE,EME,,ex UA9XEA,,144: 4x 12el 1KW - 432: 8x23 el GS35B/1.1kW PA MGF1302 preamp,08/06 +RK9CC,MO06RT,EME,,QSL via DK3WG,,6x4lb 9BV GS35b,03/04 +RK9DK,MO09CS,EME,,,,,10/07 +RL1P,KO49VW,,,SpecialCall,,144: TR-751 300w 16el DJ9BV,05/03 +RL1X,KO59EW,,,SpecialCall,,,05/03 +RL3DO,KO85WV,EME,,,,,08/08 +RM3T,LO16XG,,,SpecialCall,,,08/97 +RN3QKG,KO91OM,,,,,,08/08 +RN3QLU,KO91OO,EME,,,,,06/05 +RN3QO,KO91OO,,,,,,07/05 +RN3QQ,LO00BK,,,,,144: 15el DJ9BV 100W,06/99 +RN4AT,LN29LA,EME,,ex RA4AOR,,144: 4x 14elX-Yagi 1.5KW,10/06 +RN4HFE,LO42XX,,,,,,09/07 +RN4NF,LO58GH,,,,,,08/08 +RN6BL,KN95,EME,,,,144: 80W 16el,01/08 +RN6BN,KN95LC,EME,,,,144: FT736 16x17el 1KW,04/05 +RN6DJ,KN96VC,EME,,RV6AHY,,TS-780 11 EL. 3 WL. 100 W.,01/09 +RN6HW,LN05XB,,,,,144: 1KW 13el Yagi,08/07 +RN6MT,KN97LN,EME,,EX RA6LDY,,144: 2.3KW 4xYagis,05/07 +RP3POT,KO93CD,,,,,,05/05 +RP6A,KN95LC,EME,,SpecialCall,,144: FT736 32x15el vertical & 32x15el horizontal 1KW,05/06 +RP9JTT,NO01,EME,,= RV9JD,,,05/06 +RU1A,KP40HK,EME,,QSL via DK3WG,,144: 6x16el 1KW,01/05 +RU1AA,KP40XD,EME,,QSL via DK3WG,,144: >2KW GU93b 4x15el Crossyagi,07/04 +RU1AC,KP50EJ,,,,,,07/04 +RU1AS,KO59,,,,,,05/03 +RU1R,KO82BW,,,Expedition,,,01/93 +RU1U,KO72XW,,,Expedition,,,01/93 +RU2FM,KO04GQ,,,UB5KCW RA1ACW RV1AB RV1AB/MM R750M UE3QRP/2,,home made transverter+ h.m. HF rig TS790,09/08 +RU3ACE,KO85SM,EME,,,,144: 2x 18el Xpole 300W,09/06 +RU3EC,KO82TK,,,EX UA3EEN,,144: IC746 15el 9BV,09/07 +RU3GX,KO92SO,EME,,QSL VIA DIRECT,,144: more than 1KW Gs35b 4x17el Crossyagi GAS-2020,11/07 +RU3ZD,KO81VG,,,ex UW3ZD,,144: 16el 200W,01/96 +RU4HU,LO43OM,,,,,144: FT290R 2x10el 50W,04/04 +RV1AO,KP50,,,,,,08/04 +RV3AO,KO85RR,,,ex RA3AIS,,144: 4x12el 1500W,07/03 +RV3APM,KO85RU,,,,,IC910H,03/04 +RV3IG,KO87OT,EME,,QSL via DK3WG,,144: 500W 4x15el,11/05 +RV3QX,LO00BK,,,,,,08/08 +RV3YM,KO63QQ,,,ex UA3YOZ,,FT 897 144: 5.5wl gs15 bf998 432: 11wl gs15 bf998,05/05 +RV3ZR,KO80CL,,,,,144: 500W YU0B KT939A,11/03 +RV4AQ,LN28GM,EME,,not active,,432: 4x4.2ld BV 2xGI7B 500W,10/99 +RV6YY,LN04AO,,,,,,05/08 +RV9AX,LO93LK,,,,,144: 600W 17el preamp - 50: 100W- 6el,10/96 +RV9JD,MP80GW,EME,,,,144: 4x 16el 1500W,06/05 +RV9PP,NO15LB,,,,,144: ft-847 4x 12el klm 350watts 432: 4x 22el,03/06 +RV9UV,NO34GA,EME,,,,FT857 4x 12el 50W,10/06 +RW1AW,KP50DA,EME,,QSL VIA DK3WG,,144: FT736r 2.4KW 2x19el MGF1302 - 432: 12x15el 1.5KW,11/07 +RW1AY,KO59CU,EME,,,,144: 15el 4wl 1500W,04/06 +RW1Q,KO99WJ,,,Expedition,,,12/95 +RW1ZC,KP69NA,,,,,,08/06 +RW2F,KO04PT,,,Expedition,,,12/97 +RW3AC,KO86SH,EME,,,,144: IC910H 18el 3AQ LNA-RW3AZ and GS35-RZ3BA,05/07 +RW3AZ,KO85TT,,,,,,08/03 +RW3DMQ,KO86RI,,,,,,05/05 +RW3FH,KO86VK,,,,,,08/07 +RW3PF,KO93CD,,,QSL via DK3WG,,144: 1500W 4x10el BVO 3wl Preamp - 432: 700W 4x24el Preamp,08/05 +RW3PX,KO83RJ,EME,,,,144: 8x 16el GS35B,11/05 +RW3TJ,LO16XG,,,ex UW3TJ,,,11/03 +RW3TU,LO25BR,,,UA3TFO UW3TU,,144:100Watts 12el 4wl. MGF1302 - 432: 400Watt 2x23 ele MGF1302,06/09 +RW3WR,KO71IM,,,ex UA3XJ,,,07/04 +RW3XR,KO73FU,,,UA3XFA,,,10/07 +RW4AK,LO20RC,,,ex UW4AK,,,01/96 +RW4HM,LO43RM,EME,,,,ICOM-910H,05/05 +RW4NQ,LO58,,,,,144: 4x 9el GI7B,08/05 +RW4WE,LO66PU,,,,,,04/05 +RW9FT,LO89TD,,,ex UW9FU,,,11/04 +RW9MD,MO64RX,EME,,,,,06/01 +RW9USA,NO33NS,EME,,,,TM255A IC 821H PA 1500W ant 8/6 yagi,05/05 +RX0AZ,NO86OD,EME,,,,700W 3wl Antenna,10/07 +RX1AS,KO59FX,EME,,QSL via DK3WG,,144: 4x21el LY GS35b linear,03/06 +RX1AX,KO59EW,,,,,,12/04 +RX3AGD,KO85UR,,,UV3AGD,,FT897d 50 watt 12 ele 3WL dk7zb,09/07 +RX3DUR,KO85XM,,,ex UV3DUR,,ICOM 706MK2G + PA GI7B,08/05 +RX3PX,KO84SD,EME,,,,144: 2x11el 210W MGF1302 - 432: 2x23el 180W MGF1302,06/99 +RX3QFM,KO91FM,EME,,QSL via DK3WG,,144: 2xBVO4wl yagi 0.4 dB LNA PWR 1.5 KW (2xGS35B),07/05 +RX6AKO,KN84PV,,,ex UV6AKO,,,06/96 +RX9AT,LO93LJ,EME,,,,ts-2000x,07/07 +RX9CHW,MO09CS,EME,,,,144: 4x 8el 100W,03/06 +RX9JP,MP22RD,EME,,,,144: 4x 18el 45W,10/08 +RX9SA,LO71NS,,,,,IC910H,08/04 +RY3E,KN75,,,Expedition,,,01/93 +RY5I,KP51BM,,,Expedition,,,01/92 +RZ1AP,KO49VW,,,,,144: TR-751 300w 16el DJ9BV,05/04 +RZ1AWR,KO59DX,,,,,144: 16el DJ9BV 50Watt,08/98 +RZ1AWT,KP40XD,,,QSL via DK3WG,,144: 20W 9el,06/98 +RZ1QZZ,LO09BC,,,,,,07/04 +RZ1ZZZ,KP76EQ,,,,,,08/04 +RZ2FWA,KO04FT,,,,,,01/03 +RZ3AED,KO86RD,EME,,UW1ZA,,TS2000 144: 4x 3WL F9FT 500W 432: 4x 21el F9FT,09/07 +RZ3AF,KO85CO,,,ex UA3AFA,,144: MGF 1302 2x14 el GI-7B,12/02 +RZ3DNT,KO86LE,,,,,,08/08 +RZ3QD,KO91OO,,,,,144: 4wl 1KW LNA,08/05 +RZ3QS,KO91SS,,,,,144: 2wl 100W LNA,08/02 +RZ3ZZ,KO80GP,,,,,144: IC-910H 100W 4x 10el A144S10 - 432: 1 A430S15,04/06 +RZ4HF,LO43TJ,EME,,,,144: TS-2000 IC-970 4x15el H/V 1500W,11/07 +RZ6BU,KN84PV,,,UV6AKO RX6AKO,,FT847 144: 400W 10el DK7ZB Preamp BF998 432: 50W 14el DK7ZB,12/07 +RZ6BY,KN84PV,,,ex UV6AIL,,,06/97 +RZ6DD,LN04MX,,,RW1ZC,,IC-746,02/09 +S50C,JN76JG,,,,,50: 5el 100W - 144: IC275h 2x15el 700W,08/01 +S50L,JN75ES,,,,,,08/08 +S50TA,JN76HD,,,,,,08/08 +S51AT,JN75GW,,,ex YU3FM,,144: 1KW 16el LY,08/05 +S51BA,JN75IX,,,,,,01/03 +S51DI,JN76VL,,,,,,09/03 +S51DX,JN75CC,,,ex YU3HR,,144: IC275H 100W 2x17el F9FT,11/01 +S51S,JN75GV,,,,,,08/96 +S51SLO,JN76GB,,,,,,03/01 +S51TE,JN76BI,,,,,,11/99 +S51WV,JN76SN,,,,,,01/03 +S51WX,JN75OS,,,,,144: 2x8el dk7zb 1kW,09/08 +S51ZO,JN86DR,EME,,,,144: 1.5KW 4x14el 9BV - 432: 800W 8x33el 9BV,04/06 +S52CW,JN76CI,EME,,,,,01/01 +S52EZ,JN86DT,,,,,,08/01 +S52LM,JN65TX,EME,,EX YU3ULM YT3LM,,144: 4X17M2 5WL- FT 1000MP- JAVORNIK 144/14 dual RX - MGF1801-1500W (GS35B homemade ),05/07 +S53AC,JN76GB,,,,,IC-746 M2-8wl 600W IC-746 17el,08/03 +S53CAB,JN76JG,,,,,,08/97 +S53J,JN75EV,EME,,,,144: FT847 4x5wl GS35 MGF1801 - 432: IC820H ATF43143 GS23B 4X9WL - 1296: FT736R SP23 55el F9FT 80W,03/05 +S53RM,JN76JCB,EME,,ex YT3RM,,432: 8 x 8.5wl BV OPT X yagi YL1055 Ampl.,04/05 +S53T,JN75GV,,,,,,06/01 +S53X,JN65WS,,,,,,11/99 +S54AA,JN76EG,,,NOT ACTIVE VHF,,144: IC275H 2x4CX250b (650W) 18el DJ9BV MGF1302,01/01 +S54M,JN86CL,,,ex 9A4ZM- N1MZ,,FT847 PA,05/02 +S54O,JN75NT,EME,,EX S51MQ,,50: 50W 6el 144: TH328 KW 2x17el MGF1302 432: th328 500W 2x24el,09/07 +S54T,JN75EW,EME,,,,144: 4x 17el M2 GS35B 1KW - 432: FT847 4x 28el M2 GS23B,05/05 +S55AW,JN75DS,,,EX YT3RY,,144: FT1000MP Javornik 14/144 XVRT GS35b 2x15el,05/07 +S55M,JN65VM,,,,,,10/07 +S55OO,JN76HD,,,,,50: IC706mkIIg 100W 5el - 144: IC706mkIIg 140W 15QD,08/07 +S55Z,JN76HB,,,S57TDA,,TS9130,08/08 +S560L,JN75ES,,,SPECIALCALL,,,08/07 +S57A,JN65TW,,,,,,11/99 +S57C,JN76HD,,,,,144: 700W 17el - 432: 400W 8x21,07/96 +S57EA,JN76HE,EME,,YT3QW,,144: FT-897D 50W 4x6 loop (full ele) MGF1302,08/07 +S57JA,JN76GB,,,,,,11/99 +S57LM,JN76HD,,,,,,04/03 +S57M,JN76PO,EME,,EX S51WV,,,04/07 +S57QM,JN76,EME,,,,,01/94 +S57RA,JN75FO,EME,,,,432: 4x 8.5wl dj9bv- 0.3db preamp atf35176- gs35b 800W,08/00 +S57S,JN76JB,,,,,144: TS850SAT h.m. transv MGF1302 preamp 300W 17B2,11/00 +S57SU,JN76EF,,,EX S57MSU,,144: TM255E 30W 2x13el (2.1L) 5�El 15db,02/08 +S57TW,JN75EX,EME,,,,144: IC275H 1500W MGF1302 4x2M28XP,08/07 +S57UUU,JN76EC,,,,,,01/03 +S58J,JN76EG,,,,,50: IC756 5el,11/99 +S58M,JN76ID,,,,,,01/09 +S58P,JN76ID,,,,,,04/09 +S59A,JN76XP,,,ex YU3ZV,,,11/95 +S59AX,JN65UU,,,,,,01/93 +S59DCD,JN76NL,,,,,,01/03 +S59EA,JN75,,,,,,01/95 +S59F,JN65TX,,,ex YU3HNI-YT3ET-S59AM,,50: 350w 6el - 70: 50w 5el - 144: 500w 12el - 432: 50w 23 el,04/03 +S59MA,JN76FD,EME,,,,,02/05 +S59UN,JN76XP,,,,,,01/03 +S79HP,LI75,EME,,Expedition,,,01/06 +S9TX,JJ30,,,,,,01/03 +SA3AJG,JP93IG,EME,,,,144: 15el 100W,01/08 +SA7U,JO65ML,,,,,FT897 144: 50w 2 x 8JXX2 432: 20w 25JXX70,06/07 +SC300VL,JO68SD,,,SPECIALCALL,,,04/07 +SD5D,JO89JT,,,,,TS-790E + LA-22+15el+mastpreamp,05/08 +SF6X,JO67AJ,,,= SM6CEN,,,08/06 +SF7WT,JO65QQ,,,SpecialCall,,144: IC-7400 PA 500 W 15 EL,08/06 +SG6T,JO68SE,,,ALSO 8S6T & SM6WET,,FT650 847 920,11/08 +SK0AR,JO99BT,,,,,,01/93 +SK0CC,JO99BD,,,,,,07/02 +SK0UX,JO99BM,EME,,,,,01/05 +SK2AT,KP03BU,EME,,= 7S2AT,,TS-790E,05/07 +SK3AH,JP82XO,,,,,,10/02 +SK3JR,JP62WK,,,Expedition,,,01/92 +SK3LH,JP93IH,,,,,,01/94 +SK3MF,JP92FW,,,,,144: 6x15el 1KW,07/02 +SK3SN,JP80IO,,,,,,01/94 +SK4BZ,JP61QM,,,,,,01/94 +SK4EA,JO79CO,,,,,,01/93 +SK6HD,JO68SD,,,,,144: 150W 2x15el,05/07 +SK6YH,JO58,,,,,,08/96 +SK7AX,JO77DS,,,,,,07/01 +SK7CY,JO65RJ,,,,,144:TS850 transverter 130 1000W MGF1302,06/06 +SK7JC,JO76KF,,,,,,08/99 +SL4BP,JP70TO,EME,,SPECIALCALL FOR MILITARY,,144: 800W 4x9el MGF1601 432: 100W 2x19el MGF1302,05/08 +SL4ZYX,JP70TO,EME,,SPECIALCALL FOR MILITARY VOLUNTARAY,,144: 800W 4x9el MGF1601 432: 100W 2x19el MGF1302,05/08 +SM0EJY,JO89SC,,,,,144: 500W 10 over 10el Preamp,06/06 +SM0EPO,JO89XM,,,,,144: 50W 2x6el,12/03 +SM0EPX,JO89SJ,,,,,144:1000 Watt 4CX1500 15el X-Y MGF1802,04/04 +SM0FFS,JO99AG,,,,,,01/94 +SM0FZH,JO89TG,,,,,,01/97 +SM0GWX,JO89XG,,,,,FT-920 + FT-847,01/09 +SM0HAX,JO99,EME,,,,144: IC820 6x 12el I0JXX 2x GU74b P-hemt,08/05 +SM0IKR,JO99CC,,,,,FT847,02/05 +SM0KAK,JO89XK,,,,,50: 100W 6el - 144: 180W 17el,08/03 +SM0LQB,JO89XK,,,,,144: 15el 130W - 432: 4W 21el,04/04 +SM0MXR,JO89WE,,,,,,01/03 +SM0NKZ,JO99IQ,,,,,,03/02 +SM0OUG,JO89VG,,,,,,10/96 +SM0PYP,JO89XG,EME,,,,,01/94 +SM0TSC,JO99CF,,,,,IC-7400 IC-703,10/07 +SM1BSA,JO97DP,,,NO SKEDS !!,,144: FT736r 300W 15el,06/06 +SM1HPV,JO97HO,,,,,144: 200Watts 2x15ele,01/02 +SM1SBI,JO97FK,EME,,,,144: 2x17el 800W,09/06 +SM200PAX,KP03BU,,,SPECIAL CALL,,,06/09 +SM2A,KP04NP,EME,,SM2ILF (BOTH CALLS ARE VALID),,IC910H 144: 6x16 el I0JXX 1kw 432: 4x32 el HB 1kw,03/08 +SM2AZG,KP03,,,,,,03/02 +SM2BLY,KP05RJ,,,,,,01/93 +SM2BYA,KP07DU,EME,,,,144: FT1000 4x3.2wl CueDee 3CX1000A7 MGF1100,08/00 +SM2CEW,KP15CR,EME,,,,144: 6x19el 1KW,04/05 +SM2CKR,KP03DQ,EME,,,,1kw 8x15el,10/07 +SM2ECL,KP05RH,,,,,144: 200W 4x15el 60m asl,07/03 +SM2EKM,KP05UW,EME,,,,,04/03 +SM2GCR,JP93TK,,,,,,07/00 +SM2GGF,KP05DV,,,SilentKey,,,01/84 +SM2ILF,KP04NP,EME,,SM2A (BOTH CALLS ARE VALID),,IC910H 144: 6x16 el I0JXX 1kw 432: 4x32 el HB 1kw,03/08 +SM2IUE,JP85,,,,,,01/93 +SM2IZV,JP84,,,,,,01/93 +SM2LKW,KP15BO,,,,,,01/94 +SM2LTA,JP94CW,,,,,,04/98 +SM2ODB,KP03EU,,,not qrv MS nw! (01/01),,144: 100W 15el,03/02 +SM2VBK,KP15BO,,,,,,08/02 +SM3AKW,JP92AO,EME,,,,144: 2x17LB 1KW - 432: 16x21el 1KW - 1296 4x23elLoops/5m dish 1KW- 2320: 6m/5m dish 100W- 10G:0.65/10W,07/07 +SM3AZV,JP83,,,SilentKey,,,01/93 +SM3BEI,JP81NG,,,EX SM5BEI,,144: 500W 432: 500W 1296: 130W 2320: 120W 5G: 15W 10G: 12W,10/07 +SM3BIU,JP73ST,,,,,,01/97 +SM3BYA,JP81NX,EME,,2nd QTH SM2BYA,,432: 450W 8x21el Tonna 750W MGF1412,05/05 +SM3COL,JP82,,,,,,11/96 +SM3GHB,JP72,,,,,,01/93 +SM3GHD,JP62,,,,,,01/93 +SM3IEK,JP73IT,,,,,144: 100Watt 15el,03/06 +SM3JBO,JP93IH,,,,,144: 2x 10el 200W,08/05 +SM3JGG,JP71WJ,,,,,,07/02 +SM3JGG,JP71TJ,,,,,FT-847 250watt 15el,07/07 +SM3JLA,JP93LH,,,,,144: 250W 15el,06/99 +SM3JQU,JP82QM,EME,,,,432: 4x 32el 750W 0.4db,09/05 +SM3KJO,JP92DX,,,,,,08/97 +SM3KYH,JP82NL,,,,,,04/04 +SM3LBN,JP80IO,,,,,,08/03 +SM3LGO,JP83VB,,,,,144: 1KW 80el Colinear,01/99 +SM3MXR,JP80GR,EME,,,,144: 4x17el M2 emepwr,08/01 +SM3PWM,JP81GF,EME,,,,,12/99 +SM3PXO,JP73GI,,,,,144: 400W 17el 5wl - 50: 50W 9el 2wl,04/03 +SM3RLJ,JP93OI,,,,,144: 100W 15el,07/97 +SM3RPQ,JP74BT,,,,,,08/08 +SM3RWZ,JP82MI,,,,,ICOM IC-275H 200W 9 ele,10/04 +SM3TFR,JP93IG,EME,,,,,01/94 +SM3VAC,JP83VA,,,,,144: 2x17el 1KW,08/01 +SM3VEE,JP81VI,,,,,,03/98 +SM3XGV,JP81OF,,,,,TS2000,08/04 +SM3YTF,JP81FI,,,,,,12/06 +SM4ANQ,JP70OC,,,,,,02/02 +SM4DHN,JP60VQ,EME,,,,,01/01 +SM4FXR,JO79OF,,,,,,01/05 +SM4GRP,JO69HF,,,,,IC-756PROIII DB6NT TR144H transverter + 15el @ 10m 45m ASL.,10/07 +SM4IVE,JO79SD,EME,,,,,08/00 +SM4KYN,JO79,,,,,,01/93 +SM4RPQ,JO79HH,,,,,TS2000,08/05 +SM4SJY,JP70OC,EME,,,,IC706MK2G 144: 9el 600W,09/05 +SM4VQP,JO79NB,EME,,,,144: 4x17el eme-pwr,01/02 +SM5BSZ,JO89IJ,EME,,NO SKEDS !!,,,07/99 +SM5CBN,JO78NH,,,,,,08/06 +SM5CFS,JO99IQ,EME,,,,144: 4x19el QBL5/3500 1.5KW 1296: 5.6 mtr solid 100w,09/07 +SM5CUI,JO89WW,EME,,,,144: 8x 10el 800W,07/05 +SM5DCX,JO89OI,,,,,,01/01 +SM5DIC,JO89JT,EME,,,,TS-790E+LA-22+4x15el+Mast preamp MGF1302,11/08 +SM5DRV,JO77MV,,,= SM0DRV,,144: IC-275H 100W 13el yagi,07/04 +SM5FRH,JO88BW,EME,,,,144: 32x19el horz. or 32x10el vert.,10/00 +SM5GEP,JO77IP,,,,,,01/03 +SM5HUA,JP80WA,EME,,SM3HUA,,Icom IC-910H,04/09 +SM5IOT,JO99BX,EME,,,,50: 2x 6el I0JXX - 144: 8x 8el I0JXX 2xGU74B P-hemts - 432: 8x 26 el DJ9BV opt2 GS23B P-hemts,03/06 +SM5LE,JO99BD,EME,,,,,04/06 +SM5TSP,JP90BD,EME,,,,144: 4x18el 750W,08/08 +SM6AEK,JO66,,,,,,01/93 +SM6AFH,JO66LQ,,,,,,01/94 +SM6CEN,JO67AJ,,,= SF6X,,,08/06 +SM6CKU,JO67,EME,,,,,04/05 +SM6CMU,JO57XK,,,,,IC7400 100-400W 50: 6el - 144: 9el,08/05 +SM6CWM,JO67,EME,,,,,01/94 +SM6EAN,JO57WQ,,,,,144: 600W 10el,01/01 +SM6EUP,JO57XQ,EME,,,,,01/94 +SM6FKF,JO68SA,,,,,,05/07 +SM6FUD,JO68JV,,,,,,12/04 +SM6KJX,JO67CK,,,,,FT736,07/04 +SM6MVE,JO67KW,,,,,50: 10W 3el 144: 25W 4x9el SP2 432: 75W 4x13el SP70,03/06 +SM6NET,JO68SD,,,,,144: 300Watt 2x 17el - 432: 50Watt 21el,05/09 +SM6SKH,JO66IT,,,SM7SKH,,,06/09 +SM6TZX,JO67EE,,,,,,05/02 +SM6U,JO67AT,,,SpecialCall,,144: FT290 9el 25W,05/00 +SM6UMO,JO68DH,,,,,144: TR751 170W 2x13el SP2000,01/94 +SM6USS,JO67AT,,,,,144: FT290 9el 25W,07/97 +SM6WET,JO68SE,,,ALSO 8S6T & SG6T,,FT650 847 920,11/08 +SM7AED,JO65NI,,,,,144: 50W 5el,06/07 +SM7DTT,JO65LJ,EME,,,,,05/07 +SM7EAN,JO86,,,,,,07/99 +SM7EOI,JO86FP,,,,,IC7400,01/04 +SM7FJE,JO65ML,EME,,,,4x9 el,07/08 +SM7FMX,JO65KN,,,,,,08/04 +SM7FWZ,JO78,,,,,,03/03 +SM7GVF,JO77GA,EME,,SM4GVF,,144: 8x8 el 1KW MGF1302,11/08 +SM7IWG,JO77IP,,,,,,04/04 +SM7JUQ,JO65WX,,,,,50: 100W 5el - 144: 750W 9el - 432: 50W 19el,08/04 +SM7KNK,JO75,,,,,,01/93 +SM7MRL,JO65NP,,,,,144: TS850 transverter 130 1000W MGF1302,03/03 +SM7MXO,JO77,,,,,,07/04 +SM7OYP,JO66JA,,,,,50: 100W 5el,09/01 +SM7SJR,JO87FB,,,,,,10/08 +SM7THS,JO76WR,,,,,144: 15el 170W MGF1302,11/99 +SM7TJC,JO67SH,EME,,,,144: FT-225RD 2xGi7b (800W) - 432: FT-757GX Trvt 60W,05/02 +SM7TUG,JO65OT,,,,,144: 2x4CX250b 17el MGF1302,08/98 +SM7WSJ,JO67WI,EME,,,,144: 2X16 optimized for EME 1KW - 432mhz 2X19el 2.4ghz RX on satellite,10/05 +SM7WT,JO65QQ,,,,,144: IC-7400 PA 500 W 15 EL,08/06 +SO3Z,JO82KL,,,CONTEST CALLSIGN,,2m: IC-275A - PA 150W - 2x 10el DK7ZB || 70cm: IC-275A + trv MMT432 PWR 10W 16el and 8x10el DK7ZB only contest.,06/09 +SO4DFC,KO13AX,,,Expedition,,,01/92 +SO4TEC,KO13CW,EME,,Expedition QSL via DL3BQA,,,06/02 +SO5AS,KO02JD,EME,,QSL via G4ASL or LOTW,,50: GS31b 5el 144: 150Watts 14el (no ant. elevation),04/06 +SO9AN,JO84NG,,,Expedition,,,05/00 +SO9FB,JO84NG,,,Expedition,,,05/00 +SP1JVG,JO84LL,,,= KG2IS,,,02/01 +SP1NQE,JO84LL,,,,,TS746 TS811E,04/04 +SP2CHY,JO94GO,,,ex SP4CHY,,,02/05 +SP2FAX,JO83VA,,,,,144: 2KW 6x17el,08/03 +SP2HAX,JO83,,,,,,12/5 +SP2HNF,JO94FK,,,,,,10/05 +SP2IQW,JO94GM,,,,,50: IC-746 5el - 144: IC7-46 100W 2M5WL,09/08 +SP2JAN,JO94,,,,,,09/94 +SP2JYR,JO92GP,,,,,144: 2x 14el 1KW,01/08 +SP2MKI,JO93AC,,,,,,03/02 +SP2MKO,JO93CB,,,,,icom706mkIIg tm255a,08/05 +SP2MSL,JO92NM,,,,,,01/97 +SP2NJI,JO92OS,EME,,,,50: IC736 100W 5el - 144: IC271 500 W 4x8 el - 432: IC471 150W 4x25el - 1296: HM 15W 44el - 2320: HM 1W 25el,10/08 +SP2OFW,JO93AC,EME,,,,144: 2xGS35b 2x15el,05/05 +SP2QBQ,JO94FL,,,,,,06/08 +SP2SGZ,JO82UU,,,,,,01/96 +SP3EPX,JO83ID,,,,,,11/01 +SP3FSM,JO81GU,,,,,,08/02 +SP3IYM,JO82KL,,,,,2m: IC-275A - PA 150W - 2x 10el DK7ZB Yagi - LNA || 70cm: IC-275A + trv MMT432 PWR 10W 16el and 8x10el DK7ZB only contest.,06/09 +SP3MFI,JO91,,,,,,01/93 +SP3RNW,JO81GQ,,,,,50: 100W -144: 200W 11el MGF1302 - 432: 100W MGF1302 21el,08/03 +SP3RNZ,JO92DF,EME,,,,IC746 7el TAGI,09/03 +SP3SUX,JO72OR,,,,,144: 80W 14el BF981,12/96 +SP3TYF,JO82FH,,,,,FT857D TR9000,10/08 +SP3VSC,JO92DF,,,,,144: IC746 2X13B2 PA GS35B,01/04 +SP4BY,KO13OD,,,,,,07/04 +SP4DGN,KO13OD,,,,,,01/88 +SP4JCQ,KO13NC,,,,,FT920 IC910H 144: 100W 17el,09/06 +SP4MPB,KO03HT,EME,,,,144: TS2000 GS35b ATF54143 4 x 13el 50MHz: 2 x 7el 1296MHz 100W + 200cm dish,06/09 +SP5CCC,KO02NF,,,,,,01/09 +SP5CJT,KO02OD,EME,,,,,01/94 +SP5EFO,KO02,EME,,SilentKey,,,04/97 +SP5HEJ,KO02,,,,,,01/97 +SP5KVW,KO03SB,,,Expedition,,,01/89 +SP5LJX,KO03,,,,,,08/02 +SP5QWB,KO02NF,,,,,50: 400W 7el - 144: 1KW 17el - 432: 50W 26el,05/04 +SP5XMU,KO02LG,,,,,50: 100W 6el 144: 170W 13el 432: 50W 21el,05/09 +SP6A,JO81NG,EME,,ex SP6AZT,,,11/03 +SP6ARE,JO81IL,,,,,IC202 + 4cx250 to 7 ele quad,10/07 +SP6ASD,JO81LC,,,,,,05/02 +SP6AZT,JO81NG,,,,,,01/03 +SP6CPH,JO81,,,,,,09/01 +SP6GVU,JO81LC,,,,,144: 17el F9FT 200W MGF1302,02/01 +SP6GWB,JO80HK,EME,,,,50: FT847 1 kW 9 el (2 lambda) - 144: FT847 4x16 el DJ9BV 1KW CF300,03/05 +SP6GZZ,JO80FX,,,,,,10/04 +SP6HED,JO80IK,EME,,,,144: 13el 100W,07/05 +SP6IWQ,JO80HK,,,,,TR751e FT757gxII Trnsv 100W Pas,11/04 +SP6JLW,JO80JK,EME,,,,70cm 8x32el 2xGS35 23cm 6.5m dish 16xBLV958,10/08 +SP6NVN,JO81CJ,,,,,IC-910 H,12/08 +SP6OJE,JO90CI,EME,,,,TS-711a IC-735 4x 5el,10/06 +SP6VGJ,JO81HU,EME,,,,144: 4wl Antenna 1KW,10/06 +SP7BUZ,KO00HU,,,ex SQ7IKT,,,04/04 +SP7DCS,JO91RT,EME,,,,144: FT736r DSP GS35vb 16x 8el antennas,10/06 +SP7EBM,JO91QR,,,,,,01/02 +SP7HKK,JO91QI,,,,,IC-746,12/07 +SP7JSG,KO01BW,,,,,,03/02 +SP7OGP,KO01AM,,,,,IC706MKIIG 12el 7ZB 50W,05/08 +SP7SZG,JO91RQ,,,,,144: TS700 + PA 50: TS700+Trsv 10W,12/08 +SP7VC,JO91SS,,,,,,10/04 +SP8AOV,KO11GG,,,,,144: FT480r 100W 2x10el,03/00 +SP8NCJ,KO12NA,,,,,,11/95 +SP8RHP,KO10FF,,,,,144: 200W 10el DJ9BV,02/05 +SP8SN,KO11GG,,,ex SQ8GKQ,,,07/04 +SP8UFT,KO11JI,,,,,,01/02 +SP8WJW,KN09SR,,,,,144: 50W 9el,03/06 +SP9COO,JO90GA,,,,,144: IC251 + PA 100Watt 44el YU0B MGF1302,04/04 +SP9EWO,JN99HW,,,,,,08/06 +SP9HWY,JO90NH,,,,,50: 80W 7el,10/06 +SP9KUR,KO00MA,,,Expedition,,,01/93 +SP9LCV,JO90KF,,,,,IC-756pro IC735 TRC PA GI7 home made,03/06 +SP9PRO,JN99,,,,,,03/97 +SP9PZU,JO90,,,,,,07/96 +SP9QMP,JO90FB,,,,,,08/02 +SP9TCE,JO90,,,,,,08/98 +SP9TTG,JO90NU,EME,,,,144: 4x 5el ZB 1kW,03/08 +SP9UX,KO00XA,,,,,,07/04 +SQ5GVY,KO02MQ,,,,,FT817 IC290 IC490 PA,08/08 +SQ7DQX,JO91RR,,,,,144: 13el 50W,11/04 +SQ8GUP,KN09VQ,,,,,,04/01 +SQ9PM,JN99MT,EME,,EX SQ9HYM,,FT847 50: 6el - 144: 14el - 432: 29el,05/07 +SQ9PV,JO90KF,,,,,,01/03 +SQ9QU,JO90KH,,,ex SP9MRT,,144: TM 255A 40W 15 el yagi LCF 78-50 coax line,07/05 +SQ9W,JO90NH,EME,,ex SP9EWU,,,08/06 +ST2NH,KK65GP,EME,,,,144: IC910 LNA 160W 6el,12/08 +ST2RS,KK65GN,EME,,= ZL1RS,,50: 6el 1KW 144: 4x 8el 140W,01/05 +SV0EC,KN10CJ,EME,,,,144: TS770 700W 20el Gruppe,02/99 +SV1AAF,KM17VX,EME,,,,,01/92 +SV1AWE,KM17VU,EME,,,,432: 4x 21el 1500W,09/05 +SV1BJY,KM18UA,,,,,ft897/ft290r w 4x6el.yagi,06/08 +SV1BTR,KM18NO,EME,,,,144: FT847 16x 6el X-Pol 1.5KW - 432: 8x 26el 1.5KW,04/06 +SV1EEX,KM18UA,,,,,FT897D-FT857D-FT817-IC7400,11/08 +SV1OE,KM17VX,,,,,,08/08 +SV1WE,KM18VA,,,,,144: 500W 17el,07/98 +SV2BFN,KN10LN,EME,,,,ICOM IC-910,09/08 +SV2DCD,KN00LI,,,,,,06/06 +SV2EVS,KN10KP,,,,,,04/02 +SV2JL,KN10LO,,,,,,06/04 +SV2KBS,KN20WU,EME,,SW2KBS,,ICOM IC-7000,04/08 +SV3AAF,KM17KO,EME,,,,144: 4x 8el. and 8877,05/07 +SV3KH,KM07PQ,EME,,,,144: 4x 28el Xpol KW,07/05 +SV5BY,KM46CG,,,,,,01/03 +SV5BYR,KM46CG,EME,,,,144: FT847 2x 13el 600W MGF1302,01/06 +SV6DBL,KM09KO,EME,,,,144: 4x17 el. full elevation 1300W,04/05 +SV6KRW,KM09,EME,, +SV8CS,KM07JS,EME,,= KC2INN,,50: 2x 7el 1KW - 144: IC821 TS2000 4x 16el MGF1302 1KW,04/05 +SV8KOM,KM07KS,EME,,ex SW8KOM,,144: 4x 9el 1KW,05/06 +SV9CVY,KM25KA,EME,,,,144: 4x 8el. H pol. and 2x 12el. V pol and 3cx800,05/07 +SW6IED,KM09KQ,EME,,,,Icom 910H,12/08 +SX1FRE,KM18OE,,,SPECIALCALL,,,04/08 +SX5AS,KM35JV,,,EXPEDITION,,,08/07 +T33C,RI49XC,,,,,,01/03 +T49C,EL72,,,CONTESTCALL,,50: 4el 100W - 144: 9el 120W - 432: 17el 100W,06/07 +T61AA,MM21OE,EME,,= VK1UN,,50: 600W 8el 144: 9el 1KW,04/08 +T77NM,JN63FW,,,,,,04/07 +T77WI,JN63FW,,,Expedition - QSL via DJ2QV,,144: 350W 9el 11el,06/98 +T90M,JN82TW,,,Expedition,,,08/96 +T90N,JN82TW,,,Expedition,,,08/96 +T94KU,JN94JF,,,,,144: FT480r 6el 50W,01/00 +T94ZQ,JN94FP,,,,,,07/99 +T98CHR,JN84AX,EME,,Expedition,,,04/99 +T98LWT,JN84AX,EME,,Expedition,,,04/99 +T9SO,JN94IM,,,SpecialCall,,144: FT480r 8el 150W,08/98 +TA1D,KN41LB,,,,,144: 150W 2x 9el,10/05 +TA2ZAF,KM69KV,,,ex TA2/OK1MU,,144: 700W 11el,09/06 +TF3EJ,HP84,,,,,,10/95 +TF8ITT,HP94CD,,,,,144: 1KW ERP,08/02 +TG9AKH,EK44RP,,,,,TX YAESU FT-857 RX ICOM 756PROII,10/06 +TI9K,EJ65LM,EME,,EXPEDITION,,50: 100W vertical 144: 10el 350W 432: 27el 120W,01/08 +TK1DX,JN42RM,,,,,144: 8el 200W,01/99 +TK5EP,JN41IW,,,,,144: 400W 9el or 16el 900m.asl.,11/01 +TK5JJ,JN41IW,EME,,EX FC6ABP,,144: 700W 3cx 800 a7 2x 12el M2 LNA PA3BIY,05/07 +TM0EME,IN88QM,EME,,Expedition QSL via ON4DPX,,144: 2x 10el 200W,08/05 +TM1E,JN32CX,,,EXPEDITION,,,12/07 +TM6OLW,JN37,,,SpecialCall,,,01/05 +TN5SN,JI75PR,EME,,QSL VIA IZ1BZV,,,10/08 +TO4E,LG07EQ,,,,,,01/03 +TS7N,JM54NQ,,,Expedition,,144: IC275 HLV600 2x7el FX213,11/00 +TV6YGS,IN86,,,Expedition,,,01/87 +TZ5A,IK62,EME,,Expedition,,,09/06 +UA0COO,PN78MK,EME,,,,144: 4x 9el QRO,11/08 +UA0FMU,QN16IW,EME,,,,144: 4x 15el Xpol 1KW,04/06 +UA0SNV,OO17IW,EME,,,,432: 21el 50W,10/05 +UA1AFA,KO59EV,,,,,,08/02 +UA1ALD,KO49KO,,,,,144: 11el 100W,07/06 +UA1ARX,KO48VR,,,Expedition,,,08/04 +UA1C,KO58BR,,,Expedition,,,01/93 +UA1CEA,KO69,,,,,,04/99 +UA1CFM,KO69AK,,,,,,10/07 +UA1MC,KO59DW,,,,,,08/04 +UA1NAN,KP71ES,,,,,IC260,01/03 +UA1OLJ,LP03DC,EME,,,,144: 150W 9el,12/99 +UA1QV,LO08IW,,,,,144: 300W,06/99 +UA1TDZ,KO58UN,EME,,,,144: Kenwood ts2000 100w 10el / ic706mkIIg diamond x510n,08/07 +UA1UM,KO68WJ,,,,,,01/88 +UA1WER,KO47EU,,,,,144: 50W 4x17el QSL via DL9USA,01/02 +UA1ZCG,KP59JK,,,,,,01/03 +UA1ZCL,KP78TX,EME,,not qrv MS nw,,,01/92 +UA2FF,KO04,,,,,,12/04 +UA2FL,KO04FQ,,,,,,06/97 +UA3AGU,KO86OB,,,,,4el Quad,10/07 +UA3AKJ,KO95AO,EME,,,,,08/06 +UA3AOG,KO85SQ,,,,,144: IC706 100W 11el,07/00 +UA3ARC,KO85SO,,,,,144 :IC-275H GS-35B MGF1302 2M18XXX,07/04 +UA3DHC,KO96CB,,,,,,04/04 +UA3DJG,KO95CN,,,,,144: 11el 800W,07/03 +UA3GA,KO92GO,,,,,,11/04 +UA3IAG,KO77FN,,,,,,07/05 +UA3IDQ,KO66JF,,,,,,06/00 +UA3MAS,KO97ST,,,,,,01/94 +UA3MBJ,KO88SA,EME,,QSL via DK3WG,,,12/06 +UA3ME,KO97TS,,,ex UA3MEE,,,07/05 +UA3MHJ,KO87SR,,,,,,01/03 +UA3OG,LO07KS,,,,,,01/92 +UA3PBR,KO93BD,,,,,,01/86 +UA3PBT,KO84UF,,,,,,01/82 +UA3PC,KO84TF,,,,,144: 13el 1KW,08/05 +UA3PI,KO94DA,,,,,,08/08 +UA3PTW,KO93BS,EME,,,,144: 16el DJ9BV 1KW - 432: 8 yagis 200W,04/01 +UA3QHS,KO91QR,,,,,,01/81 +UA3QPA,KO91OO,,,,,,08/06 +UA3QR,KO92KA,,,,,,01/92 +UA3RAW,LO02RR,EME,,,,FT-857D,06/09 +UA3RBO,LO03NG,,,,,,11/03 +UA3RFS,LO02SW,,,,,,01/80 +UA3T,LO16GM,,,,,,07/03 +UA3TCF,LO26IU,EME,,QSL via DK3WG,,144: 300W,03/06 +UA3TDB,LO16,,,,,,01/79 +UA3TIE,LO16,,,,,,01/97 +UA3UBD,LO06GU,,,,,,01/80 +UA3UES,LO07MF,,,,,,01/92 +UA3WM,KO72QI,,,,,,07/04 +UA3WU,KO81BQ,,,,,,11705 +UA3XEH,KO73FU,,,,,,08/98 +UA3XFA,KO73DU,,,,,,01/96 +UA3YCC,KO73EG,,,,,,09/07 +UA3YCV,KO62CS,,,,,50W X-Yagi,08/08 +UA3ZAT,KO80,,,,,,01/91 +UA4AAV,LO21FC,EME,,QSL via DK3WG,,,04/99 +UA4ALU,LN29LA,EME,,,,,01/92 +UA4API,LO20QC,EME,,QSL via DK3WG,,,12/99 +UA4AQL,LO20QB,EME,,QSL via DK3WG,,144: 4x13el DJ9BV Preamp 0.8db 1.2kW(EME) 700W(MS),04/05 +UA4CC,LO21XN,EME,,,,,05/05 +UA4CDT,LO41AX,,,,,,01/83 +UA4FRL,LO23AE,,,,,,10/06 +UA4HAK,LO43NM,EME,,,,144: 4x 8el 800W,11/05 +UA4LCF,LO44EH,EME,,,,144-2x4wl 200w 432-2x11wl 200w IC-706mkiig lna,03/08 +UA4NM,LO48UP,,,,,,03/04 +UA4NX,LO48SO,EME,,UA4NDV,,144: 300Watt 14el DJ9BV IC-910H,01/08 +UA4PCY,LO45NU,EME,,,,144: 4wl Antenna 700W,11/06 +UA4SF,LO36WP,,,,,,01/86 +UA4UK,LO14MA,,,,,,11/03 +UA6LGH,KN97LF,EME,,,,,07/96 +UA9CGP,MO06RT,,,,,,01/03 +UA9CS,MO06GU,EME,,,,,10/06 +UA9FAD,LO88DA,EME,,QSL VIA DK3WG,,144: 1KW 4x16el - 432: 1KW 8x15el,10/07 +UA9FD,LO87DX,,,,,,05/05 +UA9FU,LO87DX,,,,,,08/06 +UA9HK,MO99DF,EME,,,,144: 4x 9el 600W,06/05 +UA9SL,LO71NS,EME,,,,144: 4x 17el 800W,09/06 +UA9UIZ,NO46EC,EME,,,,144: 13el 100W,10/07 +UA9XQ,LP63UM,,,,,,01/97 +UA9YLU,MO92HX,EME,,QSL VIA DK3WG,,,02/08 +UB0QF,KN77NU,,,,,,01/88 +UB2GA,KN77AB,,,,,,01/90 +UE1NLO,KP51IQ,,,Expedition,,,07/06 +UE1TWO,KO67PW,,,Expedition,,,07/04 +UE3RST,LO03,,,SPECIALCALL,,,08/08 +UN6PD,MN69JM,EME,,,,14el 1KW,12/07 +UN7LU,MO13TD,,,,,,01/03 +UN7PV,MN69MV,,,,,144: 80W 10db Antenna,12/06 +UN7TQ,MN52VV,EME,,,,,09/98 +UN8AG,LN53PH,,,ex UL7AAX,,,07/96 +UN8BA,MO51RD,EME,,,,,01/92 +UN9L,MO13tf,EME,, +UP7QP,MN83FD,,,,,,10/08 +UR3CTB,KN59RS,,,,,IC-820H 40W dk7zb 10 el LNA Gafest,09/07 +UR3EE,KN88DC,EME,,,,,11/02 +UR3EP,KN78WR,,,ex RB4EE,,,01/96 +UR3UW,KO50LI,,,,,,08/08 +UR4EWF,KN67OW,,,,,,07/03 +UR4LL,KO70XG,,,,,,10/00 +UR5BAE,KN29SM,,,ex UB5BAE,,,07/01 +UR5LLW,KN89EQ,,,,,,06/03 +UR5LX,KO70WK,EME,,QSL via DK3WG,,144: 4x12el ve7bqh 800W 13el BF981,12/06 +UR5M,KN99FD,,,Expedition,,,01/94 +UR5MID,KN98OO,EME,,,,144: 4x 12el,09/06 +UR5NOY,KN48KV,,,,,,07/05 +UR5RCP,KO51OM,,,,,,01/92 +UR5WET,KN19RG,,,,,144: FT817nd -100W -9el,06/08 +UR5ZPV,KN56SN,,,,,10ele 500W,08/08 +UR7GN,KN66HP,,,,,,06/96 +UR8IDX,KN87TC,,,,,,07/04 +US0WA,KN29XT,,,,,,07/95 +US1VQ,KN58XA,,,,,,08/95 +US5CCO,KN59XG,,,ex RB5CCO,,,05/02 +US5II,KN88WA,,,,,FT847,07/05 +US5LKW,KN89KL,,,,,,08/08 +US5WU,KO20DI,,,,,,06/02 +US8ICM,KN87UB,,,,,,08/08 +US8IGT,KN87SC,EME,,,,144: 4x 7el 400W,08/06 +US8IPB,KN87SD,EME,,,,,08/08 +UT1E,KN57XX,EME,,,,,08/03 +UT1EA,KN68RA,EME,,ex UT1E UB4EWA,,,08/03 +UT1EWA,KN68RA,,,,,,01/03 +UT1PA,KO21FC,EME,,,,,06/98 +UT1Q,KN77,,,Expedition,,,08/95 +UT2CO,KN58CR,,,,,,01/92 +UT2HN,KN79OI,,,ex UR5HAX,,144: 100W 16el,11/03 +UT2UB,KO40UO,,,,,,08/08 +UT2XQ,KO40IG,EME,,,,IC910H 4x 12EL 1.5KW,10/07 +UT3BW,KN29UA,,,ex UB5BDC,,,05/99 +UT3LL,KO80AC,EME,,,,432: 6x 27el 500W,09/05 +UT4EQ,KN78MK,EME,,,,,06/98 +UT4NJ,KN48KQ,,,,,FT-897D,02/09 +UT4NZ,KN49FF,,,,,,01/09 +UT5AO,KO61XQ,EME,,,,,01/94 +UT5BN,KO40,,,,,,01/81 +UT5CO,KN58CQ,,,,,,01/95 +UT5DL,KN18EP,EME,,,,,07/02 +UT5EC,KN78MN,EME,,,,,11/99 +UT5EG,KN78GJ,EME,,,,,01/94 +UT5ER,KN78ER,EME,,UR5EF UB5EFS,,144: 4x4.4L DJ9BV 1KW MGF1302,09/07 +UT5GU,KN68,,,,,,01/94 +UT5JAX,KN64RQ,,,,,,01/94 +UT5JCW,KN64SN,EME,,,,TS-2000X 17b2 M2-9WL 3.7m Dish,04/08 +UT5ST,KN28IW,,,ex UR5SKB,,FT847,05/05 +UT5UBB,KO50,,,,,,01/04 +UT5UCP,KO50DG,,,,,,07/01 +UT5VD,KN68MT,,,ex UB5VEP,,,10/04 +UT6UG,KO50EI,,,,,Icom 910h 144: 4x7el DK7ZB 432: 4x13el DK7ZB,11/05 +UT7GA,KN66HP,,,ex RB5GU,,144: 1KW 16el F9FT,09/99 +UT7VF,KN68MQ,EME,,SilentKey,,,06/96 +UT8AL,KO61WP,EME,,ex RB5AL - QSL via DJ9YE,,,08/99 +UU1AA,KN74BV,,,,,,08/04 +UU1DX,KN74BW,,,,,144: 500W,07/05 +UU5JJ,KN74AV,,,,,,01/03 +UW9AH,LO93KK,,,,,,01/92 +UX0FF,KN45NI,,,,,,07/04 +UX1AS,KO59FX,,,,,,01/03 +UX3LV,KO80EA,EME,,,,,08/05 +UX5UL,KO50FL,EME,,,,144: IC910H 900W 432: IC910 75W,11/07 +UY0LL,KN89CX,EME,,UB5LMJ,,IC-910H GS35,08/07 +UY0UP,KO50FJ,,,,,,10/06 +UY5HF,KN66HP,,,= UT7GA,,,06/96 +UY5OE,KO80AB,,,,,,01/94 +UZ1OVW,KP94VN,,,,,,01/92 +UZ2HZ,KN69RA,,,,,,08/08 +UZ3DD,KO86JH,EME,,SilentKey,,,01/93 +V47YC,FK87,EME,,Expedition,,,07/96 +V5/KT6Q,JG73NI,EME,,EXPEDITION,,,01/09 +VA2CST,FN35BP,,,,,,01/03 +VA2MGL,FN74UQ,,,,,50: 25W 3el,11/01 +VA2PRC,FN46,,,,,50: deltaloop 144: IC706 13el,01/98 +VA3LK,FN14TO,,,,,,01/03 +VA3NFA,FN25BH,,,,,,12/06 +VA3TO,FN03BI,EME,,,,144: 2x 12el 300W,04/06 +VA3VFO,FN04FC,EME,,,,,09/07 +VA5VHF,DO70FJ,,,,,,01/03 +VA6DX,DO33IM,,,ex VE6MK,,144: 1KW 4x 2M9,01/01 +VA6SZ,DO33AP,EME,,EX VE6AQE,,IC910 IC756proII,10/07 +VA7MM,CN89OG,EME,,,,1296: 3m dish 400W 0.4db Rxampl,09/06 +VE1ALQ,FN65VH,EME,,,,,10/02 +VE1GRT,FN84IQ,,,,,,01/03 +VE1JF,FN74cq,EME,, +VE1KG,FN84CM,EME,,ex VE4XP FP4RS F8PZ,,144: 4x17el M2 50W,10/06 +VE1MQ,FN65,,,,,,01/03 +VE1RG,FN65PT,EME,,,,144: 170W longyagi,04/05 +VE1SKY,FN74,,,,,50: FT620B 3el,01/01 +VE1TAY,FN66,,,,,,01/01 +VE1XYL,FN65VH,,,,,,01/03 +VE1ZJ,FN96UC,EME,,,,144: 1.8KW 6x18el,12/01 +VE2BKL,FN48DJ,,,,,50: 1000W 6el - 144: 150W 19el,04/02 +VE2CST,FN35BP,,,,,,01/03 +VE2DIV,FN35BP,,,,,,01/03 +VE2DSB,FN35hs,EME,, +VE2JWH,FN35LM,EME,,,,144: 4 x 18el K1FO 1.5kw,09/07 +VE2PEP,FN46HC,,,,,KENWOOD,09/07 +VE2PIJ,FN36KA,EME,,,,50: 6el 200W 144: 4 x 18el. K1FO 1.5kw 432: 24el 25W,06/09 +VE2PIJ/P,FN35QI,EME,,,,50: 6el 200W 144: 4 x 18el. K1FO 1.5kw 432: 24el 25W,06/09 +VE2UG,FN35,,,,,,01/03 +VE2WHZ,FN08WN,,,,,,01/03 +VE2YAG,FN19ES,,,,,,01/03 +VE2ZAK,FN25BK,EME,,,,4 x 13 el. and 100W,10/08 +VE3AX,FN02CW,,,ex VE3VD,,1.5KW 50-432 multiple Yagi arays,01/02 +VE3BDR,EN98,,,,,,01/03 +VE3BFM,FN04AE,,,,,,01/03 +VE3CF,FN03,,,,,,01/03 +VE3CVG,FN25HM,,,,,,01/03 +VE3DBP,EN94EE,,,,,,01/03 +VE3DEW,FN04,EME,,,,,01/03 +VE3DIR,FN03,,,,,,01/03 +VE3DSS,FN03FQ,EME,,= VE3KU,,,07/06 +VE3DXP,EN92JW,EME,,,,144: 100W 2x 10el,04/06 +VE3FAC,FN03IS,EME,,,,,01/03 +VE3FAL,EN58DF,EME,,,,,03/05 +VE3FGU,FN04GG,EME,,,,50: 1000KW - 144: 600W 19el,10/06 +VE3FOD,EN76,,,,,,01/03 +VE3JJX,EN29SS,,,,,,01/03 +VE3KH,FN03AJ,EME,,EX VE3KDH,,FLEX-5000A & M2 6M5X,06/09 +VE3KRP,EN58IJ,EME,,,,,04/07 +VE3KU,FN03FQ,EME,,= VE3DSS,,,07/06 +VE3NE,FN03FQ,,,,,,01/03 +VE3OQC,FN03,,,,,,01/03 +VE3SCP,EN93WV,,,,,,01/03 +VE3SPW,FN04GG,EME,,,,144: 100W 17el,04/05 +VE3STZ,EN82,,,,,,01/03 +VE3WMD,EN92JN,,,,,,01/03 +VE4AAZ,EN19,,,,,,01/03 +VE4ACX,EN19,,,,,,01/03 +VE4AJB,EO00,,,,,,01/03 +VE4AP,EN19,,,,,,01/03 +VE4AQ,EN19OR,,,,,144: 1KW 4218XL,01/01 +VE4CCW,EN19,,,,,,01/03 +VE4CT,EN19OW,,,,,,01/03 +VE4DK,EN19,,,,,,01/03 +VE4FV,EN19,,,,,,01/03 +VE4GHR,EN19,,,,,,01/03 +VE4GLS,EN19,,,,,,01/03 +VE4HAY,EN19,,,,,,01/03 +VE4JX,EO00,,,,,,01/03 +VE4KQ,EN19,,,,,,01/03 +VE4KU,EN19,,,,,,01/03 +VE4LAR,EN19,,,,,,01/03 +VE4MA,EN19LU,EME,,,,,01/03 +VE4MBQ,EN19,,,,,,01/03 +VE4MHZ,EN19,,,,,,01/03 +VE4MX,EN19,,,,,,01/03 +VE4OV,EN19,,,,,,01/03 +VE4PQ,EN19,,,,,,01/03 +VE4RCJ,EN19,,,,,,01/03 +VE4RE,EN19,,,,,,01/03 +VE4TOM,EN-19,,,,,,01/03 +VE4TV,EN19CX,,,,,,01/03 +VE4UD,EN19,,,,,,01/03 +VE4ZI,EN19,,,,,,01/03 +VE4ZK,EN19,,,,,,01/03 +VE4ZV,EO10IH,,,,,,01/03 +VE5UF,DO61OV,EME,,,,50: 600W 5EL yagi 144: 325W 4 x 2M12,10/08 +VE6AFO,DO21,EME,,,,,01/03 +VE6AT,DO33GS,EME,,,,432: 5.5m dish GS23b,03/06 +VE6BPR,DO32BG,,,,,50: 150W 5el - 144: 250W 16el crossyagi,01/01 +VE6CPP,DN39ER,EME,,,,144: 2x 13el 170W,02/08 +VE6EGN,DO23QE,EME,,,,144: 22el Xpol 150W,06/05 +VE6LR,DO21,,,,,,01/03 +VE6NA,DO20,EME,,,,,01/03 +VE6NTT,DO31,,,,,144: 170W 17el,01/98 +VE6PY,DO20WW,,,,,,01/03 +VE6TA,DO33GS,EME,,,,432: 5m dish 800W,02/05 +VE6XT,DO,,,,,,01/03 +VE7BBG,CN88DT,EME,,,,,04/05 +VE7BEE,DN09HG,,,,,,01/03 +VE7BQH,CN89KI,EME,,,,384el Collininar,10/05 +VE7CFT,CN79ST,,,,,,01/03 +VE7CLD,CN89LD,EME,,,,,01/03 +VE7DUB,CO88RT,EME,,,,,09/06 +VE7DXG,CN88DT,EME,,ex VE3GBA/7,,50: 150W 5el - 144: 150W 15el,02/05 +VE7FYC,CN89,,,,,,01/03 +VE7IRA,CN89MF,EME,,,,144: 13el 200W,10/08 +VE7KPB,DN29CM,,,,,144: 1KW 5wl M2,06/01 +VE7LGF,CO90TQ,EME,,VE5AGJ,,FT100D 144: 17B2 500W,11/06 +VE7MDL,CN89,,,,,,01/98 +VE7RJ,DN09LL,,,,,,01/03 +VE7SKA,CN88GT,,,,,,01/01 +VE7TIL,CN89LG,,,,,144 : 4x 7el 500W,11/06 +VE7US,CN88IG,,,,,,01/03 +VE7VVW,DO00IF,,,,,144: 160W KLM2m22c - 432: 100W MBM88,01/02 +VE7ZD,CN89LG,,,,,,01/03 +VE9AA,FN66NA,,,,,,06/06 +VE9DX,FN75aj,,, +VE9PA,FN65SU,,,,,,01/03 +VK0MT,QD95KM,EME,,,,,03/05 +VK1VP,QF44NR,EME,,,,,03/05 +VK1WJ,QF44MS,,,EX DK3SA,,TS 50S IC 706 MK2 IC 490A 80W 2m PAm 50W 70cm PA,05/07 +VK2ALU,QF55KN,EME,,,,,01/03 +VK2AWD,QF56NG,EME,,,,144: 2x 13el 2.2ld 300W,10/06 +VK2CZ,QF56NH,,,,,,01/03 +VK2DJG,QF59VK,,,,,,01/04 +VK2FLR,QF56OD,,,,,,01/03 +VK2IT,QF56OH,EME,,,,144: FT-847 350W 1x 8el 12el coming soon,04/06 +VK2JKK,QF69LO,,,,,,01/03 +VK2KRR,QF34MR,EME,,,,144: 400W 4x 17el,07/06 +VK2KU,QF55AI,EME,,,,144: 600W 4x 12el horz,10/08 +VK2SN,QF56OC,EME,,,,432: 4x 28el legal pwr,12/05 +VK2XCI,QF27WD,,,,,,01/03 +VK2XDE,QF56MG,EME,,,,,04/05 +VK2ZT,QF57WF,EME,,,,,12/07 +VK2ZZF,QF43JP,EME,,,,144: 8 over 8 100W,10/06 +VK3AMZ,QF22IC,EME,,,,,01/93 +VK3AXH,QF12WI,EME,,,,144: 4x 18el 400W,08/06 +VK3CY,QF13,EME,,,,,04/00 +VK3DDU,QF22LG,EME,,,,144: 2x 10el 200W,02/09 +VK3HY,QF22PD,,,,,,01/03 +VK3HZ,QF22ME,EME,,,,,09/05 +VK3II,QF21RN,EME,,,,144: 14el 300W,12/06 +VK3OT,QF12AG,EME,,,,,01/94 +VK3VHF,QF32SE,EME,,,,IC910 GPS Locked 3WL Horz Antenna,07/08 +VK3ZYC,QF31NT,EME,,,,144: 2x 10el 4wl Yagis 300W,03/05 +VK4/DL2NUD/QG47,QG47WE,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG49,QG49JR,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG53,QG53WL,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG55,QG55WU,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG56,QG56IV,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG64,QG64NC,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4/DL2NUD/QG65,QG65FE,EME,,EXPEDITION,,144: 18el 1500W Preamp,02/09 +VK4ABW,QH30GT,EME,,,,144: 4x 17el 300W,10/06 +VK4ADC,QG62MJ,,,,,50 and 144: Icom IC-7400 100w PEP,01/08 +VK4AFL,QG62OG,EME,,,,432: 16x 15el 100W,10/06 +VK4APG,QG62LP,EME,,,,,01/94 +VK4CDI,QG52XH,EME,,,,144: 300W 4 x 12El Yagi - 432: 450W 4 x 22El Yagi,02/08 +VK4EME,QG63KQ,EME,,VK4KAZ,,TS2000,09/07 +VK4JMC,QG62FI,EME,,,,4x 14el 200W,08/08 +VK4JSR,QG62NM,,,,,50: 100W 8el - 144: 400W 12el - 432: 100W 28el,10/00 +VK4KAZ,QG63KQ,EME,,,,,01/03 +VK4KDD,QG62LP,EME,,,,,10/06 +VK4KZR,QG62LO,EME,,,,,08/00 +VK4WS,QG62OK,EME,,,,144: 12el QRP,12/06 +VK5DK,QF02JE,,,,,,01/03 +VK5MC,QF02EJ,EME,,,,,01/03 +VK5OA,QF02JE,,,,,,01/03 +VK5ZLX,PF95MK,EME,,,,,04/07 +VK5ZLX,PF95MK,EME,,,,,04/07 +VK6KDD,OG99HP,EME,,ex VK4KDD PE1OZH,,LT2S LT6S TS850,03/06 +VK6KXW,OF87JR,,,VK6ZDY,,,05/07 +VK7JG,QE38NN,EME,,,,144: 2x 12el 500W,07/06 +VK7MO,QE37PC,EME,,,,144: 4x 10el,03/05 +VK8MS,PH57PK,EME,,EXPEDITION,,,10/08 +VK9CD,NH87JU,,,,,,01/03 +VK9CMO,NH87KT,EME,,Expedititon,,144: 230W 1Yagi 6wl,08/05 +VK9XMO,OH29UN,EME,,Expedititon,,144: 230W 1Yagi 6wl,09/05 +VK9XW,OH29TI,,,,,,01/03 +VP2EC,FK88LD,,,,,,01/03 +VP2EDS,FK88,EME,,= KJ9I,,,05/07 +VP2MIS,FK86UV,EME,,,,,11/00 +VP2MR,FK86VS,,,,,,01/03 +VP5JM,FL31VS,,,,,,01/03 +VP8NO,GD18BH,EME,,EX G3VUI,,50: 5el Acom 1000 Ampl.,03/08 +VQ9LA,MI62,EME,,,,,09/02 +VR2KW,OL72LL,EME,,,,,06/07 +VS6BI,OL72CG,,,,,,01/03 +VT3AT,RJ38UR,,,,,,01/03 +VU2BMS,MK80EA,EME,,,,FT 857,02/08 +VU2KGB,MK80EA,EME,,,,144: 2x 5el 160W,02/09 +VU7RG,MK61JG,EME,,Expedition,,144: 1KW 28XPol Preamp,01/07 +W0AH,EM85WB,EME,,ex W2CRS,,144: 18el 700W,08/06 +W0AUS,EN35KA,,,,,,01/03 +W0BJ,DN91OD,,,,,,01/03 +W0DB,EN11VD,,,,,144: 50W 2x 8el,09/01 +W0DEN,EN41,,,,,,01/03 +W0DFK,EM47LX,,,,,,01/03 +W0DJM,EN25XK,,,,,,01/03 +W0DQY,EM48RS,,,,,144: 350W 4x8el - 432: 175W 2x88el - 1296: 10W 45el,01/01 +W0EKZ,EM17,,,,,,01/03 +W0ETT,DM79,,,,,,01/03 +W0FMS,EN42EB,,,,,,01/03 +W0FY,EM48,,,,,,01/03 +W0GAJ,EN11,,,,,,01/03 +W0GC,EN14SQ,,,,,,01/03 +W0GHZ,EN34LX,EME,,WA0BWE,,FT-736r TS-440 TS-930 TS-700SP 144: 17B2 1KW Xverters on 902Mhz - 10Ghz,12/07 +W0GN,EN42,,,,,,01/03 +W0GR,EM38AX,,,,,,01/03 +W0HHE,DM79,EME,,,,,01/03 +W0HL,EM27,,,,,,01/03 +W0HP,EN34IT,EME,,,,,11/06 +W0HRG,EM39,,,,,,01/03 +W0IC,DM79MR,,,,,,01/03 +W0IOH,DM78OU,,,not qrv MS nw! (02/01),,,01/01 +W0IPL,DN62UU,EME,,,,,01/04 +W0ITB,DM79,,,,,,01/03 +W0IZ,EN41,,,,,,01/03 +W0JRP,EM27RB,,,,,,01/03 +W0KFG,DN96OT,,,,,,09/01 +W0KJY,DN71,EME,,,,,09/01 +W0KRX,EN34LM,,,,,,01/03 +W0KT,EN21,,, +W0LD,DM78,,,,,144: 1KW 2x16el,04/01 +W0LER,EN35IE,,,,,,01/01 +W0LGQ,EN21DJ,,,EX N0EKT,,,05/07 +W0LMD,DM79,,,,,,01/03 +W0MD,EN36,,,,,,01/03 +W0NKN,EN42,,,,,,01/03 +W0OF,EM12,,,,,,01/03 +W0OHP,EN10,,,,,,01/03 +W0OHU,EN34OA,,,,,,01/03 +W0OZI,EN35,,,,,,01/03 +W0OZL,DN60FM,,,,,,01/03 +W0PEC,EN34,,,,,,01/03 +W0PHD,EN18OE,,,,,144: 190W 16lbx,09/01 +W0PPF,EN41,,,,,,01/03 +W0PT,EM28OD,EME,,,,144: 4X 19XXX and 1.2kw,03/06 +W0PW,EM26TW,,,,,,01/03 +W0QIN,EN34,,,,,,01/03 +W0RAP,EN42EB,,,,,,01/03 +W0RGU,EN35,,,,,,01/03 +W0RKP,EN31,,,,,,01/03 +W0RRY,EM26BX,EME,,,,144: 700W 9elM2 0.6db Preamp,01/01 +W0RSJ,FN20JQ,,,,,,01/03 +W0RTZ,DM79,,,,,,01/03 +W0RWH,EM39SX,EME,,,,144: 16x19el,10/98 +W0SD,EN13GQ,EME,,,,,10/98 +W0SII,DN71,,,,,,01/03 +W0TJ,EN10,,,,,,01/03 +W0TUP,DN98IF,,,,,144: 13B2,03/06 +W0UC,EN35,,,,,,01/03 +W0UHF,EN32,,,,,,01/03 +W0UN,EL07FV,,,,,,01/03 +W0UT,EM17,,,,,,01/03 +W0VB,EN34QB,EME,,,,144: 21el 1KW,10/06 +W0VD,EM27UD,EME,,,,144: TS790A 8877 (1-5KW) 18elM2,01/01 +W0VX,EM12,,,,,,01/03 +W0WGZ,EN42,,,,,,01/03 +W0WOI,EN22TA,,,,,,01/08 +W0WTG,EM48,,,,,,01/03 +W0XG,EN34GX,EME,,,,144: 2x 14el 1KW,11/05 +W0YPT,EN43,,,,,,01/03 +W0ZJY,EM28,,,,,,01/03 +W0ZQ,EN34IU,,,,,,01/03 +W0ZZQ,EM26,,,,,,01/03 +W1CDO,CN87XF,,,,,,01/04 +W1COT,FN31ST,,,,,,01/04 +W1CQD,FN34MR,,,,,,01/04 +W1FIG,FN41GV,EME,,ex PE1FIG,,50: 1KW 2x7el - 144: 9el M2 1KW 0.8db - 222: 450W 10el - 432: 450W 18el,01/01 +W1FKF,FN42JK,EME,,WB1FKF,,Kenwood TS 2000 4x6 el 800 watts EME 2 Meter,05/07 +W1FM,FN42,,,,,,01/03 +W1GHZ,FN42,EME,,ex N1BWT,,,11/06 +W1HY,FN41HV,,,,,,01/03 +W1IPL,FN54FC,EME,,,,144: 4x 12el 200W,01/09 +W1JJ,FN41FO,EME,,,,50: 4x 9el 1500W,05/05 +W1JR,FN42HN,EME,,,,,12/00 +W1LP,FN41SR,,,,,144: 1KW 2x2M9,01/01 +W1PWW,FN53DT,EME,,,,144: 2x 18el 1500W,08/05 +W1QA,FN32,EME,,PA3GCQ ZL2GCQ WF1R,,Orion - TS2000,05/07 +W1QC,FN42HU,EME,,,,,01/03 +W1REZ,FN55,,,,,,10/00 +W1RZF,FN42FC,,,,,,01/04 +W1TE,FN42EN,,,,,50: 1KW 7el - 144: 1KW 22el - 432: 44el,08/01 +W1TMZ,FN41GO,EME,,,,144: 4x 12el 1KW,12/08 +W1UHE,FN41,,,,,,01/03 +W1VT,FN33KE,,,,,,01/03 +W1XE,DM79GW,,,,,,01/03 +W1XR,FN42HW,,,,,,01/03 +W1ZC,FN42DR,,,,,144: 1KW - 432: 36el,01/02 +W1ZX,FM18LG,,,,,,01/03 +W2AXU,FN20OG,,,,,,01/03 +W2BZY,EL98HR,,,,,50: 700W 7el - 144: 400W 2X17el - 222: 300W 23el - 432: 500W 2X38el MGF - 903: 60W 47el - 1296: 50W 55el - 2304 15W 76el - 3456 45W 116el - 10368 1W 2'Dish,04/07 +W2CNS,FN13GA,EME,,,,144: 4x 20XP 1KW,07/06 +W2CRS,DM78,,,,,,01/03 +W2DBL,FN20TK,EME,,,,144: 4x 13el 700W,10/08 +W2DRZ,FN02LA,EME,,,,,01/01 +W2ETI,FN21,EME,,,,,01/03 +W2HBA,FN31TC,,,,,,01/03 +W2MPK,FN23BA,EME,,,,,10/99 +W2PU,FN20QI,EME,,,,432: 4x15XP 750W +W2SZ,FN22,,,,,,01/03 +W2TSL,FN41AA,EME,,,,144: 4x 9el 600W,12/07 +W2UHI,EN73AH,EME,,,,,01/03 +W2VU,FN20,,,,,,01/03 +W2WD,FN20TP,EME,,,,432: 9wl 600W,09/05 +W3ARS,FK88LC,,,,,,01/03 +W3BDP,FM29,,,,,,01/03 +W3BW,FN30AS,,,,,,01/03 +W3EME,CN85BE,EME,,ex K3VGX,,144: Icom 746 MGF2430A MGF1302 4x14el X-Pole 8877,01/05 +W3HQT,FN54,,,,,,01/03 +W3IKE,FM18SW,,,,,,01/03 +W3IOA,EM00,,,,,,01/03 +W3IWI,FM19ME,,,,,,10/05 +W3KJ,FN20HG,,,,,,01/03 +W3MRG,FN10UB,,,,,,01/03 +W3RY,FN10LL,,,,,,01/03 +W3SDZ,FN11,,,,,,01/03 +W3SE,DM03WW,,,,,50: 50W 5el - 144: 150W 12el,04/02 +W3SZ,FN20AH,EME,,ex WA3JYM,,144: 1500W 2x 2MXO32 - 432: 100W 9wl. - 1296: 10W 4x22el - 2304: 10W 2x2ft dish,10/06 +W3TMZ,EL88SU,,,,,,01/03 +W3TWO,FM28CA,,,,,144: 400W M2,07/01 +W3TWX,FN33UR,EME,,,,IC275H+8877+LNA145+4x18elM2,02/08 +W3TWX,FN33UR,EME,,,,IC275H+8877+LNA145+4x18elM2,02/08 +W3UR,FM19LG,,,ex WR3E WB3JRU,,FT1000MP FT847 C3I 7el 22ft 1KW,04/05 +W3UUM,EL29PW,EME,,ex WA3UUM,,144: 24el 1000W,08/06 +W3VH,FN32HG,EME,,,,,01/03 +W3WJR,FN20LL,,,,,,01/03 +W3XO,EM00KD,,,,,,01/03 +W3XS,FN10,EME,,,,,01/00 +W3ZZ,FM19JD,,,,,50: 1-5kw 8el 144: 1-5kw 17 el - 432: 1Kw 33el,07/01 +W4ABC,EL87PT,,,,,50: 100W 7el qubical quad,01/01 +W4AD,FM18IP,EME,,ex K4HWG,,,07/01 +W4AME,EM75FG,,,,,,01/03 +W4AS,EL95to,,, +W4CHA,EL88QA,,,ex WA4CHA,,50: 150W 9el M2 - 144: 1-5KW 2M18xxx - 432: 500W 424B - 1296: 110W 45el - 2304: 5W 45el - 10G: 2W 10ft,01/01 +W4CN,EM17JP,,,,,,09/01 +W4DNR,EM64rr,,, +W4ET,EM56TP,,,,,,01/04 +W4FJ,FM17,,,,,,01/03 +W4GHW,EM81EQ,,,,,,01/04 +W4HTB,EM66,,,,,,01/03 +W4KXY,EM84,,,ex WA4KXY,,,01/01 +W4LNG,EM73VK,,,,,,01/03 +W4LSC,DM25XF,,,,,ICOM 910 w/23 cm,04/08 +W4MOP,EM78,,,,,,01/03 +W4OZK,EM73,,,,,,01/03 +W4PJV,EM65SU,,,,,,01/03 +W4PZA,EM66NC,,,,,,01/03 +W4RBO,EL99KF,,,,,,01/03 +W4RDI,EL96BQ,EME,,,,,01/03 +W4REB,EM78,,,,,,01/03 +W4RFR,EM65,,,,,,01/03 +W4SM,FM08QA,EME,,,,,01/04 +W4SW,FM18IW,EME,,,,144: 4x 10el X-Pol 1.5KW Yaesu 767 and 736 to linears through 1296 Yaesu 817 with trvt on 2304 and above,10/05 +W4TJ,FM08,EME,,,,,06/00 +W4TNV,FM05XD,,,,,,01/03 +W4UDH,EM52AG,,,,,,10/07 +W4UDQ,EM55DB,,,,,,01/03 +W4UE,EM90GC,,,,,,12/97 +W4VHF,EM95,,,,,,01/03 +W4WD,DN40AM,,,,,,01/03 +W4WDH,EM83,,,,,,01/03 +W4WHN,EL94HP,,,,,,09/01 +W4WSR,EM85CB,EME,,,,144: 4x 8el 700W,12/05 +W4WTA,EM83XJ,,,,,144: 160W 18el,11/01 +W4XP,FM18EW,EME,,,,FT-2000 FT-847 DEMI 222 DB6NT 1.2 - 10 GHz,09/07 +W4ZPG,EM73WU,,,,,,01/03 +W4ZRZ,EM63SS,,,,,,01/03 +W5AK,EL29,,,,,,01/03 +W5AL,DM95XB,,,,,50: 150W - 144: 1KW 18el M2 - 222: 130W - 432: 100W,01/01 +W5CTV,EL49WU,,,,,,01/03 +W5DBY,EM12,,,,,,01/03 +W5DID,EL29,,,,,,01/03 +W5DKE,EM12LL,,,,,,01/03 +W5DS,EM15,,,,,,01/03 +W5ETG,EM12LS,,,,,,01/03 +W5FR,EM12KX,,,,,,01/03 +W5FYZ,EM32,,,,,,01/03 +W5GDL,EM15GM,,,,,,01/03 +W5GEL,EL17,,,,,,01/03 +W5GG,EM12,,,,,,01/03 +W5GKO,EM35,,,,,,01/03 +W5GNB,DM73VB,,,,,,01/03 +W5GVE,EM01,,,,,,01/03 +W5HES,EM12HQ,,,,,,01/03 +W5HPT,EM12,,,,,,01/03 +W5HTZ,EM16,,,,,,01/03 +W5HUQ,EM35BC,,,,,,07/01 +W5ITI,EM32,,,,,,01/03 +W5IU,EM12HP,,,,,,01/03 +W5IXR,DM76,,,,,,01/03 +W5JBP,EM12,,,,,,01/03 +W5KDA,EM41HM,EME,,,,144: TS790A 4x 17el 500W,08/06 +W5KI,EM36cl,,,,,756ProII Acom 1000,08/05 +W5KLF,EM31PJ,,,,,,01/03 +W5KQJ,EM12BS,,,,,,01/03 +W5LBT,EM40KV,EME,,= WB5LBT,,,08/05 +W5LUA,EM13QC,EME,,,,,01/03 +W5LUU,EL09QO,EME,,,,144: FT736r 1.5KW 4x5wl - 432: 1.5KW 1x5wl,08/01 +W5MRF,EM12,,,,,,01/03 +W5NFC,EM10,,,,,,01/03 +W5PIC,EM16LJ,,,,,,01/03 +W5PLN,EM12,,,,,,01/03 +W5RCI,EM44UF,EME,,,,,01/97 +W5SNX,EM73WT,,,,,50: 150Watts 6M7JHV @65ft - 144MHz : 500Watts 8wl @65ft,01/02 +W5SXD,EM02XS,EME,,,,ic-756 ts2000x commander 1500 w on six,06/09 +W5TCD,EM12,,,,,,01/03 +W5TVG,EM26,,,,,,01/03 +W5UC,EM21PI,EME,,,,144:,11/05 +W5UN,EM23MG,EME,,,,144: 32x 2M5WL,04/07 +W5UPR,EL29,,,,,,01/03 +W5UWB,EL17AX,EME,,,,50: 6el 1000W 144: 21el (8wl) 1500W NO elevation 432: 23el 150W,03/07 +W5VUY,EM40,,,,,,01/03 +W5WJP,EM12HO,,,,,,01/03 +W5YUO,EM12,,,,,,01/03 +W5ZN,EM45DH,EME,,,,,12/00 +W6CAP,DM14,,,,,144: FT726r 1KW 2yagis,01/01 +W6CPL,DM04,,,,,,01/03 +W6FC,DM03,,,,,,01/03 +W6HD,CM98PF,EME,,,,,01/03 +W6IHG,FM09TB,EME,,,,144: 11el 300W,01/06 +W6IZU,CM98NO,,,,,,01/03 +W6KH,CM97,,,,,,01/03 +W6MT,CM87XH,,,,,,01/03 +W6NQ,DM13,,,,,,01/03 +W6OMF,CM98AK,,,ex WB5OMF,,144: 650W 2x17el - 222: 120W 7wl - 432: 175W 2x9el,01/01 +W6OUU,DN22SN,EME,,,,144: 700W 18el MXXX,10/08 +W6OYJ,DM12,,,,,,01/03 +W6QT,CM87,,,,,,01/03 +W6SZ,DM14ED,EME,,,,TS-850 TS-700,02/08 +W6TE,DM06CT,EME,,,,,01/03 +W6US,DM13JA,,,,,,01/03 +W6WE,CM95RD,EME,,,,,11/03 +W6YLZ,DM04RF,,,,,50: 80W 4el - 144: 150W 14el,01/01 +W6YX,CM87WJ,EME,,,,,01/04 +W7ALW,DN36AU,EME,,,,50: 8877 9el - 144: 1KW 2x 18xxx - 432: 1500W 4x13wl,06/06 +W7AMI,DN13VO,EME,,ex KJ7F,,432: 4x 28el 750W,09/05 +W7ANF,DM43AS,,,,,144: 15W Vertical,07/01 +W7AV,CN88MB,EME,,,,144: 4x 20XP 600W,07/06 +W7BBM,DM42MB,EME,,,,,01/03 +W7CE,CN87OA,EME,,,,50: IC-756 PRO III 1500W 1x7MJHV - 144: FT-736R 500W 1x18MXXX Yagi,05/08 +W7CI,DM41UN,EME,,,,,01/03 +W7CNK,EM15FI,EME,,,,144: 2x 9el 400W,10/06 +W7CQ,CN83JX,,,,,,01/03 +W7CS,DM42OO,EME,,ex WA6MGZ,,50: 1.5KW 7el - 144: 500W 4x13el - 432: 500W 2x22el - 1296: 15W,08/01 +W7DHH,DM48LL,,,,,,01/03 +W7DWW,CN87,,,,,,01/03 +W7EME,CN85BE,EME,,,,50: 2x 9el 8877 - 144: FT736r Mutek DSP Preamp GS23B 6x 7wl - 432: 8x 42el Xpol 8877,10/08 +W7EME/CN72,CN72,EME,,EXPEDITION,,,02/09 +W7EME/CN76,CN76,EME,,EXPEDITION,,,02/09 +W7EME/CN86,CN86,EME,,EXPEDITION,,,02/09 +W7EME/DN11,DN11,EME,,EXPEDITION,,,02/09 +W7EME/DN42,DN42WQ,EME,,EXPEDITION,,,03/09 +W7EME/DN53,DN53WV,EME,,EXPEDITION,,,03/09 +W7EME/EN17,EN17,EME,,EXPEDITION,,,03/09 +W7EW,CN84LV,,,ex W7AT N7AVK,,FT1000MP 144: 1-5KW,08/03 +W7FN,CN88SA,EME,,,,,11/03 +W7GJ,DN27UB,EME,,ex WA1JXN,,50: 4x 9el 1.5KW 144: 16x 17el 1.5KW MGF1402,08/05 +W7GTM,CN87VU,,,,,,01/03 +W7GZ,DM42NF,,,,,,01/03 +W7ID,DN13UN,EME,,,,,01/02 +W7IUV,DN07DG,EME,,,,144: 4x 8el 500W 432: 33el 50W,04/06 +W7IXL,DM03US,,,,,,01/03 +W7JF,DN55RS,,,,,,01/03 +W7JW,EN82HJ,,,,,,01/03 +W7KK,DM18,EME,,Expedition,,144: 2 x 18XXX at 40'/50' KW Output FT847,04/01 +W7LD,DM78OV,,,,,,01/03 +W7MEM,DN17NT,EME,,ex N7EIJ,,50: 600W 9el - 144: FT726r 2002A 800W 4x5wl - 432: 800W 4x30lbx,09/01 +W7NS,DM33WP,,,,,,01/03 +W7NTF,CN87TB,,,,,50: 160W 6el - 144: 160W 13el,01/01 +W7OJT,DM26KB,EME,,,,,10/06 +W7PW,DM09JI,,,,,,01/03 +W7QX,DM44AR,EME,,,,1296: 10 1/2Dish 75Watt,03/04 +W7SZ,CN85UO,EME,,,,432: 4x32el X-pol 1.5KW - 1296: 3m dish 500W,01/00 +W7TVF,DM26,EME,,,,,01/03 +W7UPF,DM42MF,EME,,,,,08/05 +W7VQQ,DM19,EME,,,,,01/03 +W7VX,DM03TV,,,,,,01/03 +W7XU,EN13LM,,,,,144: 1-5KW,08/03 +W7ZRC,DN13,EME,,,,,01/03 +W8ATH,EN80,EME,,,,,01/03 +W8BYA,EN70JT,EME,,,,144: 2x 17elB2 650W Preamp,02/05 +W8CM,EM13,,,,,50: IC575H 800W 7el - 144: IC275H 800W 4x9el - 432: IC475H 500W 4x18el,01/02 +W8CRZ,EN80TB,,,,,,01/04 +W8DQ,EM79NC,,,,,,01/04 +W8HOM,EN71LA,,,,,,01/03 +W8IDU,EN83,EME,,,,,01/03 +W8ISS,EN82JG,,,KD4DLA,,,10/08 +W8KSE,EM80,,,,,,01/03 +W8LON,EN73JB,EME,,,,144: 2x 17el 400W,08/05 +W8MGJ,EM79,,,,,,01/03 +W8MM,EM79SD,,,,,,01/03 +W8MQW,EN72UR,EME,,,,,01/03 +W8OUD,EM79RJ,,,,,,01/03 +W8PAT,EN81VG,EME,,,,144: 350 watts 2x12 V or H,04/05 +W8SCA,EM79UN,,,,,,01/04 +W8TAH,EN91CD,,,,,,01/03 +W8TL,FM09BM,,,,,50: FT767 1KW 11el - 144: FT736 1KW 17B2,01/01 +W8TN,EM98AL,,,,,,10/07 +W8VHF,EN64,,,,,,01/03 +W8WN,EM77BQ,EME,,,,50: 600W 4el - 144: 1.2KW 4x16el KLM - 432: 10W,04/05 +W9BLI,EN64DP,EME,,,,144: 14db up 40 200 W 432: 17db up 15 100 W,05/06 +W9BN,EM34TT,,,,,,01/03 +W9CGI,EN60WC,,,,,,01/03 +W9DWP,EN52,,,,,,01/03 +W9EQI,EM49,,,,,,01/03 +W9FF,EN40,,, +W9FX,EM57MX,,,,,144: 1KW 17el,07/01 +W9FY,EN52,,,,,,01/03 +W9FZ,EN43,,,,,,01/03 +W9GIR,EN44OG,,,,,,01/03 +W9GKA,EM58CP,,,WB9GKA,,K1FO's at 65 feet 100W on all 4 bands,05/07 +W9GM,EN43JU,,,,,50: 100W 6el - 144: 100W 13el,05/02 +W9HLY,EN70NT,,,,,,01/03 +W9IIX,EN61DR,,,,,,01/03 +W9IP,FN24KO,,,,,,01/03 +W9JMS,EM69,,,,,,01/03 +W9JN,EN54DN,EME,,,,50: 1KW 9el m29khw- 144: 1KW M218XXX,12/07 +W9KFB,EN60,,,,,,01/03 +W9KHH,EN63AH,,,,,,01/03 +W9LT,EN52XG,,,,,,01/04 +W9NHE,EN53XB,EME,,,,144: 17el M2 400W,06/06 +W9NLP,EN52WN,,,,,,01/03 +W9NTP,EM79,,,,,,01/03 +W9NWR,EN55FW,,,,,,01/04 +W9RM,EN52RB,EME,,,,,10/07 +W9RPM,EN43JT,,,,,,05/07 +W9RVG,EM57RN,EME,,,,IC746 IC910H FT736,06/07 +W9SE,EN90LM,,,,,,03/06 +W9VA,EN62,,,,,,01/03 +W9VNE,EM79,,,,,,01/03 +W9XA,EN51UT,EME,,,,144: 8x 13el 600W,10/06 +W9XT,EN53,,,,,,01/98 +W9ZIH,EN51NV,,,,,,01/03 +WA0AUQ,EN41,,,,,,01/03 +WA0BWE,EN34LX,,,,,,01/98 +WA0CQG,EN34,,,,,,01/03 +WA0DXZ,EN41,,,,,,01/97 +WA0ETH,EM38PH,,,,,,01/03 +WA0JDU,EN34,,,,,,01/03 +WA0JMP,EN34,,,,,,01/03 +WA0JYF,EN42,,,,,,01/03 +WA0KBZ,EM48HB,EME,,,,FT857D 144: 400W 17elB2,03/07 +WA0MWW,EN30VX,,,,,,01/04 +WA0NOK,EM28,,,,,,01/03 +WA0QII,CM97,,,,,,01/03 +WA0RDX,EM17,,,,,,01/03 +WA0RJT,EN41,,,,,,01/03 +WA0SJR,EM56,,,,,,01/03 +WA0TAQ,EN61QU,,,,,,01/04 +WA0VSL,DM79OB,,,,,50W,08/04 +WA0WPJ,EM29,,,,,,01/03 +WA0WQI,EM55AA,,,,,,01/03 +WA0WRI,EN10,,,,,,01/03 +WA1FVJ,FN31QS,,,,,144: 13B2 40W,08/04 +WA1HOG,FN42AS,,,,,144: 100W,01/01 +WA1JOF,FN44XV,EME,,,,,01/03 +WA1JXN,DN27UB,,,,,,01/03 +WA1MBA,FN32SL,,,,,,01/03 +WA1MEK,FN42,,,,,,01/03 +WA1MKE,EN70GH,,,,,,01/03 +WA1OFR,FN42MA,,,,,,01/01 +WA1T,FN43LK,EME,,,,144: 15el 500W,06/06 +WA1TMQ,FN31OJ,,,,,,01/03 +WA2ALV,FN33,,,,,,01/03 +WA2FGK,FN21BF,EME,,,,144: 4x 12el 1KW,12/08 +WA2FUZ,FN22XJ,,,,,,01/03 +WA2GFP,FN20,,,,,,01/03 +WA2JGY,DM79,,,,,,01/03 +WA2LSE,FN20,,,,,,01/03 +WA2LTM,FN20,,,,,,01/03 +WA2ODO,EM94NX,EME,,,,144: 4x 12el 300W,11/07 +WA2VOI,EN35JA,,,,,,01/03 +WA2YJF,FN30FR,,,,,,01/03 +WA3BZT,FM29EP,EME,,,,144: Flex-5000A GU78b 1.5KW 4x2MXP20,03/08 +WA3FFC,FN01,EME,,,,,01/03 +WA3KQA,EM98LL,,,,,,01/03 +WA3LTB,EN92TA,EME,,,,144: 100W 17el,04/07 +WA3RQD,FM19QK,,,,,,01/03 +WA3SIX,FN10UB,,,,,,01/03 +WA3TTS,EN90,,, +WA3USG,FN10LL,,,,,,01/03 +WA4ALJ,EM63,,,,,,01/03 +WA4CHA,EL88QA,,,,,,01/03 +WA4CQG,EM72fo,,, +WA4DFS,EM96,,,,,,01/03 +WA4EWA,EM63LL,,,,,,01/03 +WA4EWV,EM70CE,EME,,,,TS2000 144: 2x 17 element Yagi - QRO,10/08 +WA4HEI,EN65UX,,,,,,01/03 +WA4HFN,EM55AB,EME,,,,,08/05 +WA4JQS,EM77TA,,,,,144: 2x33el 2.5WL,08/01 +WA4LBT,EM95,EME,,,,,01/03 +WA4NJP,EM84DG,EME,,,,,03/05 +WA4PCS,EM78,,,,,,01/03 +WA4PGJ,EM55,,,,,,01/03 +WA4PGM,FM07TI,,,,,144. 170W 17el,01/98 +WA4VWR,EM55,,,,,,01/03 +WA4YRK,EM75WV,,,,,IC910 IC756,05/02 +WA4ZTK,EM85,EME,,,,,01/03 +WA5CJG,EM15,,,,,,01/03 +WA5DJJ,DM62PH,,,,,,01/03 +WA5ETV,EM15,EME,,,,,01/03 +WA5ICW,EM26,EME,,,,,01/03 +WA5IYX,EL09,,,,,,01/03 +WA5JAT,EM12ET,,,,,,01/03 +WA5JCI,EM21,,,,,,01/01 +WA5KBH,EM30HL,,,,,,01/03 +WA5NFC,EM45,,,,,,01/03 +WA5TKU,EM13II,,,,,,01/03 +WA5TNY,EM12,,,,,,01/03 +WA5UAJ,EM32,,,,,,01/03 +WA5UFH,EL19,,,,,,09/01 +WA5VKS,EM13PA,,,,,,01/03 +WA5WCP,EM12,,,,,,01/03 +WA5YOU,EM53EE,,,,,,01/03 +WA5YWC,EM13OB,,,,,,01/03 +WA5ZIB,EL29,,,,,,01/03 +WA6BJE,DM13,EME,,,,,01/03 +WA6BYA,CM86,,,,,,01/03 +WA6EIW,EM15DI,,,,,,01/03 +WA6ERB,DM79,,,,,,01/03 +WA6FXL,CM89OB,,,,,144: 9el 100W,09/06 +WA6GXF,DM06DX,,,,,,01/03 +WA6IJZ,DM44KM,,,,,,01/03 +WA6KBL,CM97AG,EME,,,,,01/03 +WA6KOU,DN17,,,,,,01/03 +WA6LHD,CM88XF,,,,,,01/97 +WA6OWM,DM03TU,,,,,50: 100W Loop - 144: 100W 15el,09/01 +WA6PXO,DM13DO,EME,,,,144: 2x 9el 200W,10/06 +WA6PY,DM13LA,EME,,,,144: 2x20el VE7BQH 700W,11/06 +WA6TTY,DM78,,,,,,01/03 +WA6UCT,DM34,,,,,,01/03 +WA6YGB,DM04WA,,,,,,01/03 +WA6ZKY,CM98,EME,,,,,01/03 +WA7ADK,DN31WD,EME,,,,,01/05 +WA7BJU,CN85,,,,,,01/05 +WA7CJO,DM33XL,EME,,,,,01/03 +WA7EPU,DM62,,,,,,01/03 +WA7GSK,DN13SO,EME,,,,144: 1KW 4x16el K1FO,11/06 +WA7HQD,DN31XA,,,,,,01/98 +WA7KHO,DN47,,,,,,01/03 +WA7SKT,CN86CX,EME,,,,,11/05 +WA7TZY,CN87,EME,,,,,12/00 +WA8CLT,EN80LA,EME,,,,144: 1500W 4x9M2,03/05 +WA8CXI,EM99WK,EME,,PSE QSL direct,,FT847 - 144: 2x 18el CC with max 68deg elevation 8877ampl with 1500W,04/06 +WA8EUU,EN82,,,,,,01/03 +WA8MIL,EN63,,,,,,01/03 +WA8NLC,EM73,,,,,,01/03 +WA8OGS,EM79,,,,,,01/03 +WA8RJF,EN91IQ,EME,,,,144: 17el 250W,03/05 +WA8VPD,EN82,EME,,,,,01/03 +WA8WZG,EN81OM,EME,,,,,01/01 +WA8YTB,EN72JH,,,,,,01/03 +WA9BTT,EN40,,,,,,01/03 +WA9BVS,EM69WV,,,,,,01/03 +WA9ENA,EN42,,,,,,01/03 +WA9FWD,EN53,EME,,,,,01/03 +WA9HCZ,EN43JV,,,,,,01/03 +WA9HIR,EN61CU,,,,,,01/03 +WA9HUV,EN51,,,,,,01/03 +WA9JML,EN51PW,,,,,,01/01 +WA9NBU,DM14JG,,,,,FT736R - Mirage 160W,05/07 +WA9NRB,EM48,,,,,,01/03 +WA9O,EN62BX,,,,,,01/03 +WA9OUU,EM89,EME,,,,,01/03 +WA9PAM,EN44,,,,,,01/03 +WA9PSI,EN51,,,,,,01/03 +WA9PZL,EM32DN,,,,,,01/03 +WB0CLL,EM28,,,,,,01/03 +WB0CQO,EN31,,,,,,01/03 +WB0DBS,EM17,,,,,,01/03 +WB0DGF,EN10PT,,,,,,01/03 +WB0DRL,EM18CT,EME,,,,,01/03 +WB0GAZ,DM79,,,,,,01/03 +WB0GGM,EN34,EME,,,,,01/03 +WB0HXY,EN10,,,,,,01/03 +WB0ITA,EM29,,,,,,01/03 +WB0IUT,EN10,,,,,,01/03 +WB0LJC,EN34JV,,,,,,01/03 +WB0MLL,EN35,,,,,,01/03 +WB0NCR,EN42,,,,,,01/03 +WB0OOL,EM48,,,,,,01/03 +WB0QGH,EM84,,,,,,01/03 +WB0QIY,EN10,,,,,,01/03 +WB0QQS,EN10,,,,,,01/03 +WB0SIP,EN10,,,,,,01/03 +WB0TEM,EN12RT,EME,,,,,10/05 +WB0VGI,EN34LL,,,,,,01/03 +WB0YFL,EN42,,,,,,01/03 +WB0YRQ,EN12,,,,,,01/03 +WB0ZJP,EM48,,,,,,01/03 +WB1FLD,FN42IW,,,,,,01/02 +WB1GQR,FN33KL,,,,,,01/04 +WB2BYP,FN13FF,EME,,,,144: 4x 9el 8877,07/05 +WB2LSP,FM29DP,,,,,,01/03 +WB2OYC,FM29NN,,,,,,01/03 +WB2QLP,EL96DE,,,,,50: 400W- 144: 400W- 432: 170W,01/01 +WB2RVX,FM29MT,EME,,,,144: 4XP20 700w 432: 28el kW,10/08 +WB2SEB,FN31DD,,,,,144: 175W 13el - 222: 100W 10el,03/02 +WB2SIH,FN31DD,EME,,,,144: 13B2 800W FT736R SSB-preamp,09/06 +WB2SZR,FN20LL,,,,,144: 100W 16el,01/07 +WB2VVV,FN21,EME,,,,,01/00 +WB4AXQ,EM64,,,,,,01/03 +WB4BKC,EL96,EME,,,,,01/03 +WB4ECR,EM66QF,,,,,,01/04 +WB4EFZ,EM94,,,,,,01/03 +WB4GTB,EM73VW,,,,,,01/03 +WB4JEM,EL89QU,,,,,50: 6elQuad 500W - 144: 16x10el preamp 1-5KW - 222: 17el 160W - 432: 24el 500W,01/01 +WB4KMH,EM75RV,,,,,,01/01 +WB4LHD,EM55DB,EME,,,,,02/05 +WB4NFS,FM18HP,,,,,144: 400W,01/97 +WB5AFY,EM04ID,EME,,,,,02/05 +WB5APD,EM84AK,,,,,144: 1.5kw 17 el,01/01 +WB5DSH,EM15,,,,,,01/03 +WB5IPM,EM12,,,,,,01/03 +WB5KDC,EM15,,,,,,01/03 +WB5KYK,EM51JQ,,,,,,01/03 +WB5LBT,EM40LK,EME,,= W5LBT,,,01/01 +WB5NIF,EM42AM,,,,,,01/03 +WB5R,DM93PB,,,,,,01/09 +WB5ROR,EM23,,,,,,01/03 +WB5TBL,EM12,,,,,,01/03 +WB5TCO,EN64,,,,,,01/03 +WB5VPC,EM12,,,,,,01/03 +WB6WLR,DM13AT,,,,,144: 8877 2x17B2 - 432: 8938 2xFO33,01/01 +WB7OSE,CN87XT,,,,,,01/03 +WB7UNU,CN85OJ,EME,,,,144: 170W 17el,11/05 +WB8AGV,EN34,,,,,,01/03 +WB8IFM,EM79WS,,,,,,01/03 +WB8NUT,EM79UB,,,,,,01/03 +WB8SKP,EN66UC,,,,,,01/04 +WB8TFV,FM19AL,,,,,,01/03 +WB8TGY,EN72PP,EME,,,,144: 13B2 antenna,03/05 +WB8WTB,EN72,,,,,,01/03 +WB8XX,EM79,,,,,,12/00 +WB9BWP,EN52,,,,,,01/03 +WB9F,EM57QQ,,,,,ICOM 756 PRP III,10/05 +WB9HLM,EN52IW,,,,,,01/03 +WB9IHS,EM69,,,,,,01/03 +WB9IIV,EM69ST,EME,,,,144: 11el 150W,02/06 +WB9OGM,EN61,,,,,,01/03 +WB9OQB,EN44WP,,,,,FT 817,05/08 +WB9OWN,EN52,,,,,,01/03 +WB9PNU,EM48TN,EME,,,,144: Antenna: 4x M2 2M9 Icom 756Pro DEMI Transverter Lunar Link LA22,09/07 +WB9SNR,EN62AC,,,,,,01/03 +WB9SPT,EN71AS,,,,,,01/03 +WB9USX,EM79,,,,,,01/03 +WB9UWA,EN50KK,EME,,,,144: 4x UWA12's 18.5 dbd low temperature MC2K 2x GU74B's MGF1302,10/00 +WB9ZAI,EN61GM,,,,,,01/03 +WC4N,EM86,,, +WC9C,EM69HH,,,,,,01/03 +WD0AAD,DM79,,,,,,01/03 +WD0ALN,EM32,,,,,,01/03 +WD0APF,EN10,,,,,,01/03 +WD0BQM,DN81CW,,,,,,01/03 +WD0CJM,EN25FH,,,,,,01/03 +WD0EDO,EN10TL,,,,,,01/03 +WD0FCH,EM48,,,,,,01/03 +WD0GML,EM48,,,,,,01/03 +WD0HOJ,EN41,,,,,,01/03 +WD0L,EM17IH,,,,,,01/03 +WD0M,DM67KG,,,,,,01/04 +WD4ECK,CN82,,,,,,01/03 +WD4FAB,EL98HP,,,,,,01/03 +WD4KPD,FM15MM,,,,,,05/02 +WD4MUO,DM79GX,,,,,,01/03 +WD4OZN,EM55LK,,,,,,01/03 +WD5AGO,EM26BD,EME,,,,,03/00 +WD5CAN,EM36,,,,,,01/03 +WD5CAP,EM36,,,,,,01/03 +WD5DJT,EM12OO,,,,,,01/03 +WD5EAE,EM22KQ,EME,,,,FT-847,11/07 +WD5EWD,EM22,,,,,,01/03 +WD5G,EM05,,,,,,01/03 +WD6BXE,DM22,,,,,,01/03 +WD6DBM,CM97AI,EME,,,,144: 2x 17el 500W,10/06 +WD8BYA,FM18IP,,,,,,01/03 +WD8SDL,EM79,,,,,,01/03 +WD9BGA,EN53BA,,,,,,01/03 +WD9EGE,EN64,,,,,,01/03 +WD9EXD,EN61,,,,,,01/03 +WD9FBL,EN61BV,,,,,,01/03 +WD9IIX,EN61,,,,,,01/03 +WE2Y,FN02SR,EME,,,,,01/03 +WE4K,EM77BQ,,,,,,01/03 +WE7L,DM41,,,,,,01/03 +WE7P,DN13RP,EME,,,,,01/03 +WE9D,EN52,,,,,,01/03 +WE9V,EN52XN,,,,,,07/08 +WE9Y,EN82EW,EME,,,,IC910H LA22 AM6155 144: 2x 18el 1500W,04/07 +WF1F,FN42,,,,,,01/03 +WF1R,FN32,,,,,,01/03 +WF4R,FM16TS,,,,,,01/03 +WF9M,EM79,,,,,,01/03 +WH6LR,EM04LL,,,,,,01/03 +WI7P,DN40ER,EME,,,,144: 2x 11el 1000W,11/06 +WJ6T,DM05HL,EME,,,,144: 4x 9el 500W and new 7/8,04/07 +WK9E,EN53,,,,,,01/03 +WL7M,BO49IR,,,,,,01/03 +WL7U,BP51,EME,,,,50: 150W 5el - 144: 300W 2x10el - 432: 900W- 6x20el,01/98 +WM2Z,FN31SA,,,,,IC-746PRO TS-850SAT,10/07 +WM5Y,EN31,,,,,,01/03 +WN3CDW,FN11XB,EME,,,,50 MHZ: 1200 Watts 5 Element M2 6M5X Yagi,08/08 +WN4BML,EL89LL,,,,,,01/03 +WN4KKN,EM10,,,,,,01/03 +WN4M,EM66,,,,,100W,01/04 +WO9S,EN61ET,EME,,,,144: 13el 140W,10/06 +WP4G,FK68VG,EME,,,,144: 1KW 2x2MX28P,08/05 +WP4O,FK68,,,,,144: FT736r 400W 18ft langyagi preamp,01/01 +WQ0P,EM19VF,,,,,,09/01 +WQ5S,EM13RC,EME,,EX KA5UIQ KF5FQ,,144: FT847 4x2M12el 1500 432: 1x31 50W,04/07 +WQ5W,EM12FW,EME,,,,TS2000,09/06 +WR0F,EM29TC,,,,,,01/03 +WR0I,EM17,,,,,,01/03 +WR6S,DM14CP,,,,,,01/03 +WR9W,EM68FA,,,,,,01/03 +WS5R,DM95,,,,,,01/03 +WT0W,EN34,,,,,,01/03 +WU8Y,EN82JW,,,KC8DQH,,,07/07 +WV0K,EN13,,,,,,01/03 +WV1K,FN41WR,,,,,,01/05 +WV2C,FN30,,,,,144: IC706 180W 15el,01/98 +WW2R,EM13QD,EME,,,,,04/06 +WW4T,EM83,,,,,,01/03 +WW8M,EN72XF,EME,,,,144: 4x 18 M2XXX 1KW,03/07 +WX9M,EN54FL,,,,,,01/03 +WY0C,EM17IT,,,,,,01/03 +WY0V,EN12,,,,,,01/98 +WY3G,EM55,,,,,,01/03 +WY5R,DM95BE,,,,,TS2000,06/08 +WZ1V,FN31MP,,,,,50: 600W 5el - 144: 1kw 17el - 222: 500W 15el - 432: 500W 24el,05/07 +WZ8D,EM89BI,,,ex WB8IGY,,50: 1.5KW 6el - 144: 1.5KW 2x 17el,03/06 +WZ9D,EN51,,,,,,01/03 +XE1AVM,DK79UA,,,,,,01/03 +XE1GE,EK08,,,,,,01/03 +XE1GRR,DL80IP,EME,,,,50: 4x 6 el - 144: FT736 2x 17el H+V 250W - 432: 4x 33el H+V,09/06 +XE1XA,EK09,EME,,,,,01/03 +XE2AT,DL81UU,EME,,ex XE2YVW,,144: IC820 400W 4x 9el,01/07 +XE2NS,EL05AG,EME,,,,144: 2x 17el 160W,11/08 +XE2OR,DL98OK,,,,,144: 13B2 160W,08/05 +XF4DL,DK48MS,EME,,SpecialCall,,144: 2x 11el 350W,10/06 +YB0US,OI33JU,,,,,,01/03 +YL1A,KO07UN,,,Expedition,,,05/03 +YL27HF,KO27VC,,,SPECIALCALL,,,09/07 +YL2AO,KO16DK,,,,,,08/07 +YL2GJW,KO06MM,,,AS WELL KO06RM,,TS2000x TE-1452g(400W) 2xEF208 (vert stack) 9el Yagi for additional rx,12/08 +YL2GUI,KO06MM,,,,,144: TS-570+FTV-250 9el 30W,03/04 +YL2HA,KO26BV,EME,,,,144: 4x 16el 400W,08/08 +YL2IV,KO06MM,,,UQ2IV,,FT-817D 144: 7el QYAGI 432: 11el QYAGI,04/08 +YL2KA,KO26AX,,,,,,03/02 +YL2LW,KO26CW,,,,,,07/05 +YL2OK,KO37AS,,,,,,11/04 +YL2OW,KO26WL,,,ex UQ2OW,,FT736R IC706MKIIG,01/05 +YL3DW,KO26CW,,,,,,11/02 +YL3GCT,KO26BW,EME,,,,432: 8x9el DK7ZB 180W,11/05 +YL3GDF,KO26XM,EME,,,,144: 8x 13el 1KW,03/07 +YL3GDJ,KO26AX,,,,,,01/05 +YL3GDR,KO26HT,EME,,,,,03/07 +YL3HA,KO26DW,,,,,,12/07 +YL90HA,KO26BV,EME,,SPECIALCALL,,,10/08 +YM3XC,KN30FC,,,Expedition,,,11/02 +YO0IS,KN05PS,,,SpecialCall,,,01/93 +YO2AMU,KN06OC,EME,,,,144: 4x16el MGF1302 1KW 432: 4x 21el 1KW,08/05 +YO2BBT,KN05WG,,,,,144: FT897 300W 10el,12/08 +YO2IS,KN05PS,EME,,,,144: 4CX250B 10el BF981 - 432: 4X150D 17el 3SK97,01/06 +YO2KQT,KN05PS,,,,,FT-847 50W 1xF9FT 3WL,09/07 +YO2LEA,KN06WK,,,,,144: IC-211 lin.Mirage B 215G - 6m and 70 cm transverters,03/01 +YO2NAA,KN05OS,,,YO5QCF,,FT-847 8EL Yagi,05/08 +YO3DMU,KN34BJ,EME,,,,144: TS870 +Trsv 1KW MGF1302 16el,03/07 +YO3FFF,KN34CJ,EME,,,,144: TS450 Trvtr 100W B-310G GaAs Preamp 16el Tonna,04/05 +YO3IZI,KN34BK,EME,,,,TS2000,01/04 +YO3JW,KN34CK,,,,,144: 400W 16el F9FT 3P602A-2,04/00 +YO3KWJ,KN24,,,Expedition,,,01/93 +YO4AUL,KN44HE,EME,,,,144: FT897 200W 1x16el 10m boom,04/07 +YO4BZC,KN45AK,,,,,IC 706 5 el delta loop HM PA 70W,07/05 +YO4FEI,KN45NB,,,,,144: 50W 9el,11/06 +YO4FNG,KN44HD,EME,,,,144:FT847/MGF1302/12 el. DK7ZB/GS35 432:16 el. DL6WU/50W 1296: DB6NT/20W 15 el. DL6WU,05/08 +YO4FYQ,KN44HE,EME,,,,FT-847 50: 100W 5el 7ZB - 70: 25W 5el 7ZB - 144: 10el 7ZB 700W - 432: 50W 13el,05/06 +YO4GJH,KN35XG,,,,,FT 847 MIRAGE B2518G 2xGI7b DK7ZB 14 el.,10/07 +YO4KRB,KN44HE,EME,,,,144: 400 W 10 el 7ZB FT 847 MGF 1302,01/06 +YO4RFV,KN45AK,,,,,,08/02 +YO4RXX,KN45AK,,,,,,07/03 +YO5AVN,KN34,,,,,,01/93 +YO5BIM,KN07XB,,,,,,05/04 +YO5BIN,KN17WW,EME,,,,HM Transverter + TS 140 800W 4x 9el F9FT MGF1302,05/07 +YO5BWD,KN27GD,,,,,,08/00 +YO5CFI,KN16WJ,,,,,FT857D HF PSK: 40W 50 MHz: 100W dipole 144 MHz: 150W 2x9el TONNA,06/09 +YO5CXI,KN16WJ,,,,,144: 50W 2x 9el,10/06 +YO5DJM,KN17,EME,,,,,01/93 +YO5KAI,KN16TE,EME,,,,,06/99 +YO5KAV,KN16TS,EME,,,,,06/99 +YO5KUW,KN17UL,,,Expedition,,,08/06 +YO5OCZ,KN17UL,,,,,TS 2000 X TS 700 S TS 820 + TV 502 QRO GI7B,03/09 +YO5OHY,KN17SP,,,,,,12/06 +YO5TE,KN16TS,EME,,,,144: 1KW 4x10el MGF1302,01/02 +YO5TP,KN16SS,,,,,144: 40W 16el,05/06 +YO7CGS,KN15OA,,,,,,08/97 +YO7CKQ,KN15OA,,,,,,05/01 +YO7HLI,KN25EC,,,,,,08/08 +YO7IV,KN24MT,,,,,144: TS850 + Tcvr 2x4CX250b 800W 15el 9BV,05/03 +YO7NE,KN25EC,EME,,,,FT857 144: 100W 2x17el F9FT,01/08 +YO7VS,KN14VH,,,,,50: 2XQB3/300 2xBF981 5el LY J-Pol crossdipole - 144: 2x4CX250b CF300 Swan/Swan,10/98 +YO7VT,KN25EC,EME,,,,,12/08 +YO8BCF,KN36KN,EME,,,,TS2000X 4x 10el 1KW,04/07 +YO8BSE,KN36EW,,,,,,10/95 +YO8CLN,KN27QG,,,,,,08/08 +YO8CYN,KN36LW,,,,,,08/01 +YO8RHI,KN37TE,,,,,,07/05 +YO8RTS,KN27SM,,,,,144:FT847 11 el f9ft 150 W RF Concepts,01/07 +YO8TNA,KN37EW,,,,,,05/08 +YO8TNB,KN37EW,,,,,,06/09 +YO9FRJ,KN34AW,EME,,EX YO4FRJ,,144: 2 x3CPX800 + 4x17B2 + MGF1801 - 432: 50W 18el. Yagi CPol - SAT - 1296: 4 x 67el + FT736,03/08 +YO9HP,KN35BA,EME,,,,,09/07 +YP0A,KN27GD,,,Expedition,,,01/92 +YP2U,KN05OS,,,,,,05/08 +YR0A,KN16TS,EME,,Expedition,,,06/99 +YR5A,KN16TS,EME,,Expedition,,,06/99 +YR99E,KN34,,,Expedition,,,08/99 +YT1VP,JN94XC,,,,,TS440 FT225,08/08 +YT1VV,JN94US,,,ex YU1VG,,,07/00 +YT1W,JN91,,,Expedition,,,01/90 +YT2ACA,KN03WE,,,,,FT-221r,05/08 +YT3I,KN05HP,EME,,EX YU7EW,,144: 500Watt 4x 9el MGF1302,01/09 +YT4D,JN94CP,,,,,144: 250W 11el,08/00 +YT6A,JN92,,,,,,08/06 +YT7AC,JN95,,,,,,03/97 +YT7C,KN05FJ,,,YU7AAA 4O9T,,144: GS35B 4x10+2x10 el BVO 3WL,11/08 +YT7G,JN94XC,,,= YU7GOL,,144: MGF1302 GS35B 4x10el + 2x10el BVO-3wl,07/06 +YT7W,KN05QD,,,,,,08/08 +YT7WA,KN05EJ,,,SpecialCall,,144: 1KW 4x4el Loop 11el WU MGF1302,12/01 +YU0TESLA,KN03QM,EME,,SpecialCall,,144: 16 x 7el Yagi (by Dual) full elevation 25dBi 1.5Kw MGF1302,04/06 +YU150CF,KN03QM,EME,,SpecialCall,,144: 16 x 7el Yagi (by Dual) full elevation 25dBi 1.5Kw MGF1302,04/06 +YU150FU,KN05DK,,,SPECIALCALL,,,07/06 +YU1ADN,KN03KN,,,,,,06/96 +YU1AFS,KN04FT,,,,,,01/92 +YU1AGP,KN03WE,,,,,FT-221R,07/07 +YU1AZK,KN04,,,,,144: 25W 2x11el,10/98 +YU1BT,KN03KN,,,,,,07/06 +YU1BW,KN04GT,,,,,,04/02 +YU1CF,KN03QM,EME,,ex YU1OYA,,IC746PRO 50: 4x 6el Yagi 1KW preamp 144: 1500W 16x 7el Yagi MGF1302,11/06 +YU1EU,KN04DW,,,,,,08/98 +YU1EV,KN04CN,,,,,,04/06 +YU1EXY,KN04FT,,,,,144: FT225rd 350W 16el F9FT MGF1302,01/02 +YU1HFG,KN02XX,,,,,,12/95 +YU1IO,KN04IQ,,,,,144: 600W 4x17el,11/97 +YU1JB,KN04GT,EME,,EX YU1PTB,,144: 4x 10el 500W,12/07 +YU1L,KN02XX,,,,,,12/95 +YU1LA,KN04FR,,,,,144: IC910 17B2 LY,10/05 +YU1MS,KN04ET,,,,,,11/07 +YU1OO,KN02XX,,,,,,01/93 +YU1OS,KN04FS,,,,,144: FT225rd 100W 2x9el MGF1302,11/99 +YU1S,JN94US,,,,,144: 17el 400W,11/97 +YU1WP,JN94OM,,,,,,07/96 +YU1ZF,KN03IR,,,,,,01/91 +YU3LT,KN05HP,EME,,YZ7RLT YT7RLT,,YAESU FT225RD,01/08 +YU4AR,JN94AS,,,= 4O4AR,,144: TR9130 250W 10el PA0MS-ant Preamp,11/02 +YU6AO,JN92,,,,,,08/06 +YU7AA,JN95NS,EME,,ex YU1NOK,,TS850 - 144: 4x 10el 7ZB 500W - 432: 2x 2x 22el,04/06 +YU7AAA,KN05FJ,,,YT7C 4O9T,,144: GS35B 4x10+2x10 el BVO 3WL,11/08 +YU7ACO,KN05QC,,,,,144: FT221r PA 200W 2x 10el. DJ9BV,08/00 +YU7AJH,JN95WF,,,,,,01/90 +YU7AR,KN05BW,,,ex YU7PXB,,IC745- FT225RD- 144: 4x5wl MGF1412 YL1056,12/01 +YU7AS,KN05DJ,,,,,144: 150W 8x 6el Loop,08/05 +YU7AU,KN04HV,,,,,144: 250W 2x11el,12/01 +YU7AZX,KN04AX,,,,,,08/03 +YU7BCL,KN05FW,,,,,,12/97 +YU7BCX,KN05HP,,,,,,08/96 +YU7CV,JN95WK,,,,,,01/95 +YU7EF,KN04HV,EME,,EX YU7PFR,,FT847,01/09 +YU7FF,KN05EP,,,,,,01/94 +YU7FU,KN04,,,EX YU7MJA,,,05/07 +YU7GOL,JN94XC,,,= YT7G,,144: MGF1302 GS35B 4x10el + 2x10el BVO-3wl,03/06 +YU7KB,JN94XX,,,,,144: IC202 2x11el 800W Preamp (MGF1302),02/04 +YU7MS,KN05EF,,,,,144: 400/1KW 2x11el WU MGF1302,11/08 +YU7ON,KN04AX,,,,,144. TR751 4x11el 25W,08/00 +YU7PAA,KN04AX,,,ex YZ7MON,,MGF1302 GS35B 11el Yagi,12/07 +YU7PS,KN05FJ,,,,,144: 400/1KW 2x11el WU MGF1302,11/08 +YU7VA,KN05EJ,,,,,144: 100Watt 11el BFT 66,05/00 +YU7XL,JN95NT,EME,,YU2JL YU2RTU,,FT897 50: 100W 8el yagi 144: 1000Watt 16x8 yagi my design MGF1802,10/08 +YV5KXE,FK60NM,EME,,,,144: 11el Yagi 150W,06/06 +YV5LIX,FK60NM,EME,,,,IC-275H FT-100D TS-600 200W 18db Antenna,04/05 +YV5ZZ,FK60SM,EME,,,,,01/05 +YZ1DO,KN04ER,,,,,,08/99 +YZ1KU,KN04EU,,,,,144: 10W 9el F9FT,05/03 +YZ7UN,KN05EI,,,,,144: 4x6el Loop 100W,01/01 +Z30B,KN01PA,EME,,,,144: 1-5KW 4xYU0B (17-5db) MGF1302,08/00 +Z31DX,KN11GD,,,ex YT5G,,,06/99 +Z35Z,KN11CR,EME,,EXZ32UC YU5UC - QSLS VIA DL8EBW,,144: IC202 500W 4x4el Loop MGF1302 432: 15W 1296: 10W,11/07 +Z37CEF,KN01QA,,,ex YU5CEF,,,11/99 +Z38C,KN01QX,,,EX HA1CA,,FT847,10/07 +Z38R,KN12AG,,,,,FT847,10/07 +ZA0DXC,KN01,,,Expedition,,,01/91 +ZB0W,IM76HE,,,Expedition,,,01/93 +ZD8B,II22TB,EME,,= W1MRQ,,144: 4x 5el 180W,11/08 +ZK1EME,BG08CT,EME,,EXPEDITION,,144: 2x 3.2wl X-Pol yagis 8877 1.5KW,01/08 +ZL1BT,RF73LC,EME,,,,144: 12el 400W,03/06 +ZL1IU,RF64VR,EME,,,,144: 4x12el 1.2KW,10/05 +ZL1PE,RF74DG,,,,,,01/03 +ZL1RS,RF64VS,EME,,,,,09/08 +ZL1WN,RF73HG,EME,,,,144: 4x 18el 400W,06/06 +ZL2DX,RE78RR,EME,,ZL4OY ZL4OY/A ZL4OY/C ZL7OY ZM8OY ZL8OY,,144: 4x 10el 500W full elevation - 432: 18el 100W,04/07 +ZL3AAD,RE66GR,EME,,,,,01/03 +ZL3AAU,RE66EL,EME,,,,,06/07 +ZL3CU,RE66GL,EME,,,,144: 250W 2 by 12 element,03/07 +ZL3NW,RE66HO,EME,,,,,03/05 +ZL3TY,RE57OM,EME,,,,,05/05 +ZP4KFX,GG15LV,,,,,,03/01 +ZR1ADI,JF95KU,,,,,,01/02 +ZR1AEE,JF96IA,,,,,,01/02 +ZR1EV,JF96IC,,,,,50: FT690r 200W 4el,11/96 +ZR1L,JF96HD,,,,,,10/02 +ZR1TRD,JF96HC,,,,,,01/02 +ZR1WZ,KF05QP,,,,,,01/04 +ZR2DX,KF26,,,,,,02/02 +ZR5ADQ,KG50IA,,,,,,01/02 +ZR6ABU,KG33XV,,,,,,01/03 +ZR6CRW,KG33,,,ex ZR6ABU,,,10/02 +ZR6DXB,KG33XX,,,,,,10/02 +ZR6GE,KG43AR,,,,,,10/02 +ZR6KHJ,KG43CU,,,,,,02/02 +ZS1EK,JF95FU,,,,,,01/02 +ZS1LS,JF96FD,EME,,,,IC-910H,05/09 +ZS2ACP,KF26SA,EME,,,,144: 2x 8el 150W,12/07 +ZS2BWB,KF26TD,,,,,,02/02 +ZS2GK,KF47KT,EME,,S83X,,Icom IC-746Pro Yaesu FT-847,03/09 +ZS4JJ,KG30FV,EME,,,,Kenwood TR900 144: 16el 60W,10/08 +ZS4KB,KG32,,,,,,10/02 +ZS4NS,KG32IA,,,,,50: IC551D 6el 80W - QSL via N7RO,02/01 +ZS4TX,KG30BW,,,,,,01/02 +ZS5AV,KF69GX,,,,,,01/03 +ZS5DJ,KG59AA,,,,,,01/02 +ZS5LEE,KG50JF,EME,,,,IC821 706MKIIG 144: 4x 2m18XXX QRO 432: 2x 27el 100W,04/05 +ZS5Y,KF59JR,EME,,,,1296: 3.7m dish 50W,08/05 +ZS6AVP,KG44OD,,,,,,05/02 +ZS6AXT,KG33VV,EME,,,,,03/05 +ZS6BTE,KG33XV,EME,,,,144: 2x 4wl Yagis 100W,08/05 +ZS6BUN,KG43CU,EME,,,,144: 12el 300W,06/06 +ZS6DTS,KG43AR,,,,,,10/02 +ZS6EGB,KG43BQ,,,,,,10/02 +ZS6GER,KG33,,,,,,02/02 +ZS6GPM,KG33XU,,,,,,10/02 +ZS6HS,KG33XR,,,,,,01/02 +ZS6JDE,KG44DG,EME,,,,144: 2x 9el 400W,08/06 +ZS6JON,KG33VV,,,,,,10/02 +ZS6JR,KG44,EME,,,,,07/05 +ZS6MRK,KG34XH,EME,,,,144: 400W 2M7,03/06 +ZS6NK,KG46RC,EME,,ex ZS6PJS,,144: 2x 13wl 120W,09/05 +ZS6OB,KG44DE,EME,,,,144: 4x 16el 300W,01/07 +ZS6RAD,KG44CA,,,,,,10/02 +ZS6UT,KG44EF,,,,,,01/02 +ZS6WAB,KG46RC,EME,,,,144: 8x 17el 350W,09/06 +ZS6WB,KG44DH,EME,,,,144: 2x9 el 350W,11/06 +ZS6WI,KG46RC,,,,,,01/03 +ZS6Y,KG33WU,,,,,,02/02 +ZZZZZZ,End-Of-Call3-Database 2009-07-01 01:15:53 UTC VHF-DATABASE Export � 2009 by DG2KBC & DL8EBW + + + + + + + + + diff --git a/q65w/resources/README.qthid.txt b/q65w/resources/README.qthid.txt new file mode 100644 index 000000000..4210d0625 --- /dev/null +++ b/q65w/resources/README.qthid.txt @@ -0,0 +1,22 @@ +QTHID INFORMATION + +Qthid is simple cross platform controller application for the Funcube Dongle +Pro and Pro+ software defined radio receivers. + +Author........: OZ9AEC +License.......: GNU General Public License +Site..........: http://www.oz9aec.net/index.php/funcube-dongle/qthid-fcd-controller +Source........: http://sourceforge.net/projects/qthid/files +Yahoo Group ..: https://uk.groups.yahoo.com/neo/groups/FCDevelopment/info + +The qthid folder contains two binaries: + +* qthid-4.0.exe +* qthid-4.1.exe + +QTHID 4.0 is the current stable providing full support for the Funcube Dongle +API available with firmware 18f or later. + +QTHID 4.1 is an updated version that supports the new Funcube Dongle Pro+ +devices. This does not work with the original Funcube Dongle Pro! + diff --git a/q65w/resources/qt.conf b/q65w/resources/qt.conf new file mode 100644 index 000000000..e69f24eba --- /dev/null +++ b/q65w/resources/qt.conf @@ -0,0 +1,2 @@ +[Paths] +Plugins = . diff --git a/q65w/resources/qthid/AUTHORS.qthid.4.1.txt b/q65w/resources/qthid/AUTHORS.qthid.4.1.txt new file mode 100644 index 000000000..e3f10328c --- /dev/null +++ b/q65w/resources/qthid/AUTHORS.qthid.4.1.txt @@ -0,0 +1,16 @@ +Original work by Howard Long, G6LVB. +Current maintainer: Alexandru Csete, OZ9AEC. + +Contributors: +- Mike Willis G0MJW and David Barber +- Mario Lorenz DL5MLO +- Andrew Elwell +- Mike K0ZAP (OSX Lion fix) + +The frequency controller was taken from Cutesdr by Moe Wheatley. + +Application icon by ~DarKobra at Deviantart. +Source: http://commons.wikimedia.org/wiki/File:Radio.svg + +Other icons were taken from the GNOME desktop theme and the Tango theme. + diff --git a/q65w/resources/qthid/AUTHORS.qthid4.0.txt b/q65w/resources/qthid/AUTHORS.qthid4.0.txt new file mode 100644 index 000000000..e3f10328c --- /dev/null +++ b/q65w/resources/qthid/AUTHORS.qthid4.0.txt @@ -0,0 +1,16 @@ +Original work by Howard Long, G6LVB. +Current maintainer: Alexandru Csete, OZ9AEC. + +Contributors: +- Mike Willis G0MJW and David Barber +- Mario Lorenz DL5MLO +- Andrew Elwell +- Mike K0ZAP (OSX Lion fix) + +The frequency controller was taken from Cutesdr by Moe Wheatley. + +Application icon by ~DarKobra at Deviantart. +Source: http://commons.wikimedia.org/wiki/File:Radio.svg + +Other icons were taken from the GNOME desktop theme and the Tango theme. + diff --git a/q65w/resources/qthid/LICENSE.txt b/q65w/resources/qthid/LICENSE.txt new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/q65w/resources/qthid/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/q65w/resources/qthid/NEWS.qhid-4.0.txt b/q65w/resources/qthid/NEWS.qhid-4.0.txt new file mode 100644 index 000000000..a4637e8e3 --- /dev/null +++ b/q65w/resources/qthid/NEWS.qhid-4.0.txt @@ -0,0 +1,64 @@ +Changes in version 4.0: + +- New layout with IF, IQ and firmware controls hidden by default. +- New frequency controller widget. +- Support for up- and downconverters + + +Changes in version 3.2: + +- Switch to using hidraw driver on Linux 2.6.38 or later (fixes crashes + experienced on recent Linux with libusb-1.0.9). +- Update HID API. +- Reduce widow width. + + +Changes in version 3.1: + +- Support for Mac OS X 10.7 Lion +- Support for Bias-T with firmware 18h and later. +- Allow user to force band selection to be different from the one chosen + by the FCD (temporary workaround for a FW 18f bug occurring at 861 MHz). +- Change default value of IQ gain correction from 0.0 to 1.0. +- Use correct FCD command for setting IQ phase correction (GH-5). +- Various fixes for windows build using latest SDK (7.0). +- Removed RSSI indicator since it is unlikely that it will ever work. + + +Changes in version 3.0: + +- Implement full API in firmware 18f (thanks Mario Lorenz, DL5MLO). +- Requires firmware 18f or later (earlier firmwares are not detected). +- Added auto-repeat to tuning buttons (click and hold the button to scan). +- Added new RF chain diagram. +- Show firmware version in status message. + + +Changes in version 2.3: + +- No code changes, just a Mac OS X build. + + +Changes in version 2.2: + +- Use native toolbar and status bar on Mac OS X +- New application icon based on SVG drawing +- Correctly set application and bundle icon on Mac OS X and Windows +- Minor UI tweaks. +- Fix qthid.pro to allow correct build on Ubuntu 9.04 (thanks EA4FVS). +- Correct application name in file headers (thanks Andrew Elwell) + + +Changes in version 2.1: + +- Various fixes and workarounds to prevent crash and freeze when switching + between application and bootloader mode. The application can now run with or + without FCD (hotplug). Upgrade and verify firmware have been tested on Linux + (32 and 64 bit) and OSX 10.6. +- Updated HID API to hidapi/master from 2011-02-17 +- Retrieve libusb configuration on Linux using pkg-config +- Remove local Qt Creator configuration from distribution +- Improvements to the UI layout and widgets +- Added application icon +- Applied GPL V3 license + diff --git a/q65w/resources/qthid/NEWS.qthid-4.1.txt b/q65w/resources/qthid/NEWS.qthid-4.1.txt new file mode 100644 index 000000000..426dff77b --- /dev/null +++ b/q65w/resources/qthid/NEWS.qthid-4.1.txt @@ -0,0 +1,64 @@ +Changes in version 4.1: + +- Special release with Funcube Dongle Pro+ support. + + +Changes in version 4.0: + +- New layout with IF, IQ and firmware controls hidden by default. +- New frequency controller widget. +- Support for up- and downconverters. + + +Changes in version 3.2: + +- Switch to using hidraw driver on Linux 2.6.38 or later (fixes crashes + experienced on recent Linux with libusb-1.0.9). +- Update HID API. +- Reduce widow width. + + +Changes in version 3.1: + +- Support for Mac OS X 10.7 Lion. +- Support for Bias-T with firmware 18h and later. +- Allow user to force band selection to be different from the one chosen by + the FCD (temporary workaround for a FW 18f bug occurring at 861 MHz). +- Change default value of IQ gain correction from 0.0 to 1.0. +- Use correct FCD command for setting IQ phase correction (GH-5). +- Various fixes for windows build using latest SDK (7.0). +- Removed RSSI indicator since it is unlikely that it will ever work. + + +Changes in version 3.0: + +- Implement full API in firmware 18f (thanks Mario Lorenz, DL5MLO). +- Requires firmware 18f or later (earlier firmwares are not detected). +- Added auto-repeat to tuning buttons (click and hold the button to scan). +- Added new RF chain diagram. +- Show firmware version in status message. + + +Changes in version 2.2: + +- Use native toolbar and status bar on Mac OS X +- New application icon based on SVG drawing +- Correctly set application and bundle icon on Mac OS X and Windows +- Minor UI tweaks. +- Fix qthid.pro to allow correct build on Ubuntu 9.04 (thanks EA4FVS). +- Correct application name in file headers (thanks Andrew Elwell) + + +Changes in version 2.1: + +- Various fixes and workarounds to prevent crash and freeze when switching + between application and bootloader mode. The application can now run with or + without FCD (hotplug). Upgrade and verify firmware have been tested on Linux + (32 and 64 bit) and OSX 10.6. +- Updated HID API to hidapi/master from 2011-02-17 +- Retrieve libusb configuration on Linux using pkg-config +- Remove local Qt Creator configuration from distribution +- Improvements to the UI layout and widgets +- Added application icon +- Applied GPL V3 license + diff --git a/q65w/resources/qthid/README-qthid-4.1.txt b/q65w/resources/qthid/README-qthid-4.1.txt new file mode 100644 index 000000000..a4eb91747 --- /dev/null +++ b/q65w/resources/qthid/README-qthid-4.1.txt @@ -0,0 +1,72 @@ +1. INTRODUCTION + +Qthid is a small control application for the Funcube Dongle devices. It is an evolution of the qthid002 package by Howard Long G6LVB. + +This version 4.1 is a special version that adds support for the Funcube Dongle Pro+ (see http://www.funcubedongle.com/?page_id=1073). The original Funcube Dongle Pro is not supported by this version. + +Qthid uses the HIDAPI cross platform library by Signal 11 Software (http://www.signal11.us/oss/hidapi/). All the required files are bundled with qthid and no installation of the library is required. + + +2. INSTALLATION AND USAGE + +2.1 Linux + +Precompiled binaries (32 or 64 bit) are avaialble for download but users are required to install the Qt runtime libraries on their own. All common Linux distrib utions have the Qt libraries packaged and they can be installed using the package manager for the platform. Qt 4.7 and 4.8 has been tested. + +In order to use the Funcube Dongle Pro+ as regular user and udev rule is required. An example funcube-dongle.rules file is included with the package and you can simply copy that file to the /etc/udev/rules.d/ directory (hint: open a terminal and type: "sudo cp funcube-dongle.rules /etc/udev/rules.d/" without the quotes) + +Qthid should now detect your Funcube Dongle Pro+ when you plug it in. No reboot or udev restart is necessary. + + +2.2 Mac OS X (10.6+) + +The Mac OS X bundle contains all the necessary Qt libraries and no additional installation or configuration is required. Unlike Linux, the Funcube Dongle will just work. + + +2.3 Windows + +The windows package is self containing and does not require and Qt libs to be installed separately. This release has been tested on Windows 7. + + +2.4 Building from source + +- Install Qt Creator 2.0.1 or newer and Qt SDK 4.7. On recent linux it is normally sufficient to select Qt Creator and the required Qt libraries will be installed as dependencies. On Mac and Windows you need to download the full Qt SDK. On Windows you also need the MS Windows SDK. +- On linux you also need to install the libudev-dev package using the package manager (the name may be different depending on distribution but it should have libudev and dev int he name). +- Open the qthid.pro file in Qt Creator. It will say something about setting up a target; say OK or Finish or Done (depends on version and OS). +- You can now build and execute the project. + +It is also possible to build in a terminal: + +$ tar xvfz qthid-X.Y.tar.gz +$ cd qthid-X.Y +$ mkdir build +$ cd build +$ qmake ../qthid.pro +$ make + +You should now have a qthid binary. + + +3. License + +Qthid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + + +The frequency controller widget was taken from Cutesdr by Moe Wheatley, released under the following "Simplified BSD License": + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Moe Wheatley. + diff --git a/q65w/resources/qthid/README.qthid-4.0.txt b/q65w/resources/qthid/README.qthid-4.0.txt new file mode 100644 index 000000000..a5f3761ec --- /dev/null +++ b/q65w/resources/qthid/README.qthid-4.0.txt @@ -0,0 +1,85 @@ +1. INTRODUCTION + +Qthid is a Funcube Dongle control application with Qt user interface. It is an evolution of the qthid002 package by Howard Long G6LVB. + +The Funcube Dongle (http://www.funcubedongle.com/) is a small software defined radio receiver for 64 MHz - 1.7 GHz. It fits into a computer's USB port and uses USB audio to transfer complex I/Q data to SDR applications. The control API for setting frequency, gain, filter, etc. uses the USB HID standard, thus the Funcube Dongle does not require any specific hardware drivers as long as the host operating system supports USB audio and HID. + +Qthid uses the HIDAPI cross platform library by Signal 11 Software (http://www.signal11.us/oss/hidapi/). All the required files are bundled with qthid and no installation of the library is required. + +The current version 4.0 implements the full API available with the 18f firmware. It should cover all the functionality provided by the "fully functional windows frontend". Note that the majority of this full API is only available since firmware 18f and qthid 4 will not work with earlier firmware. The application will simply fail to detect the FCD with earlier firmwares. + +You can use qthid 2.x to upgrade your firmware to 18f or later. + + +2. INSTALLATION AND USAGE + +2.1 Linux + +If you are using Debian testing or Ubuntu, you can install the qthid-fcd-controller package. This should set everything up and you can skip the rest of this section. + +Otherwise you can use the precompiled binaries (32 or 64 bit) but you need the Qt runtime libraries installed. On Ubuntu these are called libqtcore4 and libqtgui4 and their dependencies. You can simply install everything Qt version 4 (not version 3!). Qt 4.8 has been tested, Qt 4.7 will probably also work. + +In order to use the Funcube Dongle as regular user, you need to create an udev rule. An example funcube-dongle.rules file is included with the package and you can simply copy that into the /lib/udev/rules.d/ directory. + +(hint: open a terminal and type: sudo cp funcube-dongle.rules /lib/udev/rules.d/funcube-dongle.rules) + +Qthid should now detect your FCD when you plug it in. No need to restart udev. + + +2.2 Mac OS X (10.6+) + +The Mac OS X bundle contains all the necessary Qt libraries and no additional installation or configuration is required. Unlike Linux, the Funcube Dongle will just work. + + +2.3 Windows + +The windows package is self containing and does not require and Qt libs to be installed separately. It is known to work on Windows XP and Windows 7. + + +2.4 Building from source + +- Install Qt Creator 2.0.1 or newer and Qt SDK 4.7. On recent linux it is normally sufficient to select Qt Creator and the required Qt libraries will be installed as dependencies. On Mac and Windows you need to download the full Qt SDK. On Windows you also need the MS Windows SDK. +- On linux you also need to install the libudev-dev package using the package manager (the name may be different depending on distribution but it should have libudev and dev int he name). +- Open the qthid.pro file in Qt Creator. It will say something about setting up a target; say OK or Finish or Done (depends on version and OS). +- You can now build and execute the project. + +If you want to try the latest experimental code you can check it out from Github: https://github.com/csete/qthid + + +3. License + +Qthid is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see . + + +The frequency controller widget was taken from Cutesdr by Moe Wheatley, released under the following "Simplified BSD License": + +Copyright 2010 Moe Wheatley. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Moe Wheatley ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Moe Wheatley OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Moe Wheatley. + diff --git a/q65w/resources/wisdom1.bat b/q65w/resources/wisdom1.bat new file mode 100644 index 000000000..2d5e3519f --- /dev/null +++ b/q65w/resources/wisdom1.bat @@ -0,0 +1,7 @@ +fftwf-wisdom -o fftwf_wisdom.dat -t 1 -m cif256 rif512 rib512 cif1024 cib1024 cib32768 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif77175 cib77175 cib5376000 cif74088 cib74088 cib5120000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif37632 cib37632 cib2621440 cif37044 cib37044 cib2560000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 -m cif24192 cif3456 cif336000 diff --git a/q65w/resources/wisdom2.bat b/q65w/resources/wisdom2.bat new file mode 100644 index 000000000..6ced98548 --- /dev/null +++ b/q65w/resources/wisdom2.bat @@ -0,0 +1,7 @@ +fftwf-wisdom -o fftwf_wisdom.dat -t 1 cif256 rif512 rib512 cif1024 cib1024 cib32768 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif77175 cib77175 cib5376000 cif74088 cib74088 cib5120000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif37632 cib37632 cib2621440 cif37044 cib37044 cib2560000 + +fftwf-wisdom -w fftwf_wisdom.dat -o fftwf_wisdom.dat -t 1 cif24192 cif3456 cif336000 diff --git a/q65w/set570.cpp b/q65w/set570.cpp new file mode 100644 index 000000000..a56832292 --- /dev/null +++ b/q65w/set570.cpp @@ -0,0 +1,272 @@ + +/* Linux / Windows program to control the frequency of a si570 synthesizer + ON5GN 6 jan 2012 + Under Linux: + -use the linux version of function void si570_sleep(int us) + -compile with + gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm + -run with sudo ./set_si570_freq + Under Windows: + -use the windows version of function void si570_sleep(int us) + -compile with mingw + C:\mingw\bin\mingw32-gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm + -run with set_si570_freq.exe +*/ + +#include /* Standard input/output definitions */ +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include + +#ifdef WIN32 +#include +#endif + +#include +#include + +#define USB_SUCCESS 0 +#define USB_ERROR_NOTFOUND 1 +#define USB_ERROR_ACCESS 2 +#define USB_ERROR_IO 3 +#define VENDOR_NAME "www.obdev.at" +#define PRODUCT_NAME "DG8SAQ-I2C" +#define USBDEV_SHARED_VENDOR 0x16C0 // VOTI VID +#define USBDEV_SHARED_PRODUCT 0x05DC // OBDEV PID + // Use obdev's generic shared VID/PID pair + // following the rules outlined in + // firmware/usbdrv/USBID-License.txt. +#define REQUEST_SET_FREQ_BY_VALUE 0x32 +#define MAX_USB_ERR_CNT 6 + +double freq_parm; +double delay_average; +int from_freq; +int to_freq; +int increment_freq; +int display_freq = -1; +int delay; +static libusb_device_handle * global_si570usb_handle; + +void si570_sleep(int us) +{ +#if defined (Q_OS_WIN) + ::Sleep (us / 1000); +#else + ::usleep (us); +#endif +} + +double round(double x) +{ + int i=x+0.5; + return (double)i; +} + +double current_time(void) //for delay measurements +{ + struct timeval t; + gettimeofday(&t,NULL); + return 0.000001*t.tv_usec+t.tv_sec; +} + +unsigned char Si570usbOpenDevice(libusb_device_handle **device, char *usbSerialID); +void setLongWord( int value, char * bytes); +int setFreqByValue(libusb_device_handle * handle, double frequency); +void sweepa_freq(void); +void sweepm_freq(void); + +int set570(double freq_MHz) +{ +//### +// qDebug() << "A" << freq_MHz; +// if(freq_MHz != 999.0) return 0; +//### + + char * my_usbSerialID = nullptr; + +// MAIN MENU DIALOG + if (Si570usbOpenDevice(&global_si570usb_handle, my_usbSerialID) != USB_SUCCESS) + { + return -1; + } + +//SET FREQUENCY + if((freq_MHz < 3.45)|(freq_MHz > 866.0)) return -2; + setFreqByValue(global_si570usb_handle,freq_MHz); + return 0; +} + +unsigned char Si570usbOpenDevice (libusb_device_handle * * udh, char * usbSerialID) +{ + if (*udh) return USB_SUCCESS; // only scan USB devices 1st time + + int vendor = USBDEV_SHARED_VENDOR; + char *vendorName = (char *)VENDOR_NAME; + int product = USBDEV_SHARED_PRODUCT; + char *productName = (char *)PRODUCT_NAME; + + libusb_device_handle * handle = nullptr; + unsigned char errorCode = USB_ERROR_NOTFOUND; + char buffer[256]; + int rc; + if ((rc = libusb_init (nullptr)) < 0) // init default context (safe to repeat) + { + printf ("usb initialization error message %s\n", libusb_error_name (rc)); + return errorCode = USB_ERROR_ACCESS; + } + + libusb_device * * device_list; + int device_count = libusb_get_device_list (nullptr, &device_list); + if (device_count < 0) + { + puts ("no usb devices"); + errorCode = USB_ERROR_NOTFOUND; + } + else + { + for (int i = 0; i < device_count; ++i) + { + libusb_device * device = device_list[i]; + libusb_device_descriptor descriptor; + if ((rc = libusb_get_device_descriptor (device, &descriptor)) < 0) + { + printf ("usb get device descriptor error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_ACCESS; + continue; + } + if (vendor == descriptor.idVendor && product == descriptor.idProduct) + { + // now we must open the device to query strings + if ((rc = libusb_open (device, &handle)) < 0) + { + printf ("usb open device error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_ACCESS; + continue; + } + if (!vendorName && !productName) + { + break; // good to go + } + if (libusb_get_string_descriptor_ascii (handle, descriptor.iManufacturer + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get vendor name error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!vendorName || !strcmp (buffer, vendorName)) + { + if (libusb_get_string_descriptor_ascii (handle, descriptor.iProduct + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get product name error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!productName || !strcmp (buffer, productName)) + { + if (libusb_get_string_descriptor_ascii (handle, descriptor.iSerialNumber + , reinterpret_cast (buffer), sizeof buffer) < 0) + { + printf ("usb get serial number error message %s\n", libusb_error_name (rc)); + errorCode = USB_ERROR_IO; + } + else + { + if (!usbSerialID || !strcmp (buffer, usbSerialID)) + { + break; // good to go + } + } + } + } + } + } + libusb_close (handle); + handle = nullptr; + } + } + libusb_free_device_list (device_list, 1); + } + if (handle) + { + errorCode = USB_SUCCESS; + *udh = handle; + } + return errorCode; +} + +void setLongWord( int value, char * bytes) +{ + bytes[0] = value & 0xff; + bytes[1] = ((value & 0xff00) >> 8) & 0xff; + bytes[2] = ((value & 0xff0000) >> 16) & 0xff; + bytes[3] = ((value & 0xff000000) >> 24) & 0xff; +} + +int setFreqByValue(libusb_device_handle * handle, double frequency) +{ +// Windows Doc from PE0FKO: +// +// Command 0x32: +// ------------- +// Set the oscillator frequency by value. The frequency is formatted in MHz +// as 11.21 bits value. +// The "automatic band pass filter selection", "smooth tune", +// "one side calibration" and the "frequency subtract multiply" are all +// done in this function. (if enabled in the firmware) +// +// Default: None +// +// Parameters: +// requesttype: LIBUSB_ENDPOINT_OUT +// request: 0x32 +// value: 0 +// index: 0 +// bytes: pointer 32 bits integer +// size: 4 +// +// Code sample: +// uint32_t iFreq; +// double dFreq; +// +// dFreq = 30.123456; // MHz +// iFreq = (uint32_t)( dFreq * (1UL << 21) ) +// r = usbCtrlMsgOUT(0x32, 0, 0, (char *)&iFreq, sizeof(iFreq)); +// if (r < 0) Error +// + + char buffer[4]; + int i2cAddress = 0x55; + int request = REQUEST_SET_FREQ_BY_VALUE; + int value = 0x700 + i2cAddress; + int my_index = 0; + int retval; + int err_cnt; + + err_cnt =0; + set_again:; + setLongWord(round(frequency * 2097152.0), buffer); // 2097152=2^21 + retval = libusb_control_transfer ( + handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, + request, + value, + my_index, + reinterpret_cast (buffer), + sizeof(buffer), + 5000); + if (retval != 4) { + err_cnt ++; + if(err_cnt < MAX_USB_ERR_CNT) { + si570_sleep(1000); // delay 1000 microsec + goto set_again; + } else { + printf("Error when setting frequency, returncode=%i\n",retval); + printf("usb error message: %s\n", libusb_error_name (retval)); + } + } + return retval; +} diff --git a/q65w/signalmeter.cpp b/q65w/signalmeter.cpp new file mode 100644 index 000000000..c6c27618b --- /dev/null +++ b/q65w/signalmeter.cpp @@ -0,0 +1,53 @@ +// Simple bargraph dB meter +// Implemented by Edson Pereira PY2SDR +// +// Limits and geometry are hardcded for now. + +#include "signalmeter.h" + +SignalMeter::SignalMeter(QWidget *parent) : + QWidget(parent) +{ + resize(parent->size()); + + m_meter = new MeterWidget(this); + m_meter->setGeometry(10, 10, 10, 120); + + m_label = new QLabel(this); + m_label->setGeometry(10, 135, 20, 20); + + QLabel *dbLabel = new QLabel(this); + dbLabel->setText("dB"); + dbLabel->setGeometry(30, 135, 20, 20); +} + +SignalMeter::~SignalMeter() +{ + +} + +void SignalMeter::paintEvent( QPaintEvent * ) +{ + QPainter p {this}; + + p.drawLine(22, 10, 22, 130); + + for ( int i = 0; i <= 60; i += 10 ) { + p.drawLine(22, i*2 + 10, 25, i*2 + 10); + } + + for ( int i = 10; i < 60; i += 10 ) { + p.drawText(30, i*2 + 15, QString::number(60 - i)); + } +} + +void SignalMeter::setValue(int value) +{ + m_meter->setValue(value); + m_label->setText(QString::number(value)); +} + +void SignalMeter::resizeEvent(QResizeEvent *s) +{ + resize(s->size()); +} diff --git a/q65w/signalmeter.h b/q65w/signalmeter.h new file mode 100644 index 000000000..ea1aa6295 --- /dev/null +++ b/q65w/signalmeter.h @@ -0,0 +1,32 @@ +#ifndef SIGNALMETER_H +#define SIGNALMETER_H + +#include +#include +#include + +class SignalMeter : public QWidget +{ + Q_OBJECT + +public: + explicit SignalMeter(QWidget *parent = 0); + ~SignalMeter(); + +public slots: + void setValue(int value); + +private: + MeterWidget *m_meter; + + QLabel *m_label; + + int m_signal; + int m_sigPeak; + +protected: + void paintEvent( QPaintEvent * ); + void resizeEvent(QResizeEvent *s); +}; + +#endif // SIGNALMETER_H diff --git a/q65w/sleep.h b/q65w/sleep.h new file mode 100644 index 000000000..c11188c2a --- /dev/null +++ b/q65w/sleep.h @@ -0,0 +1,16 @@ +#ifndef SLEEP_H +#define SLEEP_H +#include + +class Sleep : public QThread +{ +public: + static void msleep(int ms) { + QThread::msleep(ms); + } + static int idealThreadCount() { + return QThread::idealThreadCount(); + } +}; + +#endif // SLEEP_H diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp new file mode 100644 index 000000000..46433d4ea --- /dev/null +++ b/q65w/soundin.cpp @@ -0,0 +1,451 @@ +#include "soundin.h" +#include + +#ifdef Q_OS_WIN32 +#include +#else +#include +#endif + +#define NFFT 32768 +#define FRAMES_PER_BUFFER 1024 + +#include +extern "C" +{ + struct + { + double d8[2*60*96000]; //This is "common/datcom/..." in fortran + float ss[4*322*NFFT]; + float savg[4*NFFT]; + double fcenter; + int nutc; + int idphi; //Phase correction for Y pol'n, degrees + int mousedf; //User-selected DF + int mousefqso; //User-selected QSO freq (kHz) + int nagain; //1 ==> decode only at fQSO +/- Tol + int ndepth; //How much hinted decoding to do? + int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int neme; //Hinted decoding tries only for EME calls + int newdat; //1 ==> new data, must do long FFT + int nfa; //Low decode limit (kHz) + int nfb; //High decode limit (kHz) + int nfcal; //Frequency correction, for calibration (Hz) + int nfshift; //Shift of displayed center freq (kHz) + int mcall3; //1 ==> CALL3.TXT has been modified + int ntimeout; //Max for timeouts in Messages and BandMap + int ntol; //+/- decoding range around fQSO (Hz) + int nxant; //1 ==> add 45 deg to measured pol angle + int map65RxLog; //Flags to control log files + int nfsample; //Input sample rate + int nxpol; //1 if using xpol antennas, 0 otherwise + int mode65; //JT65 sub-mode: A=1, B=2, C=4 + int nfast; //1No longer used + int nsave; //Number of s3(64,63) spectra saved + char mycall[12]; + char mygrid[6]; + char hiscall[12]; + char hisgrid[6]; + char datetime[20]; + } datcom_; +} + +typedef struct +{ + int kin; //Parameters sent to/from the portaudio callback function + int nrx; + int dB; + bool bzero; + bool iqswap; +} paUserData; + +//--------------------------------------------------------------- a2dCallback +extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer, + unsigned long framesToProcess, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) + +// This routine called by the PortAudio engine when samples are available. +// It may be called at interrupt level, so don't do anything +// that could mess up the system like calling malloc() or free(). + +{ + paUserData *udata=(paUserData*)userData; + (void) outputBuffer; //Prevent unused variable warnings. + (void) timeInfo; + (void) userData; + int nbytes,i,j; + float d4[4*FRAMES_PER_BUFFER]; + float d4a[4*FRAMES_PER_BUFFER]; + float tmp; + float fac; + + if( (statusFlags&paInputOverflow) != 0) { + qDebug() << "Input Overflow"; + } + if(udata->bzero) { //Start of a new minute + udata->kin=0; //Reset buffer pointer + udata->bzero=false; + } + + nbytes=udata->nrx*8*framesToProcess; //Bytes per frame + memcpy(d4,inputBuffer,nbytes); //Copy all samples to d4 + + fac=32767.0 * pow(10.0,0.05*udata->dB); + + if(udata->nrx==2) { + for(i=0; i<4*int(framesToProcess); i++) { //Negate odd-numbered frames + d4[i]=fac*d4[i]; + j=i/4; + if((j%2)==1) d4[i]=-d4[i]; + } + if(!udata->iqswap) { + for(i=0; ikin],d4,nbytes); //Copy from d4 to dd() + } else { + int k=0; + for(i=0; i<2*int(framesToProcess); i+=2) { //Negate odd-numbered frames + j=i/2; + if(j%2==0) { + d4a[k++]=fac*d4[i]; + d4a[k++]=fac*d4[i+1]; + } else { + d4a[k++]=-fac*d4[i]; + d4a[k++]=-fac*d4[i+1]; + } + d4a[k++]=0.0; + d4a[k++]=0.0; + } + if(!udata->iqswap) { + for(i=0; ikin],d4a,2*nbytes); //Copy from d4a to dd() + } + udata->kin += framesToProcess; + return paContinue; +} + +namespace +{ + struct COMWrapper + { + explicit COMWrapper () + { +#ifdef Q_OS_WIN32 + // required because Qt only does this for GUI thread + CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); +#endif + } + ~COMWrapper () + { +#ifdef Q_OS_WIN32 + CoUninitialize (); +#endif + } + }; +} + +void SoundInThread::run() //SoundInThread::run() +{ + quitExecution = false; + + if (m_net) { +// qDebug() << "Start inputUDP()"; + inputUDP(); +// qDebug() << "Finished inputUDP()"; + return; + } + + COMWrapper c; + + //---------------------------------------------------- Soundcard Setup + // qDebug() << "Start souncard input"; + + PaError paerr; + PaStreamParameters inParam; + PaStream *inStream; + paUserData udata; + + udata.kin=0; //Buffer pointer + udata.bzero=false; //Flag to request reset of kin + udata.nrx=m_nrx; //Number of polarizations + udata.iqswap=m_IQswap; + udata.dB=m_dB; + + auto device_info = Pa_GetDeviceInfo (m_nDevIn); + + inParam.device=m_nDevIn; //### Input Device Number ### + inParam.channelCount=2*m_nrx; //Number of analog channels + inParam.sampleFormat=paFloat32; //Get floats from Portaudio + inParam.suggestedLatency=device_info->defaultHighInputLatency; + inParam.hostApiSpecificStreamInfo=NULL; + + paerr=Pa_IsFormatSupported(&inParam,NULL,96000.0); + if(paerr<0) { + QString error_message; + if (paUnanticipatedHostError == paerr) + { + auto const * last_host_error = Pa_GetLastHostErrorInfo (); + error_message = QString {"PortAudio Host API error: %1"}.arg (last_host_error->errorText); + } + else + { + error_message = "PortAudio says requested soundcard format not supported."; + } + emit error(error_message); +// return; + } + paerr=Pa_OpenStream(&inStream, //Input stream + &inParam, //Input parameters + NULL, //No output parameters + 96000.0, //Sample rate + FRAMES_PER_BUFFER, //Frames per buffer +// paClipOff+paDitherOff, //No clipping or dithering + paClipOff, //No clipping + a2dCallback, //Input callbeck routine + &udata); //userdata + + paerr=Pa_StartStream(inStream); + if(paerr<0) { + emit error("Failed to start audio input stream."); + return; + } +// const PaStreamInfo* p=Pa_GetStreamInfo(inStream); + + bool qe = quitExecution; + int ntr0=99; + int k=0; + int nsec; + int ntr; + int nBusy=0; + int nhsym0=0; + +//---------------------------------------------- Soundcard input loop + while (!qe) { + qe = quitExecution; + if (qe) break; + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + nsec = ms/1000; // Time according to this computer + ntr = nsec % m_TRperiod; + +// Reset buffer pointer and symbol number at start of minute + if(ntr < ntr0 or !m_monitoring or m_TRperiod!=m_TRperiod0) { + nhsym0=0; + udata.bzero=true; + m_TRperiod0=m_TRperiod; + } + k=udata.kin; + udata.iqswap=m_IQswap; + udata.dB=m_dB; + if(m_monitoring) { + if(m_bForceCenterFreq) { + datcom_.fcenter=m_dForceCenterFreq; + } else { + datcom_.fcenter=144.125; + } + m_hsym=(k-2048)*11025.0/(2048.0*m_rate); + if(m_hsym != nhsym0) { + if(m_dataSinkBusy) { + nBusy++; + } else { + m_dataSinkBusy=true; + emit readyForFFT(k); //Signal to compute new FFTs + } + nhsym0=m_hsym; + } + } + msleep(100); + ntr0=ntr; + } + Pa_StopStream(inStream); + Pa_CloseStream(inStream); +} + +void SoundInThread::setSwapIQ(bool b) +{ + m_IQswap=b; +} + +void SoundInThread::setScale(qint32 n) +{ + m_dB=n; +} +void SoundInThread::setPort(int n) //setPort() +{ + if (isRunning()) return; + this->m_udpPort=n; +} + +void SoundInThread::setInputDevice(int n) //setInputDevice() +{ + if (isRunning()) return; + this->m_nDevIn=n; +} + +void SoundInThread::setRate(double rate) //setRate() +{ + if (isRunning()) return; + this->m_rate = rate; +} + +void SoundInThread::setBufSize(unsigned n) //setBufSize() +{ + if (isRunning()) return; + this->bufSize = n; +} + +void SoundInThread::setFadd(double x) +{ + m_fAdd=x; +} + + +void SoundInThread::quit() //quit() +{ + quitExecution = true; +} + +void SoundInThread::setNetwork(bool b) //setNetwork() +{ + m_net = b; +} + +void SoundInThread::setMonitoring(bool b) //setMonitoring() +{ + m_monitoring = b; +} + +void SoundInThread::setForceCenterFreqBool(bool b) +{ + m_bForceCenterFreq=b; + +} + +void SoundInThread::setForceCenterFreqMHz(double d) +{ + m_dForceCenterFreq=d; +} + +void SoundInThread::setNrx(int n) //setNrx() +{ + m_nrx = n; +} + +int SoundInThread::nrx() +{ + return m_nrx; +} + +int SoundInThread::mhsym() +{ + return m_hsym; +} + +void SoundInThread::setPeriod(int n) +{ + m_TRperiod=n; +} + +//--------------------------------------------------------------- inputUDP() +void SoundInThread::inputUDP() +{ + udpSocket = new QUdpSocket(); + if(!udpSocket->bind(m_udpPort,QUdpSocket::ShareAddress) ) + { + emit error(tr("UDP Socket bind failed.")); + return; + } + + // Set this socket's total buffer space for received UDP packets + udpSocket->setSocketOption (QUdpSocket::ReceiveBufferSizeSocketOption, 141600); + + bool qe = quitExecution; + struct linradBuffer { + double cfreq; + int msec; + float userfreq; + int iptr; + quint16 iblk; + qint8 nrx; + char iusb; + double d8[174]; + } b; + + int ntr0=99; + int k=0; + int nsec; + int ntr; + int nhsym0=0; + int iz=174; + int nBusy=0; + + // Main loop for input of UDP packets over the network: + while (!qe) { + qe = quitExecution; + if (qe) break; + if (!udpSocket->hasPendingDatagrams()) { + msleep(2); // Sleep if no packet available + } else { + int nBytesRead = udpSocket->readDatagram((char *)&b,1416); + if (nBytesRead != 1416) qDebug() << "UDP Read Error:" << nBytesRead; + + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + nsec = ms/1000; // Time according to this computer + ntr = nsec % m_TRperiod; + +// Reset buffer pointer and symbol number at start of minute + if(ntr < ntr0 or !m_monitoring or m_TRperiod!=m_TRperiod0) { + k=0; + nhsym0=0; + m_TRperiod0=m_TRperiod; + } + ntr0=ntr; + + if(m_monitoring) { + m_nrx=b.nrx; + if(m_nrx == +1) iz=348; //One RF channel, i*2 data + if(m_nrx == -1 or m_nrx == +2) iz=174; //One Rf channel, r*4 data + // or 2 RF channels, i*2 data + if(m_nrx == -2) iz=87; // Two RF channels, r*4 data + + // If buffer will not overflow, move data into datcom_ + if ((k+iz) <= 60*96000) { + int nsam=-1; + recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8); + if(m_bForceCenterFreq) { + datcom_.fcenter=m_dForceCenterFreq; + } else { + datcom_.fcenter=b.cfreq + m_fAdd; + } + } + + m_hsym=(k-2048)*11025.0/(2048.0*m_rate); + if(m_hsym != nhsym0) { + if(m_dataSinkBusy) { + nBusy++; + } else { + m_dataSinkBusy=true; + emit readyForFFT(k); //Signal to compute new FFTs + } + nhsym0=m_hsym; + } + } + } + } + delete udpSocket; +} diff --git a/q65w/soundin.h b/q65w/soundin.h new file mode 100644 index 000000000..78947338f --- /dev/null +++ b/q65w/soundin.h @@ -0,0 +1,82 @@ +#ifndef SOUNDIN_H +#define SOUNDIN_H + +#include +#include +#include +#include + +// Thread gets audio data from soundcard and signals when a buffer of +// specified size is available. +class SoundInThread : public QThread +{ + Q_OBJECT + bool quitExecution; // if true, thread exits gracefully + double m_rate; // sample rate + unsigned bufSize; // user's buffer size + +protected: + virtual void run(); + +public: + bool m_dataSinkBusy; + + SoundInThread(): + quitExecution(false), + m_rate(0), + bufSize(0), + m_dataSinkBusy(false) + { + } + + void setSwapIQ(bool b); + void setScale(qint32 n); + void setPort(qint32 n); + void setInputDevice(qint32 n); + void setRate(double rate); + void setBufSize(unsigned bufSize); + void setNetwork(bool b); + void setMonitoring(bool b); + void setFadd(double x); + void setNrx(int n); + void setForceCenterFreqBool(bool b); + void setForceCenterFreqMHz(double d); + void setPeriod(int n); + int nrx(); + int mhsym(); + +signals: + void bufferAvailable(std::valarray samples, double rate); + void readyForFFT(int k); + void error(const QString& message); + void status(const QString& message); + +public slots: + void quit(); + +private: + void inputUDP(); + + double m_fAdd; + bool m_net; + bool m_monitoring; + bool m_bForceCenterFreq; + bool m_IQswap; + double m_dForceCenterFreq; + qint32 m_nrx; + qint32 m_hsym; + qint32 m_nDevIn; + qint32 m_udpPort; + qint32 m_TRperiod; + qint32 m_TRperiod0; + qint32 m_dB; + + QUdpSocket *udpSocket; +}; + +extern "C" { + void recvpkt_(int* nsam, quint16* iblk, qint8* nrx, int* k, double s1[], + double s2[], double s3[]); +} + +#endif // SOUNDIN_H diff --git a/q65w/soundout.cpp b/q65w/soundout.cpp new file mode 100644 index 000000000..e74d0549d --- /dev/null +++ b/q65w/soundout.cpp @@ -0,0 +1,207 @@ +#include "soundout.h" + +#ifdef Q_OS_WIN32 +#include +#endif + +#define FRAMES_PER_BUFFER 256 + +#include + +extern float gran(); //Noise generator (for tests only) + +extern short int iwave[2*60*11025]; //Wave file for Tx audio +extern int nwave; +extern bool btxok; +extern bool bTune; +extern bool bIQxt; +extern int iqAmp; +extern int iqPhase; +extern int txPower; +extern double outputLatency; + +typedef struct //Parameters sent to or received from callback function +{ + int nTRperiod; +} paUserData; + +//--------------------------------------------------------------- d2aCallback +extern "C" int d2aCallback(const void * /*inputBuffer*/, void *outputBuffer, + unsigned long framesToProcess, + const PaStreamCallbackTimeInfo* /*timeInfo*/, + PaStreamCallbackFlags /*statusFlags*/, + void *userData ) +{ + paUserData *udata=(paUserData*)userData; + short *wptr = (short*)outputBuffer; + unsigned int i; + static int n; + static int ic=0; + static bool btxok0=false; + static bool bTune0=false; + static int nStart=0; + static double phi=0.; + double tsec,tstart,dphi; + int nsec; + int nTRperiod=udata->nTRperiod; + + // Get System time + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + tsec = 0.001*ms; + nsec = ms/1000; + qreal dPhase=iqPhase/5729.57795131; + qreal amp=1.0 + 0.0001*iqAmp; + qreal xAmp=txPower*295.00*qSqrt(2.0 - amp*amp); + qreal yAmp=txPower*295.00*amp; + static int nsec0=0; + + if(bTune) { + ic=0; + dphi=6.28318530718*1270.46/11025.0; + } + if(bTune0 and !bTune) btxok=false; + bTune0=bTune; + + if(nsec!=nsec0) { +// qDebug() << txPower << iqAmp << iqPhase << amp << xAmp << yAmp << dPhase << bTune; +// qDebug() << "A" << nsec%60 << bTune << btxok; +// ic=0; + nsec0=nsec; + } + + if(btxok and !btxok0) { //Start (or re-start) a transmission + n=nsec/nTRperiod; + tstart=tsec - n*nTRperiod - 1.0; + + if(tstart<1.0) { + ic=0; //Start of Tx cycle, set starting index to 0 + nStart=n; + } else { + if(n != nStart) { //Late start in new Tx cycle: compute starting index + ic=(int)(tstart*11025.0); + ic=2*ic; + nStart=n; + } + } + } + btxok0=btxok; + + if(btxok) { + for(i=0 ; i nwave) {i2a=0; i2b=0;} +// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!) +// if(bIQxt) { + if(1) { + if(bTune) { + phi += dphi; + } else { + phi=qAtan2(qreal(i2b),qreal(i2a)); + } + i2a=xAmp*qCos(phi); + i2b=yAmp*qSin(phi + dPhase); +// qDebug() << xAmp << yAmp << phi << i2a << i2b; + } +// i2a=0.01*txPower*i2a; +// i2b=0.01*txPower*i2b; + *wptr++ = i2b; //left + *wptr++ = i2a; //right + } + } else { + for(i=0 ; i nwave) { + btxok=0; + ic=0; + } + return 0; +} + +namespace +{ + struct COMWrapper + { + explicit COMWrapper () + { +#ifdef Q_OS_WIN32 + // required because Qt only does this for GUI thread + CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); +#endif + } + ~COMWrapper () + { +#ifdef Q_OS_WIN32 + CoUninitialize (); +#endif + } + }; +} + +void SoundOutThread::run() +{ + COMWrapper c; + + PaError paerr; + PaStreamParameters outParam; + PaStream *outStream; + paUserData udata; + quitExecution = false; + + auto device_info = Pa_GetDeviceInfo (m_nDevOut); + + outParam.device=m_nDevOut; //Output device number + outParam.channelCount=2; //Number of analog channels + outParam.sampleFormat=paInt16; //Send short ints to PortAudio + outParam.suggestedLatency=device_info->defaultLowOutputLatency; + outParam.hostApiSpecificStreamInfo=NULL; + + udata.nTRperiod=m_TRperiod; + paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0); + if(paerr<0) { + qDebug() << "PortAudio says requested output format not supported."; + qDebug() << paerr; + return; + } + paerr=Pa_OpenStream(&outStream, //Output stream + NULL, //No input parameters + &outParam, //Output parameters + 11025.0, //Sample rate + FRAMES_PER_BUFFER, //Frames per buffer + paClipOff, //No clipping + d2aCallback, //output callbeck routine + &udata); //userdata + + paerr=Pa_StartStream(outStream); + if(paerr<0) { + qDebug() << "Failed to start audio output stream."; + return; + } + const PaStreamInfo* p=Pa_GetStreamInfo(outStream); + outputLatency = p->outputLatency; + bool qe = quitExecution; + +//---------------------------------------------- Soundcard output loop + while (!qe) { + qe = quitExecution; + if (qe) break; + msleep(100); + } + Pa_StopStream(outStream); + Pa_CloseStream(outStream); +} + +void SoundOutThread::setOutputDevice(int n) //setOutputDevice() +{ + if (isRunning()) return; + this->m_nDevOut=n; +} + +void SoundOutThread::setPeriod(int n) +{ + m_TRperiod=n; +} diff --git a/q65w/soundout.h b/q65w/soundout.h new file mode 100644 index 000000000..294c6fa5f --- /dev/null +++ b/q65w/soundout.h @@ -0,0 +1,44 @@ +#ifndef SOUNDOUT_H +#define SOUNDOUT_H +#include +#include + +// An instance of this thread sends audio data to a specified soundcard. +// Output can be muted while underway, preserving waveform timing when +// transmission is resumed. + +class SoundOutThread : public QThread +{ + Q_OBJECT + +protected: + virtual void run(); + +public: +// Constructs (but does not start) a SoundOutThread + SoundOutThread() + : quitExecution(false) // Initialize some private members + , m_rate(0) + , m_nwave(48*11025) + , m_txOK(false) + , m_txMute(false) + { + } + +public: + void setOutputDevice(qint32 n); + void setPeriod(int n); + bool quitExecution; //If true, thread exits gracefully + + +// Private members +private: + double m_rate; //Sample rate + qint32 m_nDevOut; //Output device number + qint32 m_nwave; //Length of wave file + qint32 m_TRperiod; //T/R period (30 or 60 s) + bool m_txOK; //Enable Tx audio + bool m_txMute; //Mute temporarily +}; + +#endif diff --git a/q65w/ss.bat b/q65w/ss.bat new file mode 100644 index 000000000..3ea6cc6dc --- /dev/null +++ b/q65w/ss.bat @@ -0,0 +1 @@ +svn status | grep -v "?" diff --git a/q65w/sss.bat b/q65w/sss.bat new file mode 100644 index 000000000..63b4044f2 --- /dev/null +++ b/q65w/sss.bat @@ -0,0 +1 @@ +svn status diff --git a/q65w/txtune.cpp b/q65w/txtune.cpp new file mode 100644 index 000000000..b1d7fb71d --- /dev/null +++ b/q65w/txtune.cpp @@ -0,0 +1,116 @@ +#include "txtune.h" +#include "ui_txtune.h" +#include + +extern int txPower; +extern int iqAmp; +extern int iqPhase; +extern bool bTune; + +TxTune::TxTune(QWidget *parent) : + QDialog(parent), + ui(new Ui::TxTune) +{ + ui->setupUi(this); +} + +TxTune::~TxTune() +{ + delete ui; +} + +void TxTune::accept() +{ + if(bTune) on_pbTune_clicked(); + QDialog::accept(); +} + +void TxTune::reject() +{ + if(bTune) on_pbTune_clicked(); + set_iqAmp(m_saveAmp); + set_iqPhase(m_savePha); + set_txPower(m_saveTxPower); + QDialog::reject(); +} + +void TxTune::on_pwrSlider_valueChanged(int n) +{ + txPower=n; + ui->labPower->setText (QString {"%1 %"}.arg (n)); +} + +void TxTune::on_ampSlider_valueChanged(int n) +{ + m_iqAmp1=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + ui->labAmpReal->setText (QString::number (1.0 + 0.0001 * iqAmp, 'f', 4)); +} + +void TxTune::on_fineAmpSlider_valueChanged(int n) +{ + m_iqAmp2=n; + iqAmp=10*m_iqAmp1 + m_iqAmp2; + ui->labAmpReal->setText (QString::number (1.0 + 0.0001*iqAmp, 'f', 4)); +} + +void TxTune::on_phaSlider_valueChanged(int n) +{ + m_iqPha1=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); +} + +void TxTune::on_finePhaSlider_valueChanged(int n) +{ + m_iqPha2=n; + iqPhase=10*m_iqPha1 + m_iqPha2; + ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); +} + +void TxTune::set_iqAmp(int n) +{ + m_saveAmp=n; + m_iqAmp1=n/10; + m_iqAmp2=n%10; + ui->ampSlider->setValue(m_iqAmp1); + ui->fineAmpSlider->setValue(m_iqAmp2); +} + +void TxTune::set_iqPhase(int n) +{ + m_savePha=n; + m_iqPha1=n/10; + m_iqPha2=n%10; + ui->phaSlider->setValue(m_iqPha1); + ui->finePhaSlider->setValue(m_iqPha2); +} + +void TxTune::set_txPower(int n) +{ + m_saveTxPower=n; + ui->pwrSlider->setValue(n); +} + +void TxTune::on_cbTxImage_toggled(bool b) +{ + ui->ampSlider->setEnabled(b); + ui->fineAmpSlider->setEnabled(b); + ui->labAmp->setEnabled(b); + ui->labFineAmp->setEnabled(b); + ui->phaSlider->setEnabled(b); + ui->finePhaSlider->setEnabled(b); + ui->labPha->setEnabled(b); + ui->labFinePha->setEnabled(b); +} + +void TxTune::on_pbTune_clicked() +{ + bTune = !bTune; + if(bTune) { + QString style="QPushButton{background-color: red;}"; + ui->pbTune->setStyleSheet(style); + } else { + ui->pbTune->setStyleSheet(""); + } +} diff --git a/q65w/txtune.h b/q65w/txtune.h new file mode 100644 index 000000000..e60015726 --- /dev/null +++ b/q65w/txtune.h @@ -0,0 +1,48 @@ +#ifndef TXTUNE_H +#define TXTUNE_H + +#include + +namespace Ui { +class TxTune; +} + +class TxTune : public QDialog +{ + Q_OBJECT + +public: + explicit TxTune(QWidget *parent = 0); + ~TxTune(); + +public slots: + void accept(); + void reject(); + +private slots: + void on_pwrSlider_valueChanged(int n); + void on_ampSlider_valueChanged(int n); + void on_phaSlider_valueChanged(int n); + void on_cbTxImage_toggled(bool b); + void on_pbTune_clicked(); + void on_fineAmpSlider_valueChanged(int n); + void on_finePhaSlider_valueChanged(int n); + +public: + void set_iqAmp(int n); + void set_iqPhase(int n); + void set_txPower(int n); + +private: + qint32 m_iqAmp1; + qint32 m_iqAmp2; + qint32 m_iqPha1; + qint32 m_iqPha2; + qint32 m_saveAmp; + qint32 m_savePha; + qint32 m_saveTxPower; + + Ui::TxTune *ui; +}; + +#endif // TXTUNE_H diff --git a/q65w/txtune.ui b/q65w/txtune.ui new file mode 100644 index 000000000..af78cd418 --- /dev/null +++ b/q65w/txtune.ui @@ -0,0 +1,302 @@ + + + TxTune + + + + 0 + 0 + 400 + 300 + + + + Tx Tune + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + 13 + 38 + 351 + 191 + + + + + + + + 70 + 0 + + + + Tx Power: + + + + + + + 100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + + Enable Tx I/Q Adjustment + + + + + + + false + + + + 70 + 0 + + + + I/Q Amplitude: + + + + + + + false + + + -100 + + + 100 + + + 0 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + Fine: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + + 70 + 0 + + + + I/Q Phase: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + 0 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + false + + + Fine: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + false + + + -100 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + + + + + 1.0000 + + + Qt::AlignCenter + + + + + + + 0.000 + + + Qt::AlignCenter + + + + + + + Tune + + + + + + + 100 % + + + Qt::AlignCenter + + + + + + + + + + buttonBox + accepted() + TxTune + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TxTune + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp new file mode 100644 index 000000000..265b00fa3 --- /dev/null +++ b/q65w/widegraph.cpp @@ -0,0 +1,388 @@ +#include "widegraph.h" +#include +#include +#include "SettingsGroup.hpp" +#include "ui_widegraph.h" + +#define NFFT 32768 + +WideGraph::WideGraph (QString const& settings_filename, QWidget * parent) + : QDialog {parent}, + ui {new Ui::WideGraph}, + m_settings_filename {settings_filename} +{ + ui->setupUi(this); + setWindowTitle("Wide Graph"); + setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); + installEventFilter(parent); //Installing the filter + ui->widePlot->setCursor(Qt::CrossCursor); + setMaximumWidth(2048); + setMaximumHeight(880); + ui->widePlot->setMaximumHeight(800); + m_bIQxt=false; + connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this, + SLOT(wideFreezeDecode(int))); + + //Restore user's settings + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // historical reasons + setGeometry (settings.value ("WideGraphGeom", QRect {45,30,1023,340}).toRect ()); + } + SettingsGroup g {&settings, "WideGraph"}; + ui->widePlot->setPlotZero(settings.value("PlotZero", 20).toInt()); + ui->widePlot->setPlotGain(settings.value("PlotGain", 0).toInt()); + ui->zeroSpinBox->setValue(ui->widePlot->getPlotZero()); + ui->gainSpinBox->setValue(ui->widePlot->getPlotGain()); + int n = settings.value("FreqSpan",60).toInt(); + int w = settings.value("PlotWidth",1000).toInt(); + ui->freqSpanSpinBox->setValue(n); + ui->widePlot->setNSpan(n); + int nbpp = n * 32768.0/(w*96.0) + 0.5; + ui->widePlot->setBinsPerPixel(nbpp); + m_waterfallAvg = settings.value("WaterfallAvg",10).toInt(); + ui->waterfallAvgSpinBox->setValue(m_waterfallAvg); + ui->freqOffsetSpinBox->setValue(settings.value("FreqOffset",0).toInt()); + m_bForceCenterFreq=settings.value("ForceCenterFreqBool",false).toBool(); + m_dForceCenterFreq=settings.value("ForceCenterFreqMHz",144.125).toDouble(); + ui->cbFcenter->setChecked(m_bForceCenterFreq); + ui->cbLockTxRx->setChecked(m_bLockTxRx); + ui->fCenterLineEdit->setText(QString::number(m_dForceCenterFreq)); + m_bLockTxRx=settings.value("LockTxRx",false).toBool(); + ui->cbLockTxRx->setChecked(m_bLockTxRx); +} + +WideGraph::~WideGraph() +{ + saveSettings(); + delete ui; +} + +void WideGraph::resizeEvent(QResizeEvent* ) //resizeEvent() +{ + if(!size().isValid()) return; + int w = size().width(); + int h = size().height(); + ui->labFreq->setGeometry(QRect(w-256,h-100,227,41)); +} + +void WideGraph::saveSettings() +{ + //Save user's settings + QSettings settings {m_settings_filename, QSettings::IniFormat}; + { + SettingsGroup g {&settings, "MainWindow"}; // for historical reasons + settings.setValue ("WideGraphGeom", geometry()); + } + SettingsGroup g {&settings, "WideGraph"}; + settings.setValue("PlotZero",ui->widePlot->m_plotZero); + settings.setValue("PlotGain",ui->widePlot->m_plotGain); + settings.setValue("PlotWidth",ui->widePlot->plotWidth()); + settings.setValue("FreqSpan",ui->freqSpanSpinBox->value()); + settings.setValue("WaterfallAvg",ui->waterfallAvgSpinBox->value()); + settings.setValue("FreqOffset",ui->widePlot->freqOffset()); + settings.setValue("ForceCenterFreqBool",m_bForceCenterFreq); + settings.setValue("ForceCenterFreqMHz",m_dForceCenterFreq); + settings.setValue("LockTxRx",m_bLockTxRx); +} + +void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, + uchar lstrong[]) +{ + static float splot[NFFT]; + float swide[2048]; + float smax; + double df; + int nbpp = ui->widePlot->binsPerPixel(); + static int n=0; + static int nkhz0=-999; + static int ntrz=0; + + df = m_fSample/32768.0; + if(nkhz != nkhz0) { + ui->widePlot->setNkhz(nkhz); //Why do we need both? + ui->widePlot->SetCenterFreq(nkhz); //Why do we need both? + ui->widePlot->setFQSO(nkhz,true); + nkhz0 = nkhz; + } + + //Average spectra over specified number, m_waterfallAvg + if (n==0) { + for (int i=0; i=m_waterfallAvg) { + for (int i=0; iwidePlot->plotWidth(); + qint64 sf = nkhz + ui->widePlot->freqOffset() - 0.5*w*nbpp*df/1000.0; + if(sf != ui->widePlot->startFreq()) ui->widePlot->SetStartFreq(sf); + int i0=16384.0+(ui->widePlot->startFreq()-nkhz+1.27046+0.001*m_fCal) * + 1000.0/df + 0.5; + int i=i0; + for (int j=0; j<2048; j++) { + smax=0; + for (int k=0; ksmax) smax=splot[i]; + } + swide[j]=smax; + if(lstrong[1 + i/32]!=0) swide[j]=-smax; //Tag strong signals + } + +// Time according to this computer + qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; + int ntr = (ms/1000) % m_TRperiod; + + if((ndiskdata && ihsym <= m_waterfallAvg) || (!ndiskdata && ntrwidePlot->draw(swide,i0,splot); + } +} + +void WideGraph::on_freqOffsetSpinBox_valueChanged(int f) +{ + ui->widePlot->SetFreqOffset(f); +} + +void WideGraph::on_freqSpanSpinBox_valueChanged(int n) +{ + ui->widePlot->setNSpan(n); + int w = ui->widePlot->plotWidth(); + int nbpp = n * 32768.0/(w*96.0) + 0.5; + if(nbpp < 1) nbpp=1; + if(w > 0) { + ui->widePlot->setBinsPerPixel(nbpp); + } +} + +void WideGraph::on_waterfallAvgSpinBox_valueChanged(int n) +{ + m_waterfallAvg = n; +} + +void WideGraph::on_zeroSpinBox_valueChanged(int value) +{ + ui->widePlot->setPlotZero(value); +} + +void WideGraph::on_gainSpinBox_valueChanged(int value) +{ + ui->widePlot->setPlotGain(value); +} + +void WideGraph::keyPressEvent(QKeyEvent *e) +{ + switch(e->key()) + { + case Qt::Key_F11: + emit f11f12(11); + break; + case Qt::Key_F12: + emit f11f12(12); + break; + default: + e->ignore(); + } +} + +int WideGraph::QSOfreq() +{ + return ui->widePlot->fQSO(); +} + +int WideGraph::nSpan() +{ + return ui->widePlot->m_nSpan; +} + +float WideGraph::fSpan() +{ + return ui->widePlot->m_fSpan; +} + +int WideGraph::nStartFreq() +{ + return ui->widePlot->startFreq(); +} + +void WideGraph::wideFreezeDecode(int n) +{ + emit freezeDecode2(n); +} + +void WideGraph::setTol(int n) +{ + ui->widePlot->m_tol=n; + ui->widePlot->DrawOverlay(); + ui->widePlot->update(); +} + +int WideGraph::Tol() +{ + return ui->widePlot->m_tol; +} + +void WideGraph::setDF(int n) +{ + ui->widePlot->m_DF=n; + ui->widePlot->DrawOverlay(); + ui->widePlot->update(); +} + +void WideGraph::setFcal(int n) +{ + m_fCal=n; + ui->widePlot->setFcal(n); +} + +void WideGraph::setDecodeFinished() +{ + ui->widePlot->DecodeFinished(); +} + +int WideGraph::DF() +{ + return ui->widePlot->m_DF; +} + +void WideGraph::on_autoZeroPushButton_clicked() +{ + int nzero=ui->widePlot->autoZero(); + ui->zeroSpinBox->setValue(nzero); +} + +void WideGraph::setPalette(QString palette) +{ + ui->widePlot->setPalette(palette); +} +void WideGraph::setFsample(int n) +{ + m_fSample=n; + ui->widePlot->setFsample(n); +} + +void WideGraph::setMode65(int n) +{ + m_mode65=n; + ui->widePlot->setMode65(n); +} + +void WideGraph::on_cbFcenter_stateChanged(int n) +{ + m_bForceCenterFreq = (n!=0); + if(m_bForceCenterFreq) { + ui->fCenterLineEdit->setEnabled(true); + ui->pbSetRxHardware->setEnabled(true); + } else { + ui->fCenterLineEdit->setDisabled(true); + ui->pbSetRxHardware->setDisabled(true); + } +} + +void WideGraph::on_fCenterLineEdit_editingFinished() +{ + m_dForceCenterFreq=ui->fCenterLineEdit->text().toDouble(); +} + +void WideGraph::on_pbSetRxHardware_clicked() +{ + int iret=set570(m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::initIQplus() +{ + int iret=set570(288.0); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } else { + on_pbSetRxHardware_clicked(); + } +} + +void WideGraph::on_cbSpec2d_toggled(bool b) +{ + ui->widePlot->set2Dspec(b); +} + +double WideGraph::fGreen() +{ + return ui->widePlot->fGreen(); +} + +void WideGraph::setPeriod(int n) +{ + m_TRperiod=n; +} + +void WideGraph::on_cbLockTxRx_stateChanged(int n) +{ + m_bLockTxRx = (n!=0); + ui->widePlot->setLockTxRx(m_bLockTxRx); +} + +void WideGraph::rx570() +{ + double f=m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq; + int iret=set570(f); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::tx570() +{ + if(m_bForceCenterFreq) datcom_.fcenter=m_dForceCenterFreq; + m_bIQxt=true; + double f=ui->widePlot->txFreq(); +// double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * f; + double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * (f - m_TxOffset); + + int iret=set570(f1); + if(iret != 0) { + QMessageBox mb; + if(iret==-1) mb.setText("Failed to open Si570."); + if(iret==-2) mb.setText("Frequency out of permitted range."); + mb.exec(); + } +} + +void WideGraph::updateFreqLabel() +{ + auto rxFreq = QString {"%1"}.arg (ui->widePlot->rxFreq (), 10, 'f', 6); + auto txFreq = QString {"%1"}.arg (ui->widePlot->txFreq (), 10, 'f', 6); + rxFreq.insert (rxFreq.size () - 3, '.'); + txFreq.insert (txFreq.size () - 3, '.'); + ui->labFreq->setText (QString {"Rx: %1\nTx: %2"}.arg (rxFreq, txFreq)); +} + +void WideGraph::enableSetRxHardware(bool b) +{ + ui->pbSetRxHardware->setEnabled(b); +} diff --git a/q65w/widegraph.h b/q65w/widegraph.h new file mode 100644 index 000000000..1e330cfde --- /dev/null +++ b/q65w/widegraph.h @@ -0,0 +1,92 @@ +#ifndef WIDEGRAPH_H +#define WIDEGRAPH_H + +#include + +namespace Ui { + class WideGraph; +} + +class WideGraph : public QDialog +{ + Q_OBJECT + +public: + explicit WideGraph (QString const& settings_filename, QWidget * parent = nullptr); + ~WideGraph(); + + void dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, + uchar lstrong[]); + int QSOfreq(); + int nSpan(); + int nStartFreq(); + float fSpan(); + void saveSettings(); + void setDF(int n); + int DF(); + int Tol(); + void setTol(int n); + void setFcal(int n); + void setPalette(QString palette); + void setFsample(int n); + void setMode65(int n); + void setPeriod(int n); + void setDecodeFinished(); + double fGreen(); + void rx570(); + void tx570(); + void updateFreqLabel(); + void enableSetRxHardware(bool b); + + qint32 m_qsoFreq; + +signals: + void freezeDecode2(int n); + void f11f12(int n); + +public slots: + void wideFreezeDecode(int n); + void initIQplus(); + +protected: + virtual void keyPressEvent( QKeyEvent *e ); + void resizeEvent(QResizeEvent* event); + +private slots: + void on_waterfallAvgSpinBox_valueChanged(int arg1); + void on_freqSpanSpinBox_valueChanged(int arg1); + void on_freqOffsetSpinBox_valueChanged(int arg1); + void on_zeroSpinBox_valueChanged(int arg1); + void on_gainSpinBox_valueChanged(int arg1); + void on_autoZeroPushButton_clicked(); + void on_cbFcenter_stateChanged(int arg1); + void on_fCenterLineEdit_editingFinished(); + void on_pbSetRxHardware_clicked(); + void on_cbSpec2d_toggled(bool checked); + void on_cbLockTxRx_stateChanged(int arg1); + +private: + Ui::WideGraph * ui; + QString m_settings_filename; +public: + bool m_bForceCenterFreq; +private: + bool m_bLockTxRx; +public: + qint32 m_mult570; + qint32 m_mult570Tx; + double m_dForceCenterFreq; + double m_cal570; + double m_TxOffset; +private: + bool m_bIQxt; + qint32 m_waterfallAvg; + qint32 m_fCal; + qint32 m_fSample; + qint32 m_mode65; + qint32 m_TRperiod=60; +}; + +extern int set570(double freq_MHz); + +#endif // WIDEGRAPH_H diff --git a/q65w/widegraph.ui b/q65w/widegraph.ui new file mode 100644 index 000000000..38f90d47d --- /dev/null +++ b/q65w/widegraph.ui @@ -0,0 +1,340 @@ + + + WideGraph + + + + 0 + 0 + 1178 + 326 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + + 400 + 200 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + + + 940 + 230 + 211 + 41 + + + + + 12 + + + + QLabel { + background-color: rgba(0, 0, 0, 0); + color: yellow; +} + + + Rx: 144.118.200 +Tx: 144.127.317 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + kHz + + + Offset + + + -24 + + + 24 + + + 1 + + + 0 + + + + + + + + 0 + 0 + + + + + 60 + 0 + + + + + 16777215 + 16777215 + + + + kHz + + + Span + + + 5 + + + 90 + + + 5 + + + 60 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + N Avg + + + 1 + + + 20 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Gain + + + -20 + + + 20 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Zero + + + -100 + + + 100 + + + + + + + Auto Zero + + + + + + + 2D Spectrum + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Lock Tx=Rx Freq + + + + + + + Force Center Freq (MHz) + + + + + + + false + + + + 0 + 0 + + + + + 65 + 16777215 + + + + 1296.065 + + + + + + + false + + + Set Rx Freq + + + + + + + + + + + + CPlotter + QFrame +
plotter.h
+ 1 +
+
+ + +
diff --git a/q65w/wsjt.ico b/q65w/wsjt.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a55550f526add05720ee104c9e26cda6b73f1f0 GIT binary patch literal 1078 zcmd6mK~4iP3`O07gfxm!Z@{cjkHOJ$lvzhPMAnfH!IC4e8{T(jT2vLp61R!{{cUHG zIA#Ys+B~03@^LhKMW0RspATlw4`ye4GvkeMut#RIOzeHhkT5w9#f)jKHMEE|{ciTk(9aFe2=?xU=6L^jJgt zzhad$8?<kh^M-w2GCdAM zPlsa0j2>67|Eca(H-j(myhQlAi2(T0W@*QWdC i@T)H@Fx6NGOY-?*_Ws11 Date: Sun, 4 Dec 2022 14:00:28 -0500 Subject: [PATCH 011/251] Build either map65 or q65w, but not both. --- CMakeLists.txt | 3 +- CMakeLists.txt.0 | 1788 ---------------------------------------------- 2 files changed, 1 insertion(+), 1790 deletions(-) delete mode 100644 CMakeLists.txt.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index c6a14854e..201491ce0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1420,13 +1420,12 @@ else (${OPENMP_FOUND} OR APPLE) endif (${OPENMP_FOUND} OR APPLE) if (WIN32) - # build map65 find_package (Portaudio REQUIRED) +# build map65 OR q65w # add_subdirectory (map65) add_subdirectory (q65w) endif () - # build the main application generate_version_info (wsjtx_VERSION_RESOURCES NAME wsjtx diff --git a/CMakeLists.txt.0 b/CMakeLists.txt.0 deleted file mode 100644 index c47d51eca..000000000 --- a/CMakeLists.txt.0 +++ /dev/null @@ -1,1788 +0,0 @@ -cmake_minimum_required (VERSION 3.7.2 FATAL_ERROR) - -if (APPLE) - # - # The following variables define the portability and compatability attributes of the Mac macOS build - # they are choosen with care and should not be changed without good cause. - # - # Among other things these options are chosen to match the portability and compatability options of the - # Qt framework dylibs which can be checked as follows: - # - # otool -l | grep -A3 LC_VERSION_MIN_MACOSX - # - set (CMAKE_OSX_DEPLOYMENT_TARGET 10.12 - CACHE STRING "Earliest version of macOS supported - -Earliest version we can support with Qt 5.12, C++11 & libc++ is 10.12. -Do not override this if you intend to build an official deployable installer.") -endif (APPLE) - -# -# CMake policies -# -if (POLICY CMP0020) - cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows -endif () - -if (POLICY CMP0043) - cmake_policy (SET CMP0043 NEW) # ignore COMPILE_DEFINITIONS_ -endif () - -if (POLICY CMP0048) - cmake_policy (SET CMP0048 NEW) # clear PROJECT_Version_* variables if not set in project() command -endif () - -if (POLICY CMP0063) - cmake_policy (SET CMP0063 NEW) # honour visibility properties for all library types -endif () - -if (POLICY CMP0071) - cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources -endif () - -if (POLICY CMP0075) - cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks -endif () - -project (wsjtx - VERSION 2.6.0.0 - LANGUAGES C CXX Fortran - ) -set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") -set (CMAKE_PROJECT_DESCRIPTION ${PROJECT_DESCRIPTION}) - -# -# Local CMake modules and support files -# -set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) - -set (PROJECT_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") -if (NOT PROJECT_ARCHITECTURE) - # This is supposed to happen already on Windows - if (CMAKE_SIZEOF_VOID_P MATCHES 8) - set (PROJECT_ARCHITECTURE "x64") - else () - set (PROJECT_ARCHITECTURE "$ENV{PROCESSOR_ARCHITECTURE}") - endif () -endif () -message (STATUS "******************************************************") -message (STATUS "Building for for: ${CMAKE_SYSTEM_NAME}-${PROJECT_ARCHITECTURE}") -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 5) -set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") - -# -# project information -# -set (PROJECT_BUNDLE_NAME "WSJT-X") -set (PROJECT_VENDOR "Joe Taylor, K1JT") -set (PROJECT_CONTACT "Joe Taylor ") -set (PROJECT_COPYRIGHT "Copyright (C) 2001-2022 by Joe Taylor, K1JT") -set (PROJECT_HOMEPAGE https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html) -set (PROJECT_MANUAL wsjtx-main) -set (PROJECT_MANUAL_DIRECTORY_URL https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/) -set (PROJECT_SAMPLES_URL http://downloads.sourceforge.net/project/wsjt/) -set (PROJECT_SAMPLES_UPLOAD_DEST frs.sourceforge.net:/home/frs/project/wsjt/) - -# make sure that the default configuration is a RELEASE -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE RELEASE CACHE STRING - "Choose the type of build, options are: None Debug Release." - FORCE) -endif (NOT CMAKE_BUILD_TYPE) -if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") - set (is_debug_build 1) -endif () - - -# -# Options & features -# -# Some of these directly effect compilation by being defined in -# wsjtx_config.h.in which makes them available to the C/C++ -# pre-processor. -# -include (CMakeDependentOption) - -# Allow the developer to select if Dynamic or Static libraries are built -OPTION (BUILD_SHARED_LIBS "Build Shared Libraries" OFF) -# Set the LIB_TYPE variable to STATIC -SET (LIB_TYPE STATIC) -if (BUILD_SHARED_LIBS) - # User wants to build Dynamic Libraries, so change the LIB_TYPE variable to CMake keyword 'SHARED' - set (LIB_TYPE SHARED) -endif (BUILD_SHARED_LIBS) - -option (UPDATE_TRANSLATIONS "Update source translation translations/*.ts -files (WARNING: make clean will delete the source .ts files! Danger!)") -option (WSJT_SHARED_RUNTIME "Debugging option that allows running from a shared Cloud directory.") -option (WSJT_QDEBUG_TO_FILE "Redirect Qt debuging messages to a trace file.") -option (WSJT_SOFT_KEYING "Apply a ramp to CW keying envelope to reduce transients." ON) -option (WSJT_SKIP_MANPAGES "Skip *nix manpage generation.") -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 - "The wsjtx target is normally built as GUI executable with a WinMain entry point on Windows, -if you want a console application instead then set this option to OFF. - -If you just want to see the debug output from the application then the easiest way is to -attach a debugger which will then receive the console output inside its console." ON - "WIN32" OFF) - -# -# install locations -# - -if (APPLE) - set (CMAKE_INSTALL_BINDIR ${CMAKE_PROJECT_NAME}.app/Contents/MacOS) - set (CMAKE_INSTALL_DATAROOTDIR ${CMAKE_PROJECT_NAME}.app/Contents/Resources) -endif () - -include (GNUInstallDirs) - -set (PLUGIN_DESTINATION ${CMAKE_INSTALL_LIBDIR}/plugins) -set (QT_CONF_DESTINATION ${CMAKE_INSTALL_BINDIR}) -if (WIN32) - set (PLUGIN_DESTINATION plugins) -elseif (APPLE) - set (PLUGIN_DESTINATION ${CMAKE_INSTALL_BINDIR}/../PlugIns) - set (QT_CONF_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}) -endif () - -set (WSJT_PLUGIN_DESTINATION ${PLUGIN_DESTINATION} CACHE PATH "Path for plugins") -set (WSJT_QT_CONF_DESTINATION ${QT_CONF_DESTINATION} CACHE PATH "Path for the qt.conf file") - - -# -# Project sources -# -set (fort_qt_CXXSRCS - lib/shmem.cpp - ) - -set (wsjt_qt_CXXSRCS - helper_functions.cpp - qt_helpers.cpp - widgets/MessageBox.cpp - MetaDataRegistry.cpp - Network/NetworkServerLookup.cpp - revision_utils.cpp - L10nLoader.cpp - WFPalette.cpp - Radio.cpp - RadioMetaType.cpp - NonInheritingProcess.cpp - models/IARURegions.cpp - models/Bands.cpp - models/Modes.cpp - models/FrequencyList.cpp - models/StationList.cpp - widgets/FrequencyLineEdit.cpp - widgets/FrequencyDeltaLineEdit.cpp - item_delegates/CandidateKeyFilter.cpp - item_delegates/ForeignKeyDelegate.cpp - item_delegates/MessageItemDelegate.cpp - validators/LiveFrequencyValidator.cpp - GetUserId.cpp - Audio/AudioDevice.cpp - Transceiver/Transceiver.cpp - Transceiver/TransceiverBase.cpp - Transceiver/EmulateSplitTransceiver.cpp - Transceiver/TransceiverFactory.cpp - Transceiver/PollingTransceiver.cpp - Transceiver/HamlibTransceiver.cpp - Transceiver/HRDTransceiver.cpp - Transceiver/DXLabSuiteCommanderTransceiver.cpp - Network/NetworkMessage.cpp - Network/MessageClient.cpp - widgets/LettersSpinBox.cpp - widgets/HintedSpinBox.cpp - widgets/RestrictedSpinBox.cpp - widgets/HelpTextWindow.cpp - SampleDownloader.cpp - SampleDownloader/DirectoryDelegate.cpp - SampleDownloader/Directory.cpp - SampleDownloader/FileNode.cpp - SampleDownloader/RemoteFile.cpp - DisplayManual.cpp - MultiSettings.cpp - validators/MaidenheadLocatorValidator.cpp - validators/CallsignValidator.cpp - widgets/SplashScreen.cpp - EqualizationToolsDialog.cpp - widgets/DoubleClickablePushButton.cpp - widgets/DoubleClickableRadioButton.cpp - Network/LotWUsers.cpp - models/DecodeHighlightingModel.cpp - widgets/DecodeHighlightingListView.cpp - models/FoxLog.cpp - widgets/AbstractLogWindow.cpp - widgets/FoxLogWindow.cpp - widgets/CabrilloLogWindow.cpp - item_delegates/CallsignDelegate.cpp - item_delegates/MaidenheadLocatorDelegate.cpp - item_delegates/FrequencyDelegate.cpp - item_delegates/FrequencyDeltaDelegate.cpp - item_delegates/SQLiteDateTimeDelegate.cpp - models/CabrilloLog.cpp - logbook/AD1CCty.cpp - logbook/WorkedBefore.cpp - logbook/Multiplier.cpp - Network/NetworkAccessManager.cpp - widgets/LazyFillComboBox.cpp - widgets/CheckableItemComboBox.cpp - widgets/BandComboBox.cpp - ) - -set (wsjt_qtmm_CXXSRCS - Audio/BWFFile.cpp - ) - -set (jt9_FSRCS - lib/jt9.f90 - lib/jt9a.f90 - ) - -set (wsjtx_CXXSRCS - WSJTXLogging.cpp - logbook/logbook.cpp - Network/PSKReporter.cpp - Modulator/Modulator.cpp - Detector/Detector.cpp - widgets/logqso.cpp - widgets/displaytext.cpp - Decoder/decodedtext.cpp - getfile.cpp - Audio/soundout.cpp - Audio/soundin.cpp - widgets/meterwidget.cpp - widgets/signalmeter.cpp - widgets/plotter.cpp - widgets/widegraph.cpp - widgets/echograph.cpp - widgets/echoplot.cpp - widgets/fastgraph.cpp - widgets/fastplot.cpp - widgets/about.cpp - widgets/astro.cpp - widgets/messageaveraging.cpp - widgets/activeStations.cpp - widgets/colorhighlighting.cpp - WSPR/WsprTxScheduler.cpp - widgets/mainwindow.cpp - Configuration.cpp - main.cpp - Network/wsprnet.cpp - WSPR/WSPRBandHopping.cpp - widgets/ExportCabrillo.cpp - ) - -set (wsjt_CXXSRCS - Logger.cpp - lib/crc10.cpp - lib/crc13.cpp - lib/crc14.cpp - ) -# deal with a GCC v6 UB error message -set_source_files_properties ( - lib/crc10.cpp - lib/crc13.cpp - lib/crc14.cpp - PROPERTIES COMPILE_FLAGS -fpermissive) - -if (WIN32) - set (wsjt_CXXSRCS - ${wsjt_CXXSRCS} - killbyname.cpp - ) - - set (wsjt_qt_CXXSRCS - ${wsjt_qt_CXXSRCS} - Transceiver/OmniRigTransceiver.cpp - ) -endif (WIN32) - -set (wsjt_FSRCS - # put module sources first in the hope that they get rebuilt before use - lib/types.f90 - lib/C_interface_module.f90 - lib/shmem.f90 - lib/crc.f90 - lib/fftw3mod.f90 - lib/hashing.f90 - lib/iso_c_utilities.f90 - lib/jt4.f90 - lib/jt4_decode.f90 - lib/jt65_decode.f90 - lib/jt65_mod.f90 - lib/ft8_decode.f90 - lib/ft4_decode.f90 - lib/fst4_decode.f90 - lib/jt9_decode.f90 - lib/options.f90 - lib/packjt.f90 - lib/77bit/packjt77.f90 - lib/qra/q65/q65.f90 - lib/q65_decode.f90 - lib/readwav.f90 - lib/timer_C_wrapper.f90 - lib/timer_impl.f90 - lib/timer_module.f90 - lib/wavhdr.f90 - lib/qra/q65/q65_encoding_modules.f90 - lib/ft8/ft8_a7.f90 - - # remaining non-module sources - lib/addit.f90 - lib/afc65b.f90 - lib/afc9.f90 - lib/ana64.f90 - lib/ana932.f90 - lib/analytic.f90 - lib/astro.f90 - lib/astrosub.f90 - lib/astro0.f90 - lib/avecho.f90 - lib/averms.f90 - lib/azdist.f90 - lib/ft8/baseline.f90 - lib/ft4/ft4_baseline.f90 - lib/blanker.f90 - lib/bpdecode40.f90 - lib/bpdecode128_90.f90 - lib/ft8/bpdecode174_91.f90 - lib/baddata.f90 - lib/calibrate.f90 - lib/ccf2.f90 - lib/ccf65.f90 - lib/ft8/chkcrc13a.f90 - lib/ft8/chkcrc14a.f90 - lib/chkcall.f90 - lib/chkhist.f90 - lib/chkmsg.f90 - lib/chkss2.f90 - lib/ft4/clockit.f90 - lib/ft8/compress.f90 - lib/coord.f90 - lib/db.f90 - lib/decode4.f90 - lib/decode65a.f90 - lib/decode65b.f90 - lib/decode9w.f90 - lib/ft8/decode174_91.f90 - lib/decoder.f90 - lib/deep4.f90 - lib/deg2grid.f90 - lib/degrade_snr.f90 - lib/demod64a.f90 - lib/determ.f90 - lib/downsam9.f90 - lib/echosim.f90 - lib/echo_snr.f90 - lib/encode232.f90 - lib/encode4.f90 - lib/encode_msk40.f90 - lib/encode_128_90.f90 - lib/ft8/encode174_91.f90 - lib/ft8/encode174_91_nocrc.f90 - lib/entail.f90 - lib/ephem.f90 - lib/extract.f90 - lib/extract4.f90 - lib/extractmessage77.f90 - lib/fano232.f90 - lib/fast9.f90 - lib/fast_decode.f90 - lib/fchisq.f90 - lib/fchisq0.f90 - lib/fchisq65.f90 - lib/fil3.f90 - lib/fil3c.f90 - lib/fil4.f90 - lib/fil6521.f90 - lib/filbig.f90 - lib/ft8/filt8.f90 - lib/fitcal.f90 - lib/flat1.f90 - lib/flat1a.f90 - lib/flat1b.f90 - lib/flat2.f90 - lib/flat4.f90 - lib/flat65.f90 - lib/fmtmsg.f90 - lib/foldspec9f.f90 - lib/four2a.f90 - lib/fspread_lorentz.f90 - lib/ft8/foxfilt.f90 - lib/ft8/foxgen.f90 - lib/ft8/foxgen_wrap.f90 - lib/freqcal.f90 - lib/ft8/ft8apset.f90 - lib/ft8/ft8b.f90 - lib/ft8/ft8code.f90 - lib/ft8/ft8_downsample.f90 - lib/ft8/ft8sim.f90 - lib/gen4.f90 - lib/gen65.f90 - lib/gen9.f90 - lib/genwave.f90 - lib/ft8/genft8.f90 - lib/qra/q65/genq65.f90 - lib/genmsk_128_90.f90 - lib/genmsk40.f90 - lib/ft4/ft4code.f90 - lib/ft4/genft4.f90 - lib/ft4/gen_ft4wave.f90 - lib/ft8/gen_ft8wave.f90 - lib/ft8/genft8refsig.f90 - lib/genwspr.f90 - lib/geodist.f90 - lib/ft8/get_crc14.f90 - lib/getlags.f90 - lib/getmet4.f90 - lib/ft8/get_spectrum_baseline.f90 - lib/ft2/gfsk_pulse.f90 - lib/graycode.f90 - lib/graycode65.f90 - lib/grayline.f90 - lib/grid2deg.f90 - lib/ft8/h1.f90 - lib/hash.f90 - lib/hint65.f90 - lib/hspec.f90 - lib/indexx.f90 - lib/init_random_seed.f90 - lib/interleave4.f90 - lib/interleave63.f90 - lib/interleave9.f90 - lib/inter_wspr.f90 - lib/jplsubs.f - lib/jt9fano.f90 - lib/libration.f90 - lib/lorentzian.f90 - lib/fst4/lorentzian_fading.f90 - lib/lpf1.f90 - lib/map65_mmdec.f90 - lib/mixlpf.f90 - lib/makepings.f90 - lib/moondopjpl.f90 - lib/morse.f90 - lib/move.f90 - lib/msk40decodeframe.f90 - lib/msk144decodeframe.f90 - lib/msk40spd.f90 - lib/msk144spd.f90 - lib/msk40sync.f90 - lib/msk144sync.f90 - lib/msk40_freq_search.f90 - lib/msk144_freq_search.f90 - lib/mskrtd.f90 - lib/msk144signalquality.f90 - lib/msk144sim.f90 - lib/mskrtd.f90 - lib/nuttal_window.f90 - lib/ft4/ft4sim.f90 - lib/ft4/ft4sim_mult.f90 - lib/ft4/ft4_downsample.f90 - lib/77bit/my_hash.f90 - lib/wsprd/osdwspr.f90 - lib/ft8/osd174_91.f90 - lib/osd128_90.f90 - lib/pctile.f90 - lib/peakdt9.f90 - lib/peakup.f90 - lib/plotsave.f90 - lib/platanh.f90 - lib/pltanh.f90 - lib/polyfit.f90 - lib/prog_args.f90 - lib/ps4.f90 - lib/qra/q65/q65_ap.f90 - lib/qra/q65/q65_loops.f90 - lib/qra/q65/q65_set_list.f90 - lib/refspectrum.f90 - lib/savec2.f90 - lib/save_dxbase.f90 - lib/save_echo_params.f90 - lib/sec0.f90 - lib/sec_midn.f90 - lib/setup65.f90 - lib/sh65.f90 - lib/sh65snr.f90 - lib/slasubs.f - lib/sleep_msec.f90 - lib/slope.f90 - lib/smo.f90 - lib/smo121.f90 - lib/softsym.f90 - lib/softsym9f.f90 - lib/softsym9w.f90 - lib/shell.f90 - lib/spec64.f90 - lib/spec9f.f90 - lib/stdmsg.f90 - lib/subtract65.f90 - lib/ft8/subtractft8.f90 - lib/ft4/subtractft4.f90 - lib/sun.f90 - lib/symspec.f90 - lib/symspec2.f90 - lib/symspec65.f90 - lib/sync4.f90 - lib/sync65.f90 - lib/ft4/getcandidates4.f90 - lib/ft4/get_ft4_bitmetrics.f90 - lib/ft8/sync8.f90 - lib/ft8/sync8d.f90 - lib/ft4/sync4d.f90 - lib/sync9.f90 - lib/sync9f.f90 - lib/sync9w.f90 - lib/test_snr.f90 - lib/timf2.f90 - lib/tweak1.f90 - lib/twkfreq.f90 - lib/ft8/twkfreq1.f90 - lib/twkfreq65.f90 - lib/update_recent_calls.f90 - lib/update_msk40_hasharray.f90 - lib/ft8/watterson.f90 - lib/wav11.f90 - lib/wav12.f90 - lib/xcor.f90 - lib/xcor4.f90 - lib/wqdecode.f90 - lib/wqencode.f90 - lib/wspr_downsample.f90 - lib/zplot9.f90 - lib/fst4/decode240_101.f90 - lib/fst4/decode240_74.f90 - lib/fst4/encode240_101.f90 - lib/fst4/encode240_74.f90 - lib/fst4/fst4sim.f90 - lib/fst4/gen_fst4wave.f90 - lib/fst4/genfst4.f90 - lib/fst4/get_fst4_bitmetrics.f90 - lib/fst4/get_fst4_bitmetrics2.f90 - lib/fst4/ldpcsim240_101.f90 - lib/fst4/ldpcsim240_74.f90 - lib/fst4/osd240_101.f90 - lib/fst4/osd240_74.f90 - lib/fst4/fastosd240_74.f90 - lib/fst4/get_crc24.f90 - lib/fst4/fst4_baseline.f90 - ) - -# temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit -set_source_files_properties (lib/slasubs.f PROPERTIES COMPILE_FLAGS -O2) - -set (ka9q_CSRCS - lib/ftrsd/decode_rs.c - lib/ftrsd/encode_rs.c - lib/ftrsd/init_rs.c - ) -set_source_files_properties (${ka9q_CSRCS} PROPERTIES COMPILE_FLAGS -Wno-sign-compare) - -set (qra_CSRCS - lib/qra/qracodes/qra12_63_64_irr_b.c - lib/qra/qracodes/qra13_64_64_irr_e.c - lib/qra/q65/npfwht.c - lib/qra/q65/pdmath.c - lib/qra/q65/qracodes.c - lib/qra/q65/normrnd.c - lib/qra/q65/qra15_65_64_irr_e23.c - lib/qra/q65/q65.c - lib/qra/q65/q65_subs.c - ) - -set (wsjt_CSRCS - ${ka9q_CSRCS} - lib/ftrsd/ftrsdap.c - lib/sgran.c - lib/golay24_table.c - lib/gran.c - lib/igray.c - lib/init_random_seed.c - lib/ldpc32_table.c - lib/wsprd/nhash.c - lib/tab.c - lib/tmoonsub.c - lib/usleep.c - lib/vit213.c - lib/wisdom.c - lib/wrapkarn.c - ${ldpc_CSRCS} - ${qra_CSRCS} - ) - -set (wsjt_qt_UISRCS - wf_palette_design_dialog.ui - widgets/FoxLogWindow.ui - widgets/CabrilloLogWindow.ui - ) - -set (wsprsim_CSRCS - lib/wsprd/wsprsim.c - lib/wsprd/wsprsim_utils.c - lib/wsprd/wsprd_utils.c - lib/wsprd/fano.c - lib/wsprd/tab.c - lib/wsprd/nhash.c - ) - -set (wsprd_CSRCS - lib/wsprd/wsprd.c - lib/wsprd/wsprsim_utils.c - lib/wsprd/wsprd_utils.c - lib/wsprd/fano.c - lib/wsprd/jelinek.c - lib/wsprd/tab.c - lib/wsprd/nhash.c - lib/init_random_seed.c - ) - -set (wsjtx_UISRCS - widgets/mainwindow.ui - widgets/about.ui - widgets/astro.ui - widgets/colorhighlighting.ui - widgets/echograph.ui - widgets/fastgraph.ui - widgets/messageaveraging.ui - widgets/activeStations.ui - widgets/widegraph.ui - widgets/logqso.ui - Configuration.ui - widgets/ExportCabrillo.ui - ) - -set (UDP_library_CXXSRCS - Radio.cpp - RadioMetaType.cpp - Network/NetworkMessage.cpp - UDPExamples/MessageServer.cpp - ) - -set (UDP_library_HEADERS - Radio.hpp - UDPExamples/MessageServer.hpp - ${PROJECT_BINARY_DIR}/udp_export.h - ) - -set (message_aggregator_CXXSRCS - UDPExamples/MessageAggregator.cpp - UDPExamples/MessageAggregatorMainWindow.cpp - UDPExamples/DecodesModel.cpp - UDPExamples/BeaconsModel.cpp - UDPExamples/ClientWidget.cpp - validators/MaidenheadLocatorValidator.cpp - ) - -set (message_aggregator_STYLESHEETS - UDPExamples/qss/default.qss - ) - -set (qcp_CXXSRCS - qcustomplot-source/qcustomplot.cpp - ) - -set (all_CXXSRCS - ${wsjt_CXXSRCS} - ${fort_qt_CXXSRCS} - ${wsjt_qt_CXXSRCS} - ${wsjt_qtmm_CXXSRCS} - ${wsjtx_CXXSRCS} - ${qcp_CXXSRCS} - ) - -set (all_C_and_CXXSRCS - ${wsjt_CSRCS} - ${wsprsim_CSRCS} - ${wsprd_CSRCS} - ${all_CXXSRCS} - ) - -set (TOP_LEVEL_RESOURCES - icons/Darwin/wsjtx.iconset/icon_128x128.png - contrib/gpl-v3-logo.svg - artwork/splash.png - ) - -set (PALETTE_FILES - Palettes/Banana.pal - Palettes/Blue1.pal - Palettes/Blue2.pal - Palettes/Blue3.pal - Palettes/Brown.pal - Palettes/Cyan1.pal - Palettes/Cyan2.pal - Palettes/Cyan3.pal - Palettes/Default.pal - Palettes/Digipan.pal - Palettes/Fldigi.pal - Palettes/Gray1.pal - Palettes/Gray2.pal - Palettes/Green1.pal - Palettes/Green2.pal - Palettes/Jungle.pal - Palettes/Linrad.pal - Palettes/Negative.pal - Palettes/Orange.pal - Palettes/Pink.pal - Palettes/Rainbow.pal - Palettes/Scope.pal - Palettes/Sunburst.pal - Palettes/VK4BDJ.pal - Palettes/YL2KF.pal - Palettes/Yellow1.pal - Palettes/Yellow2.pal - Palettes/ZL1FZ.pal -) - -if (APPLE) - set (WSJTX_ICON_FILE ${CMAKE_PROJECT_NAME}.icns) - set (ICONSRCS - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_16x16@2x.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_32x32@2x.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_128x128@2x.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_256x256@2x.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512.png - icons/Darwin/${CMAKE_PROJECT_NAME}.iconset/icon_512x512@2x.png - ) - add_custom_command ( - OUTPUT ${WSJTX_ICON_FILE} - COMMAND iconutil -c icns --output "${CMAKE_BINARY_DIR}/${WSJTX_ICON_FILE}" "${CMAKE_SOURCE_DIR}/icons/Darwin/${CMAKE_PROJECT_NAME}.iconset" - DEPENDS ${ICONSRCS} - COMMENT "Building Icons" - ) -else () - set (WSJTX_ICON_FILE icons/windows-icons/wsjtx.ico) -endif (APPLE) - -set_source_files_properties (${WSJTX_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - -# suppress intransigent compiler diagnostics -set_source_files_properties (lib/decoder.f90 PROPERTIES COMPILE_FLAGS "-Wno-unused-dummy-argument") -set_source_files_properties (lib/filbig.f90 PROPERTIES COMPILE_FLAGS "-Wno-aliasing") - -## disable Qt trace and warning messages from release configurations -#set_property (DIRECTORY APPEND PROPERTY -# COMPILE_DEFINITIONS $<$>:QT_NO_DEBUG_OUTPUT;QT_NO_WARNING_OUTPUT> -# ) - -set_property (SOURCE ${all_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") -set_property (SOURCE ${all_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h) - -if (WIN32) - # generate the OmniRig COM interface source - find_program (DUMPCPP dumpcpp) - if (DUMPCPP-NOTFOUND) - message (FATAL_ERROR "dumpcpp tool not found") - endif (DUMPCPP-NOTFOUND) - execute_process ( - COMMAND ${DUMPCPP} -getfile {4FE359C5-A58F-459D-BE95-CA559FB4F270} - OUTPUT_VARIABLE AXSERVER - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - string (STRIP "${AXSERVER}" AXSERVER) - if (NOT AXSERVER) - message (FATAL_ERROR "You need to install OmniRig on this computer") - endif (NOT AXSERVER) - string (REPLACE "\"" "" AXSERVER ${AXSERVER}) - file (TO_CMAKE_PATH ${AXSERVER} AXSERVERSRCS) -endif () - - -# -# decide on platform specifc packing and fixing up -# -if (APPLE) - set (WSJTX_BUNDLE_VERSION ${wsjtx_VERSION}) - - # make sure CMAKE_INSTALL_PREFIX ends in / - string (LENGTH "${CMAKE_INSTALL_PREFIX}" LEN) - math (EXPR LEN "${LEN} -1" ) - string (SUBSTRING "${CMAKE_INSTALL_PREFIX}" ${LEN} 1 ENDCH) - if (NOT "${ENDCH}" STREQUAL "/") - set (CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/") - endif () -endif (APPLE) - - -# -# find some useful tools -# -include (CheckTypeSize) -include (CheckCSourceCompiles) -include (CheckIncludeFiles) -include (CheckSymbolExists) -include (generate_version_info) - -find_program(CTAGS ctags) -find_program(ETAGS etags) - -# -# Platform checks -# -check_include_files ("stdlib.h;stdarg.h;string.h;float.h" STDC_HEADERS) -check_include_files (stdio.h HAVE_STDIO_H) -check_include_files (stdlib.h HAVE_STDLIB_H) -check_include_files (unistd.h HAVE_UNISTD_H) -check_include_files (sys/ioctl.h HAVE_SYS_IOCTL_H) -check_include_files (sys/types.h HAVE_SYS_TYPES_H) -check_include_files (fcntl.h HAVE_FCNTL_H) -check_include_files (sys/stat.h HAVE_SYS_STAT_H) -check_include_files ("linux/ppdev.h;linux/parport.h" HAVE_LINUX_PPDEV_H) -check_include_files ("dev/ppbus/ppi.h;dev/ppbus/ppbconf.h" HAVE_DEV_PPBUS_PPI_H) - -# -# Standard C Math Library -# -set (LIBM_TEST_SOURCE "#include\nfloat f; int main(){sqrt(f);return 0;}") -check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_MATH) -if (HAVE_MATH) - set (LIBM_LIBRARIES) -else () - set (CMAKE_REQUIRED_LIBRARIES m) - check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_LIBM_MATH) - unset (CMAKE_REQUIRED_LIBRARIES) - if (NOT HAVE_LIBM_MATH) - message (FATAL_ERROR "Unable to use C math library functions") - endif () - set (LIBM_LIBRARIES m) -endif () - -# -# Boost -# -if (WIN32) - set (Boost_USE_STATIC_LIBS OFF) -endif () -find_package (Boost 1.62 REQUIRED COMPONENTS log_setup log) - -# -# OpenMP -# -find_package (OpenMP) - -# -# fftw3 single precision library -# -find_package (FFTW3 COMPONENTS single threads REQUIRED) - -# -# hamlib setup -# -find_package (Hamlib REQUIRED) -find_program (RIGCTL_EXE rigctl) -find_program (RIGCTLD_EXE rigctld) -find_program (RIGCTLCOM_EXE rigctlcom) - -check_type_size (CACHE_ALL HAMLIB_OLD_CACHING) -check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING) - -find_package (Usb REQUIRED) - -# -# Qt5 setup -# - -# Widgets finds its own dependencies. -find_package (Qt5 COMPONENTS Widgets SerialPort Multimedia PrintSupport Sql LinguistTools REQUIRED) - -if (WIN32) - add_definitions (-DQT_NEEDS_QTMAIN) - find_package (Qt5AxContainer REQUIRED) -endif (WIN32) - -# -# Library building setup -# -include (GenerateExportHeader) -set (CMAKE_CXX_VISIBILITY_PRESET hidden) -set (CMAKE_C_VISIBILITY_PRESET hidden) -set (CMAKE_Fortran_VISIBILITY_PRESET hidden) -set (CMAKE_VISIBILITY_INLINES_HIDDEN ON) -#set (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON) - - -# -# C & C++ setup -# -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra -fexceptions -frtti") - -if (NOT APPLE) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pragmas") - if (${OPENMP_FOUND}) - if (OpenMP_C_FLAGS) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_C_FLAGS}") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - endif () - endif () - set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -fdata-sections -ffunction-sections") - set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") - set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -fdata-sections -ffunction-sections") - set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -fdata-sections -ffunction-sections") -endif (NOT APPLE) - -if (WIN32) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") -endif (WIN32) -if (APPLE AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") -else () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=gnu++11 -pthread") -endif () - - -# -# Fortran setup -# -set (General_FFLAGS "-Wall -Wno-conversion -fno-second-underscore") - -# FFLAGS depend on the compiler -get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) - -if (Fortran_COMPILER_NAME MATCHES "gfortran.*") - # gfortran - - # CMake compiler test is supposed to do this but doesn't yet - if (CMAKE_OSX_DEPLOYMENT_TARGET) - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - endif (CMAKE_OSX_DEPLOYMENT_TARGET) - if (CMAKE_OSX_SYSROOT) - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}") - endif (CMAKE_OSX_SYSROOT) - - set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") - -set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") - - # FPE traps currently disabled in Debug configuration builds until - # we decide if they are meaningful, without these FP instructions - # run in nonstop mode and do not trap - #set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} ${CMAKE_Fortran_FLAGS_DEBUG} -ffpe-trap=invalid,zero,overflow") - -elseif (Fortran_COMPILER_NAME MATCHES "ifort.*") - # ifort (untested) - set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -f77rtl ${General_FFLAGS}") - set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -f77rtl ${General_FFLAGS}") -elseif (Fortran_COMPILER_NAME MATCHES "g77") - # g77 - set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -funroll-all-loops -fno-f2c -m32 ${General_FFLAGS}") - set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check -fno-f2c -m32 ${General_FFLAGS}") -else (Fortran_COMPILER_NAME MATCHES "gfortran.*") - message ("CMAKE_Fortran_COMPILER full path: " ${CMAKE_Fortran_COMPILER}) - message ("Fortran compiler: " ${Fortran_COMPILER_NAME}) - message ("No optimized Fortran compiler flags are known, we just try -O3...") - set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -O3 ${General_FFLAGS}") - set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -fbounds-check ${General_FFLAGS}") -endif (Fortran_COMPILER_NAME MATCHES "gfortran.*") - - -# -# Linker setup -# -if (NOT APPLE) - set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -Wl,--gc-sections") - set (CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} -Wl,--gc-sections") -endif (NOT APPLE) - - -# -# setup and test Fortran C/C++ interaction -# - -include (FortranCInterface) -FortranCInterface_VERIFY (CXX) -FortranCInterface_HEADER (FC.h MACRO_NAMESPACE "FC_" SYMBOL_NAMESPACE "FC_" - SYMBOLS - grayline - ) - - -# -# sort out pre-requisites -# - -# -# Setup RPATH so that built executable targets will run in both the -# build tree and the install location without having to set a -# (DYLD|LD)_LIBRARY_PATH override. -# - -# use the full RPATH of the build tree -set (CMAKE_SKIP_BUILD_RPATH FALSE) - -# when building, don't use the install RPATH, it will still be used -# later on in the install phase -set (CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) - -# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") - -# add the automaticaly determined parts of the RPATH which point to -# directories outside of the build tree to the install RPATH -set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - -# the RPATH to be used when installing, but only if it's not a system -# directory -# list (FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" isSystemDir) -# if ("${isSystemDir}" STREQUAL "-1") -# set (CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") -# endif ("${isSystemDir}" STREQUAL "-1") - -set (QT_NEED_RPATH FALSE) -if (NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/lib64" AND NOT "${QT_LIBRARY_DIR}" STREQUAL "/usr/lib64") - set (QT_NEED_RPATH TRUE) -endif () - -# -# stuff only qmake can tell us -# -get_target_property (QMAKE_EXECUTABLE Qt5::qmake LOCATION) -get_target_property (LCONVERT_EXECUTABLE Qt5::lconvert LOCATION) -function (QUERY_QMAKE VAR RESULT) - exec_program (${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output) - if (NOT return_code) - file (TO_CMAKE_PATH "${output}" output) - set (${RESULT} ${output} PARENT_SCOPE) - endif (NOT return_code) - message (STATUS "Asking qmake for ${RESULT} and got ${output}") -endfunction (QUERY_QMAKE) - -query_qmake (QT_INSTALL_PLUGINS QT_PLUGINS_DIR) -query_qmake (QT_INSTALL_TRANSLATIONS QT_TRANSLATIONS_DIR) -query_qmake (QT_INSTALL_IMPORTS QT_IMPORTS_DIR) -query_qmake (QT_HOST_DATA QT_DATA_DIR) -set (QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) - -# project definitions -add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1 -DBOOST_ALL_DYN_LINK) -if (CMAKE_HOST_UNIX) - add_definitions (-DUNIX) -elseif (CMAKE_HOST_WIN32) - add_definitions (-DWIN32) -endif () - -# -# sub-directories -# -if (EXISTS ${CMAKE_SOURCE_DIR}/samples AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/samples) - add_subdirectory (samples) -endif () -if (WSJT_GENERATE_DOCS) - add_subdirectory (doc) -endif (WSJT_GENERATE_DOCS) -if (EXISTS ${CMAKE_SOURCE_DIR}/tests AND IS_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) - add_subdirectory (tests) -endif () - -# build a library of package functionality (without and optionally with OpenMP support) -add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) -target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES} Boost::log_setup ${LIBM_LIBRARIES}) - -# build an OpenMP variant of the Fortran library routines -add_library (wsjt_fort STATIC ${wsjt_FSRCS}) -target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES}) -if (${OPENMP_FOUND} OR APPLE) - add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS}) - target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES}) - if (OpenMP_C_FLAGS AND NOT APPLE) - set_target_properties (wsjt_fort_omp - PROPERTIES - COMPILE_FLAGS "${OpenMP_C_FLAGS}" - ) - endif () - set_target_properties (wsjt_fort_omp - PROPERTIES - Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp - ) - file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp) - if (APPLE) - # On Mac we don't have working OpenMP support in the C/C++ - # compilers so we have to manually set the correct flags to get - # OpenMP support in jt9. - target_compile_options (wsjt_fort_omp - PRIVATE - $<$:-fopenmp> # assumes GNU style Fortran compiler - ) - endif (APPLE) -endif (${OPENMP_FOUND} OR APPLE) - -if(WSJT_BUILD_UTILS) - -add_executable (jt4sim lib/jt4sim.f90) -target_link_libraries (jt4sim wsjt_fort wsjt_cxx) - -add_executable (jt65sim lib/jt65sim.f90) -target_link_libraries (jt65sim wsjt_fort wsjt_cxx) - -add_executable (sumsim lib/sumsim.f90) -target_link_libraries (sumsim wsjt_fort wsjt_cxx) - -add_executable (test_snr lib/test_snr.f90) -target_link_libraries (test_snr wsjt_fort) - -add_executable (q65sim lib/qra/q65/q65sim.f90) -target_link_libraries (q65sim wsjt_fort wsjt_cxx) - -add_executable (q65code lib/qra/q65/q65code.f90) -target_link_libraries (q65code wsjt_fort wsjt_cxx) - -add_executable (test_q65 lib/test_q65.f90) -target_link_libraries (test_q65 wsjt_fort wsjt_cxx) - -add_executable (q65_ftn_test lib/qra/q65/q65_ftn_test.f90) -target_link_libraries (q65_ftn_test wsjt_fort wsjt_cxx) - -add_executable (jt49sim lib/jt49sim.f90) -target_link_libraries (jt49sim wsjt_fort wsjt_cxx) - -#add_executable (allsim lib/allsim.f90) -#target_link_libraries (allsim wsjt_fort wsjt_cxx) - -add_executable (rtty_spec lib/rtty_spec.f90) -target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) - -add_executable (jt65code lib/jt65code.f90) -target_link_libraries (jt65code wsjt_fort wsjt_cxx) - -add_executable (jt9code lib/jt9code.f90) -target_link_libraries (jt9code wsjt_fort wsjt_cxx) - -add_executable (wsprcode lib/wsprcode/wsprcode.f90 lib/wsprcode/nhash.c) -target_link_libraries (wsprcode wsjt_fort wsjt_cxx) - -add_executable (encode77 lib/77bit/encode77.f90) -target_link_libraries (encode77 wsjt_fort wsjt_cxx) - -add_executable (wsprsim ${wsprsim_CSRCS}) -target_link_libraries (wsprsim ${LIBM_LIBRARIES}) - -add_executable (jt4code lib/jt4code.f90) -target_link_libraries (jt4code wsjt_fort wsjt_cxx) - -add_executable (msk144code lib/msk144code.f90) -target_link_libraries (msk144code wsjt_fort wsjt_cxx) - -add_executable (ft8code lib/ft8/ft8code.f90) -target_link_libraries (ft8code wsjt_fort wsjt_cxx) - -add_executable (ft4code lib/ft4/ft4code.f90) -target_link_libraries (ft4code wsjt_fort wsjt_cxx) - -add_executable (echosim lib/echosim.f90) -target_link_libraries (echosim wsjt_fort wsjt_cxx) - -add_executable (ft8sim lib/ft8/ft8sim.f90) -target_link_libraries (ft8sim wsjt_fort wsjt_cxx) - -add_executable (msk144sim lib/msk144sim.f90) -target_link_libraries (msk144sim wsjt_fort wsjt_cxx) - -add_executable (ft4sim lib/ft4/ft4sim.f90) -target_link_libraries (ft4sim wsjt_fort wsjt_cxx) - -add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90) -target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) - -add_executable (fst4sim lib/fst4/fst4sim.f90) -target_link_libraries (fst4sim wsjt_fort wsjt_cxx) -if (WIN32) - set_target_properties (fst4sim PROPERTIES - LINK_FLAGS -Wl,--stack,0x4000000,--heap,0x6000000 - ) -endif () - -add_executable (ldpcsim240_101 lib/fst4/ldpcsim240_101.f90) -target_link_libraries (ldpcsim240_101 wsjt_fort wsjt_cxx) - -add_executable (ldpcsim240_74 lib/fst4/ldpcsim240_74.f90) -target_link_libraries (ldpcsim240_74 wsjt_fort wsjt_cxx) - -endif(WSJT_BUILD_UTILS) - -add_executable (fmtave lib/fmtave.f90) - -add_executable (fcal lib/fcal.f90) - -add_executable (fmeasure lib/fmeasure.f90) - -# build the wsprd WSPR mode decoder driver -generate_version_info (wsprd_VERSION_RESOURCES - NAME wsprd - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - FILE_DESCRIPTION "WSPR mode decoder" - ) -add_executable (wsprd ${wsprd_CSRCS} lib/indexx.f90 lib/wsprd/osdwspr.f90 ${wsprd_VERSION_RESOURCES}) -target_include_directories (wsprd PRIVATE ${FFTW3_INCLUDE_DIRS}) -target_link_libraries (wsprd ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) - -# Tell CMake to run moc when necessary -set (CMAKE_AUTOMOC ON) -include_directories (${CMAKE_CURRENT_BINARY_DIR}) - -# don't use Qt "keywords" signal, slot, emit in generated files to -# avoid compatability issue with other libraries -# ADD_DEFINITIONS (-DQT_NO_KEYWORDS) -# ADD_DEFINITIONS (-DUNICODE) #as per qmake - -# As moc files are generated in the binary dir, tell CMake to always -# look for includes there: -set (CMAKE_INCLUDE_CURRENT_DIR ON) - -# -# source navigation -# -set (sources - ${CMAKE_SOURCE_DIR}/* - ${CMAKE_SOURCE_DIR}/logbook/* - ${CMAKE_SOURCE_DIR}/lib/* - ) -add_custom_target (ctags COMMAND ${CTAGS} -o ${CMAKE_SOURCE_DIR}/tags -R ${sources}) -add_custom_target (etags COMMAND ${ETAGS} -o ${CMAKE_SOURCE_DIR}/TAGS -R ${sources}) - - -# Qt i18n - always include the country generic if any regional variant is included -set (LANGUAGES - ca # Catalan - da # Danish - en # English (we need this to stop - # translation loaders loading the - # second preference UI languge, it - # doesn't need to be populated) - en_GB # English UK - es # Spanish - it # Italian - ja # Japanese - #no # Norwegian - #pt # Portuguese - ru # Russian - #sv # Swedish - zh # Chinese - zh_HK # Chinese per Hong Kong - zh_TW # Chinese traditional - it # Italian - ) -foreach (lang_ ${LANGUAGES}) - file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/translations/wsjtx_${lang_}.ts ts_) - list (APPEND TS_FILES ${ts_}) - set (qt_translations_ "${QT_TRANSLATIONS_DIR}/qtbase_${lang_}.qm") - if (EXISTS "${qt_translations_}") - add_custom_command ( - OUTPUT "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" - COMMAND ${LCONVERT_EXECUTABLE} -o "${CMAKE_BINARY_DIR}/qt_${lang_}.qm" ${qt_translations_} - COMMENT "Building required Qt translations for language ${lang_}" - ) - list (APPEND QM_FILES "${CMAKE_BINARY_DIR}/qt_${lang_}.qm") - endif () -endforeach () -if (UPDATE_TRANSLATIONS) - message (STATUS "UPDATE_TRANSLATIONS option is set.") - qt5_create_translation ( - QM_FILES ${wsjt_qt_UISRCS} ${wsjtx_UISRCS} ${wsjt_qt_CXXSRCS} ${wsjtx_CXXSRCS} - ${TS_FILES} - OPTIONS -I${CMAKE_CURRENT_SOURCE_DIR} - ) -else () - qt5_add_translation (QM_FILES ${TS_FILES}) -endif () -add_custom_target (translations DEPENDS ${QM_FILES}) -set_property (DIRECTORY PROPERTY CLEAN_NO_CUSTOM TRUE) - -# embedded resources -function (add_resources resources path) - foreach (resource_file_ ${ARGN}) - get_filename_component (name_ ${resource_file_} NAME) - if (IS_ABSOLUTE "${resource_file_}") - file (TO_NATIVE_PATH ${resource_file_} source_) - else () - file (TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${resource_file_} source_) - endif () - file (TO_NATIVE_PATH ${path}/${name_} dest_) - set (resources_ "${resources_}\n ${source_}") - set (${resources} ${${resources}}${resources_} PARENT_SCOPE) - endforeach (resource_file_ ${ARGN}) -endfunction (add_resources resources path) - -add_resources (wsjtx_RESOURCES "" ${TOP_LEVEL_RESOURCES}) -add_resources (wsjtx_RESOURCES /Palettes ${PALETTE_FILES}) -add_resources (wsjtx_RESOURCES /Translations ${QM_FILES}) - -configure_file (wsjtx.qrc.in wsjtx.qrc @ONLY) - -# UI generation -qt5_wrap_ui (wsjt_qt_GENUISRCS ${wsjt_qt_UISRCS}) -qt5_wrap_ui (wsjtx_GENUISRCS ${wsjtx_UISRCS}) - -# Resource generation -qt5_add_resources (wsjtx_RESOURCES_RCC - ${CMAKE_BINARY_DIR}/wsjtx.qrc - contrib/QDarkStyleSheet/qdarkstyle/style.qrc - ) - -# AX COM servers -if (WIN32) - include (QtAxMacros) - wrap_ax_server (GENAXSRCS ${AXSERVERSRCS}) -endif (WIN32) - -# -# targets dependent on Qt -# - -# build a library for the QCustomPlot widget -add_library (qcp STATIC ${qcp_CXXSRCS}) -target_include_directories (qcp PUBLIC $) -target_link_libraries (qcp Qt5::Widgets Qt5::PrintSupport) - -# build a library of package Qt functionality -add_library (wsjt_qt STATIC ${wsjt_qt_CXXSRCS} ${wsjt_qt_GENUISRCS} ${GENAXSRCS}) -# set wsjtx_udp exports to static variants -target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE) -target_link_libraries (wsjt_qt Hamlib::Hamlib Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql) -if (WIN32) - target_link_libraries (wsjt_qt Qt5::AxContainer Qt5::AxBase) -endif (WIN32) - -# build a library of package Qt functionality used in Fortran utilities -add_library (fort_qt STATIC ${fort_qt_CXXSRCS}) -target_link_libraries (fort_qt Qt5::Core) - -# build a library of WSJT Qt multimedia components -add_library (wsjt_qtmm STATIC ${wsjt_qtmm_CXXSRCS} ${wsjt_qtmm_GENUISRCS}) -target_link_libraries (wsjt_qtmm Qt5::Multimedia) - -# build the jt9 slow mode decoder driver -generate_version_info (jt9_VERSION_RESOURCES - NAME jt9 - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - FILE_DESCRIPTION "jt9 - WSJT-X slow mode decoder" - ) - -add_executable (record_time_signal Audio/tools/record_time_signal.cpp) -target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) - -add_executable (jt9 ${jt9_FSRCS} ${jt9_VERSION_RESOURCES}) -if (${OPENMP_FOUND} OR APPLE) - if (APPLE) - # On Mac we don't have working OpenMP support in the C/C++ - # compilers so we have to manually set the correct linking flags - # and libraries to get OpenMP support in jt9. - set_target_properties (jt9 - PROPERTIES - Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp - LINK_LIBRARIES "gomp;gcc_s.1" # assume GNU libgcc OpenMP - ) - target_compile_options (jt9 - PRIVATE - $<$:-fopenmp> # assumes GNU style Fortran compiler - ) - else (APPLE) - if (OpenMP_C_FLAGS) - set_target_properties (jt9 - PROPERTIES - COMPILE_FLAGS "${OpenMP_C_FLAGS}" - LINK_FLAGS "${OpenMP_C_FLAGS}" - ) - endif () - set_target_properties (jt9 - PROPERTIES - Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp - ) - endif (APPLE) - if (WIN32) - set_target_properties (jt9 PROPERTIES - LINK_FLAGS -Wl,--stack,16777216 - ) - endif () - target_link_libraries (jt9 wsjt_fort_omp wsjt_cxx fort_qt) -else (${OPENMP_FOUND} OR APPLE) - target_link_libraries (jt9 wsjt_fort wsjt_cxx fort_qt) -endif (${OPENMP_FOUND} OR APPLE) - -if (WIN32) - # build map65 - find_package (Portaudio REQUIRED) - add_subdirectory (map65) -endif () - -# build the main application -generate_version_info (wsjtx_VERSION_RESOURCES - NAME wsjtx - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - ) - -add_executable (wsjtx MACOSX_BUNDLE - ${wsjtx_CXXSRCS} - ${wsjtx_GENUISRCS} - ${WSJTX_ICON_FILE} - ${wsjtx_RESOURCES_RCC} - ${wsjtx_VERSION_RESOURCES} - ) - -if (WSJT_CREATE_WINMAIN) - set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON) -endif (WSJT_CREATE_WINMAIN) - -set_target_properties (wsjtx PROPERTIES - MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" - MACOSX_BUNDLE_INFO_STRING "${PROJECT_DESCRIPTION}" - MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" - MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} - MACOSX_BUNDLE_SHORT_VERSION_STRING "v${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" - MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${SCS_VERSION_STR}" - MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_BUNDLE_NAME}" - MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" - MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" - MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx" - ) - -target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) -if ((NOT ${OPENMP_FOUND}) OR APPLE) - target_link_libraries (wsjtx wsjt_fort) -else () - target_link_libraries (wsjtx wsjt_fort_omp) - if (OpenMP_C_FLAGS) - set_target_properties (wsjtx PROPERTIES - COMPILE_FLAGS "${OpenMP_C_FLAGS}" - LINK_FLAGS "${OpenMP_C_FLAGS}" - ) - endif () - set_target_properties (wsjtx PROPERTIES - Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp - ) - if (WIN32) - set_target_properties (wsjtx PROPERTIES - LINK_FLAGS -Wl,--stack,0x1000000,--heap,0x20000000 - ) - endif () -endif () -target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) - -# make a library for WSJT-X UDP servers -# add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) -add_library (wsjtx_udp-static STATIC ${UDP_library_CXXSRCS}) -#target_include_directories (wsjtx_udp -# INTERFACE -# $ -# ) -target_include_directories (wsjtx_udp-static - INTERFACE - $ - ) -#set_target_properties (wsjtx_udp PROPERTIES -# PUBLIC_HEADER "${UDP_library_HEADERS}" -# ) -set_target_properties (wsjtx_udp-static PROPERTIES - OUTPUT_NAME wsjtx_udp - ) -target_compile_definitions (wsjtx_udp-static PUBLIC UDP_STATIC_DEFINE) -target_link_libraries (wsjtx_udp-static Qt5::Network Qt5::Gui) -generate_export_header (wsjtx_udp-static BASE_NAME udp) - -generate_version_info (udp_daemon_VERSION_RESOURCES - NAME udp_daemon - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol daemon" - ) -add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) -target_link_libraries (udp_daemon wsjtx_udp-static) - -generate_version_info (wsjtx_app_version_VERSION_RESOURCES - NAME wsjtx_app_version - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - FILE_DESCRIPTION "Display WSJT-X Application Version on console" - ) -add_executable (wsjtx_app_version AppVersion/AppVersion.cpp ${wsjtx_app_version_VERSION_RESOURCES}) -target_link_libraries (wsjtx_app_version wsjt_qt) - -generate_version_info (message_aggregator_VERSION_RESOURCES - NAME message_aggregator - BUNDLE ${PROJECT_BUNDLE_NAME} - ICON ${WSJTX_ICON_FILE} - FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol application" - ) -add_resources (message_aggregator_RESOURCES /qss ${message_aggregator_STYLESHEETS}) -configure_file (UDPExamples/message_aggregator.qrc.in message_aggregator.qrc @ONLY) -qt5_add_resources (message_aggregator_RESOURCES_RCC - ${CMAKE_CURRENT_BINARY_DIR}/message_aggregator.qrc - contrib/QDarkStyleSheet/qdarkstyle/style.qrc - ) -add_executable (message_aggregator - ${message_aggregator_CXXSRCS} - ${message_aggregator_RESOURCES_RCC} - ${message_aggregator_VERSION_RESOURCES} - ) -target_link_libraries (message_aggregator wsjt_qt Qt5::Widgets wsjtx_udp-static) - -if (WSJT_CREATE_WINMAIN) - set_target_properties (message_aggregator PROPERTIES WIN32_EXECUTABLE ON) -endif (WSJT_CREATE_WINMAIN) - -if (UNIX) - if (NOT WSJT_SKIP_MANPAGES) - add_subdirectory (manpages) - add_dependencies (wsjtx manpages) - endif (NOT WSJT_SKIP_MANPAGES) - if (NOT APPLE) - add_subdirectory (debian) - add_dependencies (wsjtx debian) - endif (NOT APPLE) -endif (UNIX) - -# -# installation -# -install (TARGETS wsjtx - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - BUNDLE DESTINATION . COMPONENT runtime - ) - -# install (TARGETS wsjtx_udp EXPORT udp -# RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -# LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} -# ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -# PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wsjtx -# ) -# install (TARGETS wsjtx_udp-static EXPORT udp-static -# DESTINATION ${CMAKE_INSTALL_LIBDIR} -# ) - -# install (EXPORT udp NAMESPACE wsjtx:: -# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx -# ) -# install (EXPORT udp-static NAMESPACE wsjtx:: -# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx -# ) - -install (TARGETS udp_daemon message_aggregator wsjtx_app_version - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - ) - -install (TARGETS jt9 wsprd fmtave fcal fmeasure - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - ) - -if(WSJT_BUILD_UTILS) -install (TARGETS ft8code jt65code jt9code jt4code msk144code - q65code fst4sim q65sim echosim - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - ) -endif(WSJT_BUILD_UTILS) - -install (PROGRAMS - ${RIGCTL_EXE} - DESTINATION ${CMAKE_INSTALL_BINDIR} - #COMPONENT runtime - RENAME rigctl-wsjtx${CMAKE_EXECUTABLE_SUFFIX} - ) - -install (PROGRAMS - ${RIGCTLD_EXE} - DESTINATION ${CMAKE_INSTALL_BINDIR} - #COMPONENT runtime - RENAME rigctld-wsjtx${CMAKE_EXECUTABLE_SUFFIX} - ) - -install (PROGRAMS - ${RIGCTLCOM_EXE} - DESTINATION ${CMAKE_INSTALL_BINDIR} - #COMPONENT runtime - RENAME rigctlcom-wsjtx${CMAKE_EXECUTABLE_SUFFIX} - ) - -install (FILES - README - COPYING - AUTHORS - THANKS - NEWS - BUGS - DESTINATION ${CMAKE_INSTALL_DOCDIR} - #COMPONENT runtime - ) - -install (FILES - cty.dat - cty.dat_copyright.txt - contrib/Ephemeris/JPLEPH - DESTINATION ${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME} - #COMPONENT runtime - ) - -install (DIRECTORY - example_log_configurations - DESTINATION ${CMAKE_INSTALL_DOCDIR} - FILES_MATCHING REGEX "^.*[^~]$" - #COMPONENT runtime - ) - -# -# Mac installer files -# -if (APPLE) - install (FILES - Darwin/ReadMe.txt - Darwin/com.wsjtx.sysctl.plist - DESTINATION . - #COMPONENT runtime - ) -endif (APPLE) - - -# -# uninstall support -# -configure_file ( - "${CMAKE_CURRENT_SOURCE_DIR}/CMake/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - @ONLY) -add_custom_target (uninstall - "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") - - -# creates or updates ${PROJECT_BINARY_DIR}/scs_version.h using cmake script -add_custom_target (revisiontag - COMMAND ${CMAKE_COMMAND} - -D SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} - -D BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} - -D OUTPUT_DIR=${PROJECT_BINARY_DIR} - -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake - VERBATIM - BYPRODUCTS scs_version.h - COMMENT "Getting source control system revision information" - ) -# explicitly say that the wsjt_qt depends on custom target, this is -# done indirectly so that the revisiontag target gets built exactly -# once per build -add_dependencies (wsjt_qt revisiontag) -add_dependencies (jt9 revisiontag) -add_dependencies (wsprd revisiontag) - - -# -# versioning and configuration -# -configure_file ( - "${CMAKE_CURRENT_SOURCE_DIR}/wsjtx_config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/wsjtx_config.h" - ) - - -if (NOT WIN32 AND NOT APPLE) - # install a desktop file so wsjtx appears in the application start - # menu with an icon - install ( - FILES wsjtx.desktop message_aggregator.desktop - DESTINATION share/applications - #COMPONENT runtime - ) - install ( - FILES icons/Unix/wsjtx_icon.png - DESTINATION share/pixmaps - #COMPONENT runtime - ) -endif (NOT WIN32 AND NOT APPLE) - -if (APPLE) - set (CMAKE_POSTFLIGHT_SCRIPT - "${wsjtx_BINARY_DIR}/postflight.sh") - set (CMAKE_POSTUPGRADE_SCRIPT - "${wsjtx_BINARY_DIR}/postupgrade.sh") - configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postflight.sh.in" - "${CMAKE_POSTFLIGHT_SCRIPT}") - configure_file ("${wsjtx_SOURCE_DIR}/Darwin/postupgrade.sh.in" - "${CMAKE_POSTUPGRADE_SCRIPT}") -endif () - - -# -# bundle fixup only done in non-Debug configurations -# -if (NOT is_debug_build) - # add this sub-sirectory after all install steps and other - # sub-directories to ensure that all executables are in-place before - # any fixup is done - add_subdirectory (bundle_fixup) -endif () - - -# -# packaging -# -set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/package_description.txt") -set (CPACK_MONOLITHIC_INSTALL 1) -set (CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") -set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) -set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) -set (CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") - -if (WIN32) - set (CPACK_GENERATOR "NSIS") -elseif (APPLE) - set (CPACK_GENERATOR "DragNDrop") -else () - find_program (DPKG_BUILDER dpkg-buildpackage DOC "Debian package builder") - if (DPKG_BUILDER) - # - # Derive the correct filename for a Debian package because the DEB - # generator doesn't do this correctly at present. - # - find_program (DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems") - if (DPKG_PROGRAM) - execute_process ( - COMMAND ${DPKG_PROGRAM} --print-architecture - OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - else (DPKG_PROGRAM) - set (CPACK_DEBIAN_PACKAGE_ARCHITECTURE noarch) - endif (DPKG_PROGRAM) - - list (APPEND CPACK_GENERATOR "DEB") - endif (DPKG_BUILDER) - - find_program (RPMBUILDER rpmbuild DOC "RPM package builder") - if (RPMBUILDER) - list (APPEND CPACK_GENERATOR "RPM") - endif (RPMBUILDER) -endif () - -set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") -set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8.3) | libgfortran4 (>=7.3) | libgfortran3 (>=6.3), libfftw3-single3 (>=3.3), libgomp1 (>=6), libqt5serialport5 (>=5.7), libqt5multimedia5-plugins (>=5.7), libqt5widgets5 (>=5.7), libqt5network5 (>=5.7), libqt5printsupport5 (>=5.7), libqt5sql5-sqlite (>=5.7), libusb-1.0-0 (>=1.0.21), libboost-log1.62.0 (>=1.62.0) | libboost-log1.65.1 (>=1.65.1) | libboost-log1.67.0 (>=1.67.0) | libboost-log1.71.0 (>=1.71.0) | libboost-log1.74.0 (>=1.74.0)") -set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) - -set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) -set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 7, libgomp >= 7, fftw-libs-single >= 3.3, boost-log >= 1.62") -set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) - -configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" - "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) -set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake") - -include (CPack) From dec65a1b7aa9dc74af9dd7d49f44c430ac4a04ac Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 16:03:13 -0500 Subject: [PATCH 012/251] Starting to trim stuff not needed for q65w. No early decpde; all decodes to main window. --- q65w/mainwindow.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 98a34a164..1869397fd 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -636,19 +636,8 @@ void MainWindow::dataSink(int k) n=0; } - if(ihsym<280) m_RxState=0; - - if(m_RxState==0 and ihsym>=280 and !m_diskData) { //Early decode, t=52 s - m_RxState=1; - datcom_.newdat=1; - datcom_.nagain=0; - datcom_.nhsym=ihsym; - QDateTime t = QDateTime::currentDateTimeUtc(); - m_dateTime=t.toString("yyyy-MMM-dd hh:mm"); - decode(); //Start the decoder - } - - if(m_RxState<=1 and ihsym>=302) { //Decode at t=56 s (for Q65 and data from disk) + */ + if(ihsym>=302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; datcom_.nagain=0; @@ -1446,20 +1435,17 @@ void MainWindow::readFromStdout() //readFromStdout read_log(); - if(t.indexOf("!") >= 0) { + if(t.indexOf("@") >= 0) { int n=t.length(); int m=2; #ifdef WIN32 m=3; #endif - if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m)); + if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(q,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); m_messagesText=""; m_bandmapText=""; - } - - if(t.indexOf("@") >= 0) { m_messagesText += t.mid(1); m_widebandDecode=true; } From 4c83311f5a846f843ed6ba1a8ebf4c8a36d86961 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 16:06:14 -0500 Subject: [PATCH 013/251] Oops! Fix two committing errors. --- q65w/mainwindow.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 1869397fd..e422b7f2e 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -636,7 +636,6 @@ void MainWindow::dataSink(int k) n=0; } - */ if(ihsym>=302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; @@ -1441,7 +1440,7 @@ void MainWindow::readFromStdout() //readFromStdout #ifdef WIN32 m=3; #endif - if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(q,n-m-4).trimmed()); + if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); m_messagesText=""; From 8731f9e75a1a1cde3a9756702a7a1bc6fd677f69 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 16:44:09 -0500 Subject: [PATCH 014/251] Starting to remove Messages window from q65w. --- q65w/mainwindow.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index e422b7f2e..b0baa161c 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -48,7 +48,7 @@ MainWindow::MainWindow(QWidget *parent) : m_settings_filename {m_appDir + "/map65.ini"}, m_astro_window {new Astro {m_settings_filename}}, m_band_map_window {new BandMap {m_settings_filename}}, - m_messages_window {new Messages {m_settings_filename}}, +// m_messages_window {new Messages {m_settings_filename}}, m_wide_graph_window {new WideGraph {m_settings_filename}}, m_gui_timer {new QTimer {this}} { @@ -226,9 +226,9 @@ MainWindow::MainWindow(QWidget *parent) : on_actionAstro_Data_triggered(); //Create the other windows on_actionWide_Waterfall_triggered(); - on_actionMessages_triggered(); +// on_actionMessages_triggered(); on_actionBand_Map_triggered(); - if (m_messages_window) m_messages_window->setColors(m_colors); +// if (m_messages_window) m_messages_window->setColors(m_colors); m_band_map_window->setColors(m_colors); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); @@ -301,7 +301,7 @@ MainWindow::MainWindow(QWidget *parent) : if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); - connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); +// connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); connect (m_wide_graph_window.get (), &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); connect (m_wide_graph_window.get (), &WideGraph::f11f12, this, &MainWindow::bumpDF); @@ -728,7 +728,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_initIQplus=dlg.m_initIQplus; m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; - m_messages_window->setColors(m_colors); +// m_messages_window->setColors(m_colors); m_band_map_window->setColors(m_colors); m_cal570=dlg.m_cal570; m_TxOffset=dlg.m_TxOffset; @@ -976,7 +976,7 @@ void MainWindow::closeEvent (QCloseEvent * e) mem_m65.detach(); if (m_astro_window) m_astro_window->close (); if (m_band_map_window) m_band_map_window->close (); - if (m_messages_window) m_messages_window->close (); +// if (m_messages_window) m_messages_window->close (); if (m_wide_graph_window) m_wide_graph_window->close (); QMainWindow::closeEvent (e); } @@ -1045,7 +1045,7 @@ void MainWindow::on_actionBand_Map_triggered() //Display BandMap void MainWindow::on_actionMessages_triggered() //Display Messages { - m_messages_window->show(); +// m_messages_window->show(); } void MainWindow::on_actionOpen_triggered() //Open File @@ -1167,7 +1167,7 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() { m_band_map_window->setText(""); - m_messages_window->setText("",""); +// m_messages_window->setText("",""); m_map65RxLog |= 4; } @@ -1415,7 +1415,7 @@ void MainWindow::readFromStdout() //readFromStdout if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { if(m_widebandDecode) { - m_messages_window->setText(m_messagesText,m_bandmapText); +// m_messages_window->setText(m_messagesText,m_bandmapText); m_band_map_window->setText(m_bandmapText); m_widebandDecode=false; } @@ -1443,9 +1443,9 @@ void MainWindow::readFromStdout() //readFromStdout if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); - m_messagesText=""; +// m_messagesText=""; m_bandmapText=""; - m_messagesText += t.mid(1); +// m_messagesText += t.mid(1); m_widebandDecode=true; } @@ -1474,7 +1474,7 @@ void MainWindow::on_EraseButton_clicked() qint64 ms=QDateTime::currentMSecsSinceEpoch(); ui->decodedTextBrowser->clear(); if((ms-m_msErase)<500) { - on_actionErase_Band_Map_and_Messages_triggered(); +// on_actionErase_Band_Map_and_Messages_triggered(); } m_msErase=ms; } From adc04fd71e4b479cbefaab1e5c72acb2e87f8921 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 16:58:19 -0500 Subject: [PATCH 015/251] Finish removing Messages window. --- q65w/CMakeLists.txt | 2 - q65w/mainwindow.cpp | 52 -------------------- q65w/mainwindow.h | 5 -- q65w/map65.pro | 6 +-- q65w/messages.cpp | 113 -------------------------------------------- q65w/messages.h | 44 ----------------- q65w/messages.ui | 107 ----------------------------------------- 7 files changed, 3 insertions(+), 326 deletions(-) delete mode 100644 q65w/messages.cpp delete mode 100644 q65w/messages.h delete mode 100644 q65w/messages.ui diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index 84cbff690..759dc065e 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -8,7 +8,6 @@ set (q65w_CXXSRCS getfile.cpp main.cpp mainwindow.cpp - messages.cpp meterwidget.cpp plotter.cpp set570.cpp @@ -29,7 +28,6 @@ set (q65w_UISRCS bandmap.ui devsetup.ui mainwindow.ui - messages.ui txtune.ui widegraph.ui ) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index b0baa161c..aa142d697 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -15,7 +15,6 @@ #include "about.h" #include "astro.h" #include "widegraph.h" -#include "messages.h" #include "bandmap.h" #include "txtune.h" #include "sleep.h" @@ -48,7 +47,6 @@ MainWindow::MainWindow(QWidget *parent) : m_settings_filename {m_appDir + "/map65.ini"}, m_astro_window {new Astro {m_settings_filename}}, m_band_map_window {new BandMap {m_settings_filename}}, -// m_messages_window {new Messages {m_settings_filename}}, m_wide_graph_window {new WideGraph {m_settings_filename}}, m_gui_timer {new QTimer {this}} { @@ -226,9 +224,7 @@ MainWindow::MainWindow(QWidget *parent) : on_actionAstro_Data_triggered(); //Create the other windows on_actionWide_Waterfall_triggered(); -// on_actionMessages_triggered(); on_actionBand_Map_triggered(); -// if (m_messages_window) m_messages_window->setColors(m_colors); m_band_map_window->setColors(m_colors); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); @@ -301,7 +297,6 @@ MainWindow::MainWindow(QWidget *parent) : if(ui->actionAFMHot->isChecked()) on_actionAFMHot_triggered(); if(ui->actionBlue->isChecked()) on_actionBlue_triggered(); -// connect (m_messages_window.get (), &Messages::click2OnCallsign, this, &MainWindow::doubleClickOnMessages); connect (m_wide_graph_window.get (), &WideGraph::freezeDecode2, this, &MainWindow::freezeDecode); connect (m_wide_graph_window.get (), &WideGraph::f11f12, this, &MainWindow::bumpDF); @@ -728,7 +723,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_initIQplus=dlg.m_initIQplus; m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; -// m_messages_window->setColors(m_colors); m_band_map_window->setColors(m_colors); m_cal570=dlg.m_cal570; m_TxOffset=dlg.m_TxOffset; @@ -976,7 +970,6 @@ void MainWindow::closeEvent (QCloseEvent * e) mem_m65.detach(); if (m_astro_window) m_astro_window->close (); if (m_band_map_window) m_band_map_window->close (); -// if (m_messages_window) m_messages_window->close (); if (m_wide_graph_window) m_wide_graph_window->close (); QMainWindow::closeEvent (e); } @@ -1043,11 +1036,6 @@ void MainWindow::on_actionBand_Map_triggered() //Display BandMap m_band_map_window->show (); } -void MainWindow::on_actionMessages_triggered() //Display Messages -{ -// m_messages_window->show(); -} - void MainWindow::on_actionOpen_triggered() //Open File { m_monitoring=false; @@ -1167,7 +1155,6 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() { m_band_map_window->setText(""); -// m_messages_window->setText("",""); m_map65RxLog |= 4; } @@ -1415,7 +1402,6 @@ void MainWindow::readFromStdout() //readFromStdout if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { if(m_widebandDecode) { -// m_messages_window->setText(m_messagesText,m_bandmapText); m_band_map_window->setText(m_bandmapText); m_widebandDecode=false; } @@ -1443,9 +1429,7 @@ void MainWindow::readFromStdout() //readFromStdout if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); -// m_messagesText=""; m_bandmapText=""; -// m_messagesText += t.mid(1); m_widebandDecode=true; } @@ -1474,7 +1458,6 @@ void MainWindow::on_EraseButton_clicked() qint64 ms=QDateTime::currentMSecsSinceEpoch(); ui->decodedTextBrowser->clear(); if((ms-m_msErase)<500) { -// on_actionErase_Band_Map_and_Messages_triggered(); } m_msErase=ms; } @@ -1844,41 +1827,6 @@ void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl) QString rpt=""; if(ctrl or m_modeTx=="Q65") rpt=t2.mid(25,3); genStdMsgs(rpt); - if(t2.indexOf(m_myCall)>0) { - m_ntx=2; - ui->txrb2->setChecked(true); - } else { - m_ntx=1; - ui->txrb1->setChecked(true); - } -} - //doubleClickOnMessages -void MainWindow::doubleClickOnMessages(QString hiscall, QString t2, bool ctrl) -{ - if(hiscall.length()<3) return; - if(m_worked[hiscall]) { - msgBox("Possible dupe: " + hiscall + " already in log."); - } - ui->dxCallEntry->setText(hiscall); - int n = 60*t2.mid(13,2).toInt() + t2.mid(15,2).toInt(); - m_txFirst = ((n%2) == 1); - ui->txFirstCheckBox->setChecked(m_txFirst); - - if((t2.indexOf(":")<0) and m_modeTx!="JT65") on_pbTxMode_clicked(); - if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); - - auto const& words = t2.mid(25).split(' ', SkipEmptyParts); - QString grid=words[2]; - if(isGrid4(grid) and hiscall==words[1]) { - ui->dxGridEntry->setText(grid); - } else { - lookup(); - } - - QString rpt=""; - if(ctrl or m_modeTx=="Q65") rpt=t2.mid(20,3); - genStdMsgs(rpt); - if(t2.indexOf(m_myCall)>0) { m_ntx=2; ui->txrb2->setChecked(true); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index efe58b866..26c551cdb 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -27,7 +27,6 @@ namespace Ui { class QTimer; class Astro; class BandMap; -class Messages; class WideGraph; class MainWindow : public QMainWindow @@ -51,7 +50,6 @@ public slots: void editor_error(); void guiUpdate(); void doubleClickOnCall(QString hiscall, bool ctrl); - void doubleClickOnMessages(QString hiscall, QString t2, bool ctrl); private: virtual void keyPressEvent (QKeyEvent *) override; @@ -83,7 +81,6 @@ private slots: void on_actionQ65_Sensitivity_in_MAP65_3_0_triggered(); void on_actionWide_Waterfall_triggered(); void on_actionBand_Map_triggered(); - void on_actionMessages_triggered(); void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); @@ -152,7 +149,6 @@ private: QString m_settings_filename; QScopedPointer m_astro_window; QScopedPointer m_band_map_window; - QScopedPointer m_messages_window; QScopedPointer m_wide_graph_window; QPointer m_gui_timer; qint64 m_msErase; @@ -256,7 +252,6 @@ private: QString m_pbdecoding_style1; QString m_pbmonitor_style; QString m_pbAutoOn_style; - QString m_messagesText; QString m_bandmapText; QString m_myCall; QString m_myGrid; diff --git a/q65w/map65.pro b/q65w/map65.pro index 83862ada8..951828b63 100644 --- a/q65w/map65.pro +++ b/q65w/map65.pro @@ -31,7 +31,7 @@ DEFINES = UNIX SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ soundin.cpp soundout.cpp devsetup.cpp \ - widegraph.cpp getfile.cpp messages.cpp bandmap.cpp \ + widegraph.cpp getfile.cpp bandmap.cpp \ astro.cpp displaytext.cpp getdev.cpp \ txtune.cpp meterwidget.cpp signalmeter.cpp @@ -40,12 +40,12 @@ SOURCES += killbyname.cpp set570.cpp } HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ - about.h devsetup.h widegraph.h getfile.h messages.h \ + about.h devsetup.h widegraph.h getfile.h \ bandmap.h commons.h sleep.h astro.h displaytext.h \ txtune.h meterwidget.h signalmeter.h FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ - messages.ui bandmap.ui astro.ui \ + bandmap.ui astro.ui \ txtune.ui RC_FILE = map65.rc diff --git a/q65w/messages.cpp b/q65w/messages.cpp deleted file mode 100644 index 3d0b18954..000000000 --- a/q65w/messages.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "messages.h" -#include -#include "SettingsGroup.hpp" -#include "ui_messages.h" -#include "mainwindow.h" -#include "qt_helpers.hpp" - -Messages::Messages (QString const& settings_filename, QWidget * parent) : - QDialog {parent}, - ui {new Ui::Messages}, - m_settings_filename {settings_filename} -{ - ui->setupUi(this); - setWindowTitle("Messages"); - setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); - QSettings settings {m_settings_filename, QSettings::IniFormat}; - SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for - // historical reasons - setGeometry (settings.value ("MessagesGeom", QRect {800, 400, 381, 400}).toRect ()); - ui->messagesTextBrowser->setStyleSheet( \ - "QTextBrowser { background-color : #000066; color : red; }"); - ui->messagesTextBrowser->clear(); - m_cqOnly=false; - m_cqStarOnly=false; - connect (ui->messagesTextBrowser, &DisplayText::selectCallsign, this, &Messages::selectCallsign2); -} - -Messages::~Messages() -{ - QSettings settings {m_settings_filename, QSettings::IniFormat}; - SettingsGroup g {&settings, "MainWindow"}; - settings.setValue ("MessagesGeom", geometry ()); - delete ui; -} - -void Messages::setText(QString t, QString t2) -{ - QString cfreq,cfreq0; - m_t=t; - m_t2=t2; - - QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; - ui->messagesTextBrowser->setStyleSheet(s); - - ui->messagesTextBrowser->clear(); - QStringList lines = t.split( "\n", SkipEmptyParts ); - foreach( QString line, lines ) { - QString t1=line.mid(0,50); - int ncq=t1.indexOf(" CQ "); - if((m_cqOnly or m_cqStarOnly) and ncq< 0) continue; - if(m_cqStarOnly) { - QString caller=t1.mid(ncq+4,-1); - int nz=caller.indexOf(" "); - caller=caller.mid(0,nz); - int i=t2.indexOf(caller); - if(t2.mid(i-1,1)==" ") continue; - } - int n=line.mid(50,2).toInt(); -// if(line.indexOf(":")>0) n=-1; -// if(n==-1) ui->messagesTextBrowser->setTextColor("#ffffff"); // white - if(n==0) ui->messagesTextBrowser->setTextColor(m_color0); - if(n==1) ui->messagesTextBrowser->setTextColor(m_color1); - if(n==2) ui->messagesTextBrowser->setTextColor(m_color2); - if(n>=3) ui->messagesTextBrowser->setTextColor(m_color3); - cfreq=t1.mid(0,3); - if(cfreq == cfreq0) { - t1=" " + t1.mid(3,-1); - } - cfreq0=cfreq; - ui->messagesTextBrowser->append(t1); - } -} - -void Messages::selectCallsign2(bool ctrl) -{ - QString t = ui->messagesTextBrowser->toPlainText(); //Full contents - int i=ui->messagesTextBrowser->textCursor().position(); - int i0=t.lastIndexOf(" ",i); - int i1=t.indexOf(" ",i); - QString hiscall=t.mid(i0+1,i1-i0-1); - if(hiscall!="") { - if(hiscall.length() < 13) { - QString t1 = t.mid(0,i); //contents up to text cursor - int i1=t1.lastIndexOf("\n") + 1; - QString t2 = t.mid(i1,-1); //selected line to end - int i2=t2.indexOf("\n"); - t2=t2.left(i2); //selected line - emit click2OnCallsign(hiscall,t2,ctrl); - } - } -} - -void Messages::setColors(QString t) -{ - m_colorBackground = "#"+t.mid(0,6); - m_color0 = "#"+t.mid(6,6); - m_color1 = "#"+t.mid(12,6); - m_color2 = "#"+t.mid(18,6); - m_color3 = "#"+t.mid(24,6); - setText(m_t,m_t2); -} - -void Messages::on_cbCQ_toggled(bool checked) -{ - m_cqOnly = checked; - setText(m_t,m_t2); -} - -void Messages::on_cbCQstar_toggled(bool checked) -{ - m_cqStarOnly = checked; - setText(m_t,m_t2); -} diff --git a/q65w/messages.h b/q65w/messages.h deleted file mode 100644 index 995c3d12f..000000000 --- a/q65w/messages.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef MESSAGES_H -#define MESSAGES_H - -#include - -namespace Ui { - class Messages; -} - -class Messages : public QDialog -{ - Q_OBJECT - -public: - explicit Messages (QString const& settings_filename, QWidget * parent = nullptr); - void setText(QString t, QString t2); - void setColors(QString t); - - ~Messages(); - -signals: - void click2OnCallsign(QString hiscall, QString t2, bool ctrl); - -private slots: - void selectCallsign2(bool ctrl); - void on_cbCQ_toggled(bool checked); - void on_cbCQstar_toggled(bool checked); - -private: - Ui::Messages *ui; - QString m_settings_filename; - QString m_t; - QString m_t2; - QString m_colorBackground; - QString m_color0; - QString m_color1; - QString m_color2; - QString m_color3; - - bool m_cqOnly; - bool m_cqStarOnly; -}; - -#endif diff --git a/q65w/messages.ui b/q65w/messages.ui deleted file mode 100644 index 3bf0dc67a..000000000 --- a/q65w/messages.ui +++ /dev/null @@ -1,107 +0,0 @@ - - - Messages - - - - 0 - 0 - 399 - 595 - - - - - 0 - 0 - - - - Dialog - - - - - - QLayout::SetDefaultConstraint - - - - - - - - 0 - 0 - - - - Freq DF Pol UTC dB - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - CQ* Only - - - - - - - CQ Only - - - - - - - - - - 0 - 0 - - - - - 340 - 0 - - - - - Courier New - 9 - - - - - - - - - - - DisplayText - QTextBrowser -
displaytext.h
-
-
- - -
From de841889b56a231ced55a0fb361b6158d6b7d187 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 17:07:08 -0500 Subject: [PATCH 016/251] Starting to remove Band Map window. --- q65w/mainwindow.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index aa142d697..f8d181bb2 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -46,7 +46,6 @@ MainWindow::MainWindow(QWidget *parent) : m_appDir {QApplication::applicationDirPath ()}, m_settings_filename {m_appDir + "/map65.ini"}, m_astro_window {new Astro {m_settings_filename}}, - m_band_map_window {new BandMap {m_settings_filename}}, m_wide_graph_window {new WideGraph {m_settings_filename}}, m_gui_timer {new QTimer {this}} { @@ -224,8 +223,8 @@ MainWindow::MainWindow(QWidget *parent) : on_actionAstro_Data_triggered(); //Create the other windows on_actionWide_Waterfall_triggered(); - on_actionBand_Map_triggered(); - m_band_map_window->setColors(m_colors); +// on_actionBand_Map_triggered(); +// m_band_map_window->setColors(m_colors); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); if(m_modeQ65==0) on_actionNoQ65_triggered(); @@ -723,7 +722,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_initIQplus=dlg.m_initIQplus; m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; - m_band_map_window->setColors(m_colors); +// m_band_map_window->setColors(m_colors); m_cal570=dlg.m_cal570; m_TxOffset=dlg.m_TxOffset; m_mult570Tx=dlg.m_mult570Tx; @@ -969,7 +968,7 @@ void MainWindow::closeEvent (QCloseEvent * e) quitFile.remove(); mem_m65.detach(); if (m_astro_window) m_astro_window->close (); - if (m_band_map_window) m_band_map_window->close (); +// if (m_band_map_window) m_band_map_window->close (); if (m_wide_graph_window) m_wide_graph_window->close (); QMainWindow::closeEvent (e); } @@ -1033,7 +1032,7 @@ void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls void MainWindow::on_actionBand_Map_triggered() //Display BandMap { - m_band_map_window->show (); +// m_band_map_window->show (); } void MainWindow::on_actionOpen_triggered() //Open File @@ -1154,7 +1153,7 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() //Clear BandMap and Messages windows void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() { - m_band_map_window->setText(""); +// m_band_map_window->setText(""); m_map65RxLog |= 4; } @@ -1402,7 +1401,7 @@ void MainWindow::readFromStdout() //readFromStdout if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { if(m_widebandDecode) { - m_band_map_window->setText(m_bandmapText); +// m_band_map_window->setText(m_bandmapText); m_widebandDecode=false; } QFile lockFile(m_appDir + "/.lock"); @@ -1429,7 +1428,7 @@ void MainWindow::readFromStdout() //readFromStdout if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); - m_bandmapText=""; +// m_bandmapText=""; m_widebandDecode=true; } @@ -1443,7 +1442,7 @@ void MainWindow::readFromStdout() //readFromStdout } else { q=q.mid(1,4) + " *" + q.mid(5); } - m_bandmapText += q; +// m_bandmapText += q; } } if(t.indexOf("=") >= 0) { From 9ba8ae0b9bae57fc28e9ca7473d9553e7add050b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 17:11:51 -0500 Subject: [PATCH 017/251] Finish removing Band Map window. --- q65w/bandmap.cpp | 100 -------------------------------------------- q65w/bandmap.h | 35 ---------------- q65w/bandmap.ui | 43 ------------------- q65w/mainwindow.cpp | 19 --------- q65w/mainwindow.h | 5 --- q65w/map65.pro | 7 ++-- 6 files changed, 3 insertions(+), 206 deletions(-) delete mode 100644 q65w/bandmap.cpp delete mode 100644 q65w/bandmap.h delete mode 100644 q65w/bandmap.ui diff --git a/q65w/bandmap.cpp b/q65w/bandmap.cpp deleted file mode 100644 index 3c4daecb3..000000000 --- a/q65w/bandmap.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include "bandmap.h" -#include -#include "ui_bandmap.h" -#include "qt_helpers.hpp" -#include "SettingsGroup.hpp" -#include - -BandMap::BandMap (QString const& settings_filename, QWidget * parent) - : QWidget {parent}, - ui {new Ui::BandMap}, - m_settings_filename {settings_filename} -{ - ui->setupUi (this); - setWindowTitle ("Band Map"); - setWindowFlags (Qt::Dialog | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); - QSettings settings {m_settings_filename, QSettings::IniFormat}; - SettingsGroup g {&settings, "MainWindow"}; // MainWindow group for - // historical reasons - setGeometry (settings.value ("BandMapGeom", QRect {280, 400, 142, 400}).toRect ()); - ui->bmTextBrowser->setStyleSheet( - "QTextBrowser { background-color : #000066; color : red; }"); -} - -BandMap::~BandMap () -{ - QSettings settings {m_settings_filename, QSettings::IniFormat}; - SettingsGroup g {&settings, "MainWindow"}; - settings.setValue ("BandMapGeom", geometry ()); - delete ui; -} - -void BandMap::setText(QString t) -{ - m_bandMapText=t; - int w=ui->bmTextBrowser->size().width(); - int ncols=1; - if(w>220) ncols=2; - QString s="QTextBrowser{background-color: "+m_colorBackground+"}"; - ui->bmTextBrowser->setStyleSheet(s); - QString t0="" - "
\n"; - QString tfreq,tspace,tcall; - QString s0,s1,s2,s3,bg; - bg="."; - s0=""; - s1=""; - s2=""; - s3=""; - - ui->bmTextBrowser->clear(); - QStringList lines = t.split( "\n", SkipEmptyParts ); - int nrows=(lines.length()+ncols-1)/ncols; - - for(int i=0; i=3) t0 += s3; - t0 += (tfreq + tspace + tcall + "
\n"); - } - - if(ncols==2) { //2-column display - t0 += "

\n"; - for(int i=nrows; i=3) t0 += s3; - t0 += (tfreq + tspace + tcall + "
\n"); - } - if(2*nrows>lines.length()) t0 += (s0 + "
\n"); - } - ui->bmTextBrowser->setHtml(t0); -} - -void BandMap::resizeEvent(QResizeEvent* ) -{ - setText(m_bandMapText); -} - -void BandMap::setColors(QString t) -{ - m_colorBackground = "#"+t.mid(0,6); - m_color0 = "#"+t.mid(6,6); - m_color1 = "#"+t.mid(12,6); - m_color2 = "#"+t.mid(18,6); - m_color3 = "#"+t.mid(24,6); - setText(m_bandMapText); -} diff --git a/q65w/bandmap.h b/q65w/bandmap.h deleted file mode 100644 index 857925800..000000000 --- a/q65w/bandmap.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef BANDMAP_H -#define BANDMAP_H - -#include - -namespace Ui { - class BandMap; -} - -class BandMap : public QWidget -{ - Q_OBJECT - -public: - explicit BandMap (QString const& settings_filename, QWidget *parent = 0); - void setText(QString t); - void setColors(QString t); - - ~BandMap(); - -protected: - void resizeEvent(QResizeEvent* event); - -private: - Ui::BandMap *ui; - QString m_settings_filename; - QString m_bandMapText; - QString m_colorBackground; - QString m_color0; - QString m_color1; - QString m_color2; - QString m_color3; -}; - -#endif diff --git a/q65w/bandmap.ui b/q65w/bandmap.ui deleted file mode 100644 index cd87a41dd..000000000 --- a/q65w/bandmap.ui +++ /dev/null @@ -1,43 +0,0 @@ - - - BandMap - - - - 0 - 0 - 329 - 379 - - - - - 0 - 0 - - - - Form - - - - - - - 107 - 0 - - - - - Courier New - 9 - - - - - - - - - diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index f8d181bb2..fea906cac 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -15,7 +15,6 @@ #include "about.h" #include "astro.h" #include "widegraph.h" -#include "bandmap.h" #include "txtune.h" #include "sleep.h" #include @@ -223,8 +222,6 @@ MainWindow::MainWindow(QWidget *parent) : on_actionAstro_Data_triggered(); //Create the other windows on_actionWide_Waterfall_triggered(); -// on_actionBand_Map_triggered(); -// m_band_map_window->setColors(m_colors); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); if(m_modeQ65==0) on_actionNoQ65_triggered(); @@ -722,7 +719,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_initIQplus=dlg.m_initIQplus; m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; -// m_band_map_window->setColors(m_colors); m_cal570=dlg.m_cal570; m_TxOffset=dlg.m_TxOffset; m_mult570Tx=dlg.m_mult570Tx; @@ -968,7 +964,6 @@ void MainWindow::closeEvent (QCloseEvent * e) quitFile.remove(); mem_m65.detach(); if (m_astro_window) m_astro_window->close (); -// if (m_band_map_window) m_band_map_window->close (); if (m_wide_graph_window) m_wide_graph_window->close (); QMainWindow::closeEvent (e); } @@ -1030,11 +1025,6 @@ void MainWindow::on_actionWide_Waterfall_triggered() //Display Waterfalls m_wide_graph_window->show(); } -void MainWindow::on_actionBand_Map_triggered() //Display BandMap -{ -// m_band_map_window->show (); -} - void MainWindow::on_actionOpen_triggered() //Open File { m_monitoring=false; @@ -1150,12 +1140,6 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() } } } - //Clear BandMap and Messages windows -void MainWindow::on_actionErase_Band_Map_and_Messages_triggered() -{ -// m_band_map_window->setText(""); - m_map65RxLog |= 4; -} void MainWindow::on_actionFind_Delta_Phi_triggered() //Find dPhi { @@ -1401,7 +1385,6 @@ void MainWindow::readFromStdout() //readFromStdout if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { if(m_widebandDecode) { -// m_band_map_window->setText(m_bandmapText); m_widebandDecode=false; } QFile lockFile(m_appDir + "/.lock"); @@ -1428,7 +1411,6 @@ void MainWindow::readFromStdout() //readFromStdout if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); -// m_bandmapText=""; m_widebandDecode=true; } @@ -1442,7 +1424,6 @@ void MainWindow::readFromStdout() //readFromStdout } else { q=q.mid(1,4) + " *" + q.mid(5); } -// m_bandmapText += q; } } if(t.indexOf("=") >= 0) { diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 26c551cdb..df9f5e3e9 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -26,7 +26,6 @@ namespace Ui { class QTimer; class Astro; -class BandMap; class WideGraph; class MainWindow : public QMainWindow @@ -80,12 +79,10 @@ private slots: void on_actionQSG_MAP65_v3_triggered(); void on_actionQ65_Sensitivity_in_MAP65_3_0_triggered(); void on_actionWide_Waterfall_triggered(); - void on_actionBand_Map_triggered(); void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); void on_actionDelete_all_tf2_files_in_SaveDir_triggered(); - void on_actionErase_Band_Map_and_Messages_triggered(); void on_actionFind_Delta_Phi_triggered(); void on_actionF4_sets_Tx6_triggered(); void on_actionOnly_EME_calls_triggered(); @@ -148,7 +145,6 @@ private: QString m_appDir; QString m_settings_filename; QScopedPointer m_astro_window; - QScopedPointer m_band_map_window; QScopedPointer m_wide_graph_window; QPointer m_gui_timer; qint64 m_msErase; @@ -252,7 +248,6 @@ private: QString m_pbdecoding_style1; QString m_pbmonitor_style; QString m_pbAutoOn_style; - QString m_bandmapText; QString m_myCall; QString m_myGrid; QString m_hisCall; diff --git a/q65w/map65.pro b/q65w/map65.pro index 951828b63..e51c56a47 100644 --- a/q65w/map65.pro +++ b/q65w/map65.pro @@ -31,7 +31,7 @@ DEFINES = UNIX SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ soundin.cpp soundout.cpp devsetup.cpp \ - widegraph.cpp getfile.cpp bandmap.cpp \ + widegraph.cpp getfile.cpp \ astro.cpp displaytext.cpp getdev.cpp \ txtune.cpp meterwidget.cpp signalmeter.cpp @@ -41,12 +41,11 @@ SOURCES += killbyname.cpp set570.cpp HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ about.h devsetup.h widegraph.h getfile.h \ - bandmap.h commons.h sleep.h astro.h displaytext.h \ + commons.h sleep.h astro.h displaytext.h \ txtune.h meterwidget.h signalmeter.h FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ - bandmap.ui astro.ui \ - txtune.ui + astro.ui txtune.ui RC_FILE = map65.rc From 88f542cd360ff844c596cab08818694e19b51e75 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 17:13:52 -0500 Subject: [PATCH 018/251] Really finish, this time. --- q65w/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index 759dc065e..c5c286d36 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -1,7 +1,6 @@ set (q65w_CXXSRCS about.cpp astro.cpp - bandmap.cpp devsetup.cpp displaytext.cpp getdev.cpp @@ -25,7 +24,6 @@ endif (WIN32) set (q65w_UISRCS about.ui astro.ui - bandmap.ui devsetup.ui mainwindow.ui txtune.ui From 17eae05c5308280a6139921539413b4c32707e60 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 4 Dec 2022 17:40:50 -0500 Subject: [PATCH 019/251] Starting to remove tx-related items from GUI, and the associated code. --- q65w/mainwindow.cpp | 187 -------------------------------------------- q65w/mainwindow.h | 9 --- q65w/mainwindow.ui | 107 +------------------------ 3 files changed, 1 insertion(+), 302 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index fea906cac..2cd8e05ad 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -94,8 +94,6 @@ MainWindow::MainWindow(QWidget *parent) : txMsgButtonGroup->addButton(ui->txrb5,5); txMsgButtonGroup->addButton(ui->txrb6,6); connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int))); - connect(ui->decodedTextBrowser,SIGNAL(selectCallsign(bool)),this, - SLOT(selectCall2(bool))); setWindowTitle (program_title ()); @@ -218,8 +216,6 @@ MainWindow::MainWindow(QWidget *parent) : border-style: outset; border-width: 1px; border-radius: 5px; \ border-color: black; min-width: 5em; padding: 3px;}"; - genStdMsgs(""); - on_actionAstro_Data_triggered(); //Create the other windows on_actionWide_Waterfall_triggered(); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); @@ -840,17 +836,6 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent m_wide_graph_window->setDF(n0+n); } break; - case Qt::Key_G: - if(e->modifiers() & Qt::AltModifier) { - genStdMsgs(""); - } - break; - case Qt::Key_L: - if(e->modifiers() & Qt::ControlModifier) { - lookup(); - genStdMsgs(""); - break; - } } } @@ -1510,53 +1495,6 @@ void MainWindow::guiUpdate() } } -// Calculate Tx waveform when needed - if((iptt==1 && iptt0==0) || m_restart) { - char message[23]; - QByteArray ba; - if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit(); - if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit(); - if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit(); - if(m_ntx == 4) ba=ui->tx4->text().toLocal8Bit(); - if(m_ntx == 5) ba=ui->tx5->text().toLocal8Bit(); - if(m_ntx == 6) ba=ui->tx6->text().toLocal8Bit(); - - ba2msg(ba,message); - int len1=22; - int mode65=m_mode65; - int ntxFreq=1000; - double samfac=1.0; - - if(m_modeTx=="JT65") { - gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, - &nwave,len1,len1); - } else { - if(m_modeQ65==5) ntxFreq=700; - gen_q65_wave_(message,&ntxFreq,&m_modeQ65,msgsent,iwave, - &nwave,len1,len1); - } - msgsent[22]=0; - - if(m_restart) { - QString t=" Tx " + m_modeTx + " "; - t=t.left(11); - QFile f("map65_tx.log"); - f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); - QTextStream out(&f); - out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") - << t << QString::fromLatin1(msgsent) -#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) - << Qt::endl -#else - << endl -#endif - ; - f.close(); - } - - m_restart=false; - } - // If PTT was just raised, start a countdown for raising TxOK: if(iptt==1 && iptt0==0) nc1=-9; // TxDelay = 0.8 s if(nc1 <= 0) nc1++; @@ -1761,94 +1699,6 @@ void MainWindow::on_txb6_clicked() //txb6 m_restart=true; } -void MainWindow::selectCall2(bool ctrl) //selectCall2 -{ - QString t = ui->decodedTextBrowser->toPlainText(); //Full contents - int i=ui->decodedTextBrowser->textCursor().position(); - int i0=t.lastIndexOf(" ",i); - int i1=t.indexOf(" ",i); - QString hiscall=t.mid(i0+1,i1-i0-1); - if(hiscall!="") { - int n=hiscall.length(); - if( n>2 and n<13 and hiscall.toDouble()==0.0 and \ - hiscall.mid(2,-1).toInt()==0) doubleClickOnCall(hiscall, ctrl); - } -} - //doubleClickOnCall -void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl) -{ - if(m_worked[hiscall]) { - msgBox("Possible dupe: " + hiscall + " already in log."); - } - ui->dxCallEntry->setText(hiscall); - QString t = ui->decodedTextBrowser->toPlainText(); //Full contents - int i2=ui->decodedTextBrowser->textCursor().position(); - QString t1 = t.mid(0,i2); //contents up to text cursor - int i1=t1.lastIndexOf("\n") + 1; - QString t2 = t1.mid(i1,i2-i1); //selected line - int n = 60*t2.mid(14,2).toInt() + t2.mid(16,2).toInt(); - m_txFirst = ((n%2) == 1); - ui->txFirstCheckBox->setChecked(m_txFirst); - if((t2.indexOf("#")>0) and m_modeTx!="JT65") on_pbTxMode_clicked(); - if((t2.indexOf(":")>0) and m_modeTx!="Q65") on_pbTxMode_clicked(); - - QString t3=t.mid(i1); - int i3=t3.indexOf("\n"); - if(i3<0) i3=t3.length(); - t3=t3.left(i3); - auto const& words = t3.mid(30).split(' ', SkipEmptyParts); - QString grid=words[2]; - if(isGrid4(grid) and hiscall==words[1]) { - ui->dxGridEntry->setText(grid); - } else { - lookup(); - } - - QString rpt=""; - if(ctrl or m_modeTx=="Q65") rpt=t2.mid(25,3); - genStdMsgs(rpt); - if(t2.indexOf(m_myCall)>0) { - m_ntx=2; - ui->txrb2->setChecked(true); - } else { - m_ntx=1; - ui->txrb1->setChecked(true); - } -} - -void MainWindow::genStdMsgs(QString rpt) //genStdMsgs() -{ - if(rpt.left(2)==" -") rpt="-0"+rpt.mid(2,1); - if(rpt.left(2)==" +") rpt="+0"+rpt.mid(2,1); - QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); - ui->dxCallEntry->setText(hiscall); - QString t0=hiscall + " " + m_myCall + " "; - QString t=t0; - if(t0.indexOf("/")<0) t=t0 + m_myGrid.mid(0,4); - msgtype(t, ui->tx1); - if(rpt == "" and m_modeTx=="Q65") rpt="-24"; - if(rpt == "" and m_modeTx=="JT65") { - t=t+" OOO"; - msgtype(t, ui->tx2); - msgtype("RO", ui->tx3); - msgtype("RRR", ui->tx4); - msgtype("73", ui->tx5); - } else { - t=t0 + rpt; - msgtype(t, ui->tx2); - t=t0 + "R" + rpt; - msgtype(t, ui->tx3); - t=t0 + "RRR"; - msgtype(t, ui->tx4); - t=t0 + "73"; - msgtype(t, ui->tx5); - } - t="CQ " + m_myCall + " " + m_myGrid.mid(0,4); - msgtype(t, ui->tx6); - m_ntx=1; - ui->txrb1->setChecked(true); -} - void MainWindow::lookup() //lookup() { QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); @@ -2021,42 +1871,6 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() } } -void MainWindow::on_tx1_editingFinished() //tx1 edited -{ - QString t=ui->tx1->text(); - msgtype(t, ui->tx1); -} - -void MainWindow::on_tx2_editingFinished() //tx2 edited -{ - QString t=ui->tx2->text(); - msgtype(t, ui->tx2); -} - -void MainWindow::on_tx3_editingFinished() //tx3 edited -{ - QString t=ui->tx3->text(); - msgtype(t, ui->tx3); -} - -void MainWindow::on_tx4_editingFinished() //tx4 edited -{ - QString t=ui->tx4->text(); - msgtype(t, ui->tx4); -} - -void MainWindow::on_tx5_editingFinished() //tx5 edited -{ - QString t=ui->tx5->text(); - msgtype(t, ui->tx5); -} - -void MainWindow::on_tx6_editingFinished() //tx6 edited -{ - QString t=ui->tx6->text(); - msgtype(t, ui->tx6); -} - void MainWindow::on_setTxFreqButton_clicked() //Set Tx Freq { m_setftx=1; @@ -2083,7 +1897,6 @@ void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button { - genStdMsgs(""); } void MainWindow::on_logQSOButton_clicked() //Log QSO button diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index df9f5e3e9..5525ce00d 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -48,7 +48,6 @@ public slots: void m65_error (QProcess::ProcessError); void editor_error(); void guiUpdate(); - void doubleClickOnCall(QString hiscall, bool ctrl); private: virtual void keyPressEvent (QKeyEvent *) override; @@ -56,12 +55,6 @@ private: virtual void closeEvent (QCloseEvent *) override; private slots: - void on_tx1_editingFinished(); - void on_tx2_editingFinished(); - void on_tx3_editingFinished(); - void on_tx4_editingFinished(); - void on_tx5_editingFinished(); - void on_tx6_editingFinished(); void on_actionDeviceSetup_triggered(); void on_monitorButton_clicked(); void on_actionExit_triggered(); @@ -112,7 +105,6 @@ private slots: void on_setTxFreqButton_clicked(); void on_dxCallEntry_textChanged(const QString &arg1); void on_dxGridEntry_textChanged(const QString &arg1); - void selectCall2(bool ctrl); void on_genStdMsgsPushButton_clicked(); void bumpDF(int n); void on_logQSOButton_clicked(); @@ -277,7 +269,6 @@ private: void createStatusBar(); void updateStatusBar(); void msgBox(QString t); - void genStdMsgs(QString rpt); void lookup(); void ba2msg(QByteArray ba, char* message); void msgtype(QString t, QLineEdit* tx); diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 7497108da..dfc97319e 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -737,112 +737,7 @@ p, li { white-space: pre-wrap; } - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - MS Shell Dlg 2 - - - - - - - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - - - - - 160 - 0 - - - - - 180 - 24 - - - - - + From 053ba57dc449f465ac9356fedf1b868aaa945599 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 11:01:52 -0500 Subject: [PATCH 020/251] Work in progress on q65w ==> stripped-down map65 for wideband Rx. --- CMakeLists.txt | 5 ++++- q65w/libm65/display.f90 | 18 +++++++++++------- q65w/libm65/map65a.f90 | 25 ++++++------------------- q65w/libm65/q65b.f90 | 2 ++ q65w/mainwindow.cpp | 5 +++-- q65w/{map65.pro => q65w.pro} | 0 6 files changed, 26 insertions(+), 29 deletions(-) rename q65w/{map65.pro => q65w.pro} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 201491ce0..a27d5ffb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -972,7 +972,10 @@ if (Fortran_COMPILER_NAME MATCHES "gfortran.*") set (CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") -set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") +### TEMPORARY: Let Fortran use RElEASE flags for DEBUG builds +#set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG} -g -fbacktrace -fbounds-check -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + set (CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_RELEASE} -fbounds-check -funroll-all-loops -fno-f2c -ffpe-summary=invalid,zero,overflow,underflow ${General_FFLAGS}") + # FPE traps currently disabled in Debug configuration builds until # we decide if they are meaningful, without these FP instructions diff --git a/q65w/libm65/display.f90 b/q65w/libm65/display.f90 index 1fef5c560..158b57c53 100644 --- a/q65w/libm65/display.f90 +++ b/q65w/libm65/display.f90 @@ -138,8 +138,10 @@ subroutine display(nkeep,ftol) ! Suppress listing duplicate (same time, decoded message, and frequency) if(out(14:17).ne.out0(14:17) .or. out(26:50).ne.out0(26:50) .or. & out(1:3).ne.out0(1:3)) then - write(*,1030) out !Messages -1030 format('@',a52) +!### +! write(*,1030) out !Messages +!1030 format('@',a52) +!### out0=out endif @@ -169,11 +171,13 @@ subroutine display(nkeep,ftol) freqcall(nc+1)=' ' freqcall(nc+2)=' ' - do i=1,nc - write(*,1042) freqcall(i) !Band Map -1042 format('&',a12) - enddo +!### +! do i=1,nc +! write(*,1042) freqcall(i) !Band Map +!1042 format('&',a12) +! enddo +!### -999 continue +999 continue return end subroutine display diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 1861467ad..597842bc8 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -67,6 +67,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('get_cand',1) candec=.false. endif + print*,'~ncand:',ncand !### ! do k=1,ncand ! freq=cand(k)%f+nkhz_center-48.0 @@ -101,7 +102,10 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & if(nutc.ne.nutc0) nfile=nfile+1 nutc0=nutc - do nqd=1,0,-1 +!### +! do nqd=1,0,-1 +!### + do nqd=0,0,-1 if(nqd.eq.1) then !Quick decode, at fQSO fa=1000.0*(fqso+0.001*mousedf) - ntol fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078 @@ -162,7 +166,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ssmax=1.e30 call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt, & flipk,syncshort,snr2,ipol2,dt2) -!### if(dt.lt.-2.6 .or. dt.gt.2.5) sync1=-99.0 !### call timer('ccf65 ',1) if(mode65.eq.0) syncshort=-99.0 !If "No JT65", don't waste time @@ -337,18 +340,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) - if(ndphi.eq.0) then - write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & - cm,decoded,nkv,nqual,ntxpol,cp -1010 format('!',i3,i5,i4,i6.4,f5.1,i5,1x,a1,1x,a22,i2,i5,i5,1x,a1) - else - if(iloop.ge.1) qphi(iloop)=sig(k,10) - write(*,1010) nkHz,ndf,npol,nutc,dt,nsync2, & - cm,decoded,nkv,nqual,30*iloop - write(27,1011) 30*iloop,nkHz,ndf,npol,nutc, & - dt,sync2,nkv,nqual,cm,decoded -1011 format(i3,i4,i5,i4,i6.4,1x,f5.1,f7.1,i3,i5,a1,1x,a22) - endif endif enddo ! k=1,km @@ -373,7 +364,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & if(.not.q65b_called) then freq=mousefqso + 0.001*mousedf ikhz=mousefqso - f0=freq - (nkhz_center-48.0-1.27046) !### ??? ### + f0=freq - (nkhz_center-48.0-1.27046) call timer('q65b ',0) call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & ntol,xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso, & @@ -382,10 +373,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & endif endif - if(nwrite.eq.0 .and. nwrite_q65.eq.0) then - write(*,1012) mousefqso,nutc -1012 format('!',i3,9x,i6.4,' ') - endif endif !nqd.eq.1 if(ndphi.eq.1 .and.iloop.lt.12) then diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 index 7cf455edf..a45263de6 100644 --- a/q65w/libm65/q65b.f90 +++ b/q65w/libm65/q65b.f90 @@ -191,6 +191,8 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & fsked=frx - 0.001*ndop00/2.0 - 1.5 write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) 1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) + write(*,1121) nutc,fsked,xdt0,nsnr0,trim(msg0) +1121 format('~',i4.4,f9.3,f7.2,i5,2x,a,i6) endif endif diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2cd8e05ad..0b23fbfe4 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1361,6 +1361,7 @@ void MainWindow::readFromStdout() //readFromStdout while(proc_m65.canReadLine()) { QByteArray t=proc_m65.readLine(); + qDebug() << "aa" << t.trimmed(); if(t.indexOf("") >= 0) { m_nsum=t.mid(17,4).toInt(); m_nsave=t.mid(21,4).toInt(); @@ -1387,7 +1388,7 @@ void MainWindow::readFromStdout() //readFromStdout read_log(); - if(t.indexOf("@") >= 0) { + if(t.indexOf("~") >= 0) { int n=t.length(); int m=2; #ifdef WIN32 @@ -1566,7 +1567,7 @@ void MainWindow::guiUpdate() if(m_modeJT65==0 and m_modeTx=="JT65") on_pbTxMode_clicked(); if(nsec != m_sec0) { //Once per second -// qDebug() << "A" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; +// qDebug() << "AAA" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); diff --git a/q65w/map65.pro b/q65w/q65w.pro similarity index 100% rename from q65w/map65.pro rename to q65w/q65w.pro From 27f304752a99de392acbae9473fdeb1e96f8df7d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 11:08:31 -0500 Subject: [PATCH 021/251] Moew WIP on q65w. --- q65w/libm65/map65a.f90 | 119 ++--------------------------------------- 1 file changed, 3 insertions(+), 116 deletions(-) diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 597842bc8..4cc1e26ef 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -102,17 +102,9 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & if(nutc.ne.nutc0) nfile=nfile+1 nutc0=nutc -!### -! do nqd=1,0,-1 -!### - do nqd=0,0,-1 - if(nqd.eq.1) then !Quick decode, at fQSO - fa=1000.0*(fqso+0.001*mousedf) - ntol - fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078 - else !Wideband decode at all freqs - fa=-1000*0.5*(nfb-nfa) + 1000*nfshift - fb= 1000*0.5*(nfb-nfa) + 1000*nfshift - endif + nqd=0 + fa=-1000*0.5*(nfb-nfa) + 1000*nfshift + fb= 1000*0.5*(nfb-nfa) + 1000*nfshift ia=nint(fa/df) + 16385 ib=nint(fb/df) + 16385 ia=max(51,ia) @@ -173,7 +165,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ! Is there a shorthand tone above threshold? thresh0=1.0 ! Use lower thresh0 at fQSO - if(nqd.eq.1 .and. ntol.le.100) thresh0=0. if(syncshort.gt.thresh0) then ! ### Do shorthand AFC here (or maybe after finding a pair?) ### short(1,i)=syncshort @@ -188,7 +179,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & if(short(1,i0).gt.thresh0) then fshort=0.001*(i0-16385)*df noffset=0 - if(nqd.eq.1) noffset=nint(1000.0*(fshort-fqso)-mousedf) if(abs(noffset).le.ntol) then ! Keep only the best candidate within ftol. !### NB: sync2 was not defined here! @@ -230,9 +220,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ! Is sync1 above threshold? thresh1=1.0 ! Use lower thresh1 at fQSO - if(nqd.eq.1 .and. ntol.le.100) thresh1=0. noffset=0 - if(nqd.ge.1) noffset=nint(1000.0*(freq-fqso)-mousedf) if(newdat.eq.1 .and. sync1.gt.-99.0) then sync1=thresh1+1.0 noffset=0 @@ -246,14 +234,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & nflip=nint(flipk) f00=(i-1)*df !Freq of detected sync tone (0-96000 Hz) ntry=ntry+1 - if((nqd.eq.1 .and. ntry.ge.40) .or. & - (nqd.eq.0 .and. ntry.ge.400)) then -! Too many calls to decode1a! - write(*,*) '! Signal too strong, or suspect data? Decoding aborted.' - write(13,*) 'Signal too strong, or suspect data? Decoding aborted.' - call flush(13) - go to 900 - endif call timer('decode1a',0) ifreq=i @@ -296,104 +276,13 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & endif enddo !i=ia,ib - if(nqd.eq.1) then - nwrite=0 - if(mode65.eq.0) km=0 - do k=1,km - decoded=msg(k) - if(decoded.ne.' ') then - nutc=sig(k,2) - freq=sig(k,3) - sync1=sig(k,4) - dt=sig(k,5) - npol=nint(57.2957795*sig(k,6)) - flip=sig(k,7) - sync2=sig(k,8) - nkv=sig(k,9) - nqual=sig(k,10) -! idphi=nint(sig(k,11)) - if(flip.lt.0.0) then - do i=22,1,-1 - if(decoded(i:i).ne.' ') go to 8 - enddo - stop 'Error in message format' -8 if(i.le.18) decoded(i+2:i+4)='OOO' - endif - nkHz=nint(freq-foffset)-nfshift - mhz=fcenter ! ... +fadd ??? - f0=mhz+0.001*nkHz - ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) - nsync1=sync1 - - s2db=10.0*log10(sync2) - 40 !### empirical ### - nsync2=nint(s2db) - if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & - decoded(1:4).eq.'73 ') then - nsync2=nint(1.33*s2db + 2.0) - endif - - nwrite=nwrite+1 - if(nxant.ne.0) then - npol=npol-45 - if(npol.lt.0) npol=npol+180 - endif - - call txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) - - endif - enddo ! k=1,km - - if(bq65) then - q65b_called=.false. - do icand=1,ncand - if(cand(icand)%iflip.ne.0) cycle !Keep only Q65 candidates - freq=cand(icand)%f+nkhz_center-48.0-1.27046 - nhzdiff=nint(1000.0*(freq-mousefqso)-mousedf) - nfcal -! Now looking for "quick decode" (nqd=1) candidates at cursor freq +/- ntol. - if(nqd.eq.1 .and. abs(nhzdiff).gt.ntol) cycle - ikhz=mousefqso - q65b_called=.true. - f0=cand(icand)%f - call timer('q65b ',0) - call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & - ntol,xpol,mycall,mygrid, hiscall,hisgrid,mode_q65,f0,fqso, & - newdat,nagain,max_drift,nhsym,ndop00,idec) - call timer('q65b ',1) - if(idec.ge.0) candec(icand)=.true. - enddo - if(.not.q65b_called) then - freq=mousefqso + 0.001*mousedf - ikhz=mousefqso - f0=freq - (nkhz_center-48.0-1.27046) - call timer('q65b ',0) - call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf, & - ntol,xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso, & - newdat,nagain,max_drift,nhsym,ndop00,idec) - call timer('q65b ',1) - endif - endif - - endif !nqd.eq.1 - if(ndphi.eq.1 .and.iloop.lt.12) then iloop=iloop+1 go to 2 endif if(ndphi.eq.1 .and.iloop.eq.12) call getdphi(qphi) - if(nqd.eq.1) then - call sec0(1,tdec) - write(*,1013) nsum,nsave,nstandalone,nhsym,tdec -1013 format('',3i4,i6,f6.2) - flush(6) - open(16,file='tquick.dat',status='unknown',access='append') - write(16,1016) nutc,tdec -1016 format(i4.4,f7.1) - close(16) - endif - call sec0(1,tsec0) if(nhsym.eq.nhsym1 .and. tsec0.gt.3.0) go to 700 - if(nqd.eq.1 .and. nagain.eq.1) go to 900 if(nqd.eq.0 .and. bq65) then ! Do the wideband Q65 decode @@ -415,8 +304,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & endif call sec0(1,tsec0) - enddo ! nqd - ! Trim the list and produce a sorted index and sizes of groups. ! (Should trimlist remove all but best SNR for given UTC and message content?) 700 call trimlist(sig,km,ftol,indx,nsiz,nz) From e4a7f3a22aed27f918e30e7f8ac52f57b5e06669 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 11:54:16 -0500 Subject: [PATCH 022/251] Sort candidates by frequency, after all. --- q65w/libm65/map65a.f90 | 3 +-- q65w/libm65/wideband_sync.f90 | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 4cc1e26ef..a6bf1bb80 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -4,7 +4,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) -! Processes timf2 data from Linrad to find and decode JT65 signals. +! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. use wideband_sync use timer_module, only: timer @@ -67,7 +67,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('get_cand',1) candec=.false. endif - print*,'~ncand:',ncand !### ! do k=1,ncand ! freq=cand(k)%f+nkhz_center-48.0 diff --git a/q65w/libm65/wideband_sync.f90 b/q65w/libm65/wideband_sync.f90 index 31a96d2cb..7d6373a14 100644 --- a/q65w/libm65/wideband_sync.f90 +++ b/q65w/libm65/wideband_sync.f90 @@ -39,6 +39,7 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) integer indx(NFFT) logical xpol,skip,ldecoded type(candidate) :: cand(MAX_CANDIDATES) + type(candidate) :: cand0(MAX_CANDIDATES) common/early/nhsym1,nhsym2,ldecoded(32768) call wb_sync(ss,savg,xpol,jz,nfa,nfb) !Output to sync() array @@ -103,6 +104,13 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) enddo ncand=k + cand0(1:ncand)=cand(1:ncand) + call indexx(cand0(1:ncand)%f,ncand,indx) !Sort by relative snr + do i=1,ncand + k=indx(i) + cand(i)=cand0(k) + enddo + return end subroutine get_candidates From c3d8e96c8fb48d9b910cae000600a5ad0e750499 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 12:12:32 -0500 Subject: [PATCH 023/251] Clean up the mainwindow test display. --- q65w/mainwindow.cpp | 4 ++-- q65w/mainwindow.ui | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 0b23fbfe4..7a0120eb3 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1361,7 +1361,6 @@ void MainWindow::readFromStdout() //readFromStdout while(proc_m65.canReadLine()) { QByteArray t=proc_m65.readLine(); - qDebug() << "aa" << t.trimmed(); if(t.indexOf("") >= 0) { m_nsum=t.mid(17,4).toInt(); m_nsave=t.mid(21,4).toInt(); @@ -1394,7 +1393,8 @@ void MainWindow::readFromStdout() //readFromStdout #ifdef WIN32 m=3; #endif - if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m-4).trimmed()); + qDebug() << "aa" << n << m << t.trimmed(); + if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); m_widebandDecode=true; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index dfc97319e..8c416d8e2 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -59,7 +59,7 @@ - Freq DF Pol UTC DT dB RC DS TxPol + UTC Freq DT dB Message From 532d36dc776f85194a040792484ffd5a9c24c0e9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 12:49:57 -0500 Subject: [PATCH 024/251] Removing unused GUI items and associated code. --- q65w/mainwindow.cpp | 243 +------------------------------------------- q65w/mainwindow.h | 28 ----- q65w/mainwindow.ui | 111 +------------------- 3 files changed, 7 insertions(+), 375 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7a0120eb3..05e5211d0 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -63,14 +63,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionAFMHot->setActionGroup(paletteGroup); ui->actionBlue->setActionGroup(paletteGroup); - QActionGroup* modeGroup = new QActionGroup(this); - ui->actionNoJT65->setActionGroup(modeGroup); - ui->actionJT65A->setActionGroup(modeGroup); - ui->actionJT65B->setActionGroup(modeGroup); - ui->actionJT65C->setActionGroup(modeGroup); - QActionGroup* modeGroup2 = new QActionGroup(this); - ui->actionNoQ65->setActionGroup(modeGroup2); ui->actionQ65A->setActionGroup(modeGroup2); ui->actionQ65B->setActionGroup(modeGroup2); ui->actionQ65C->setActionGroup(modeGroup2); @@ -220,17 +213,12 @@ MainWindow::MainWindow(QWidget *parent) : on_actionWide_Waterfall_triggered(); if (m_astro_window) m_astro_window->setFontSize (m_astroFont); - if(m_modeQ65==0) on_actionNoQ65_triggered(); if(m_modeQ65==1) on_actionQ65A_triggered(); if(m_modeQ65==2) on_actionQ65B_triggered(); if(m_modeQ65==3) on_actionQ65C_triggered(); if(m_modeQ65==4) on_actionQ65D_triggered(); if(m_modeQ65==5) on_actionQ65E_triggered(); - if(m_modeJT65==0) on_actionNoJT65_triggered(); - if(m_modeJT65==1) on_actionJT65A_triggered(); - if(m_modeJT65==2) on_actionJT65B_triggered(); - if(m_modeJT65==3) on_actionJT65C_triggered(); future1 = new QFuture; watcher1 = new QFutureWatcher; connect(watcher1, SIGNAL(finished()),this,SLOT(diskDat())); @@ -401,7 +389,6 @@ void MainWindow::readSettings() ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); m_path = settings.value("MRUdir", m_appDir + "/save").toString(); m_txFirst = settings.value("TxFirst",false).toBool(); - ui->txFirstCheckBox->setChecked(m_txFirst); } SettingsGroup g {&settings, "Common"}; @@ -460,8 +447,6 @@ void MainWindow::readSettings() if(m_modeQ65==3) ui->actionQ65C->setChecked(true); if(m_modeQ65==4) ui->actionQ65D->setChecked(true); if(m_modeQ65==5) ui->actionQ65E->setChecked(true); - if(m_modeTx=="JT65") ui->pbTxMode->setText("Tx JT65 #"); - if(m_modeTx=="Q65") ui->pbTxMode->setText("Tx Q65 :"); ui->actionNone->setChecked(settings.value("SaveNone",true).toBool()); ui->actionSave_all->setChecked(settings.value("SaveAll",false).toBool()); @@ -971,35 +956,6 @@ void MainWindow::stub() //stub() msgBox("Not yet implemented."); } -void MainWindow::on_actionRelease_Notes_triggered() -{ - QDesktopServices::openUrl(QUrl( - "https://www.physics.princeton.edu/pulsar/K1JT/Release_Notes.txt", - QUrl::TolerantMode)); -} - -void MainWindow::on_actionOnline_Users_Guide_triggered() //Display manual -{ - QDesktopServices::openUrl(QUrl( - "https://www.physics.princeton.edu/pulsar/K1JT/MAP65_Users_Guide.pdf", - QUrl::TolerantMode)); -} - -void MainWindow::on_actionQSG_Q65_triggered() -{ - QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Quick_Start.pdf"}); -} - -void MainWindow::on_actionQSG_MAP65_v3_triggered() -{ - QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/WSJTX_2.5.0_MAP65_3.0_Quick_Start.pdf"}); -} - -void MainWindow::on_actionQ65_Sensitivity_in_MAP65_3_0_triggered() -{ - QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Q65_Sensitivity_in_MAP65.pdf"}); -} - void MainWindow::on_actionAstro_Data_triggered() //Display Astro { if (m_astro_window ) m_astro_window->show(); @@ -1126,27 +1082,6 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() } } -void MainWindow::on_actionFind_Delta_Phi_triggered() //Find dPhi -{ - m_map65RxLog |= 8; - on_DecodeButton_clicked(); -} - -void MainWindow::on_actionF4_sets_Tx6_triggered() //F4 sets Tx6 -{ - m_kb8rq = !m_kb8rq; -} - -void MainWindow::on_actionOnly_EME_calls_triggered() //EME calls only -{ - m_onlyEME = ui->actionOnly_EME_calls->isChecked(); -} - -void MainWindow::on_actionNo_shorthands_if_Tx1_triggered() -{ - stub(); -} - void MainWindow::on_actionNo_Deep_Search_triggered() //No Deep Search { m_ndepth=0; @@ -1173,22 +1108,7 @@ void MainWindow::on_actionSave_all_triggered() //Save All { m_saveAll=true; } - //Display list of keyboard shortcuts -void MainWindow::on_actionKeyboard_shortcuts_triggered() -{ - stub(); -} - //Display list of mouse commands -void MainWindow::on_actionSpecial_mouse_commands_triggered() -{ - stub(); -} - //Diaplay list of Add-On pfx/sfx -void MainWindow::on_actionAvailable_suffixes_and_add_on_prefixes_triggered() -{ - stub(); -} - + //Display list of keyboard shortcuts //Display list of mouse commands //Diaplay list of Add-On pfx/sfx void MainWindow::on_DecodeButton_clicked() //Decode request { int n=m_sec0%m_TRperiod; @@ -1393,7 +1313,7 @@ void MainWindow::readFromStdout() //readFromStdout #ifdef WIN32 m=3; #endif - qDebug() << "aa" << n << m << t.trimmed(); +// qDebug() << "aa" << n << m << t.trimmed(); if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); @@ -1563,8 +1483,6 @@ void MainWindow::guiUpdate() m_startAnother=false; on_actionOpen_next_in_directory_triggered(); } - if(m_modeQ65==0 and m_modeTx=="Q65") on_pbTxMode_clicked(); - if(m_modeJT65==0 and m_modeTx=="JT65") on_pbTxMode_clicked(); if(nsec != m_sec0) { //Once per second // qDebug() << "AAA" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; @@ -1648,11 +1566,6 @@ void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg() message[22] = '\0'; } -void MainWindow::on_txFirstCheckBox_stateChanged(int nstate) //TxFirst -{ - m_txFirst = (nstate==2); -} - void MainWindow::set_ntx(int n) //set_ntx() { m_ntx=n; @@ -1872,12 +1785,6 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() } } -void MainWindow::on_setTxFreqButton_clicked() //Set Tx Freq -{ - m_setftx=1; - m_txFreq=m_wide_graph_window->QSOfreq(); -} - void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed { m_hisCall=t.toUpper().trimmed(); @@ -1896,35 +1803,6 @@ void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed ui->dxGridEntry->setText(m_hisGrid); } -void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button -{ -} - -void MainWindow::on_logQSOButton_clicked() //Log QSO button -{ - int nMHz=int(datcom_.fcenter); - QDateTime t = QDateTime::currentDateTimeUtc(); - QString qsoMode=lab5->text(); - if(m_modeTx.startsWith("Q65")) qsoMode=lab6->text(); - QString logEntry=t.date().toString("yyyy-MMM-dd,") + - t.time().toString("hh:mm,") + m_hisCall + "," + m_hisGrid + "," + - QString::number(nMHz) + "," + qsoMode + "\r\n"; - - int ret = QMessageBox::warning(this, "Log Entry", - "Please confirm log entry:\n\n" + logEntry + "\n", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - if(ret==QMessageBox::No) return; - QFile f("wsjt.log"); - if(!f.open(QFile::Append)) { - msgBox("Cannot open file \"wsjt.log\"."); - return; - } - QTextStream out(&f); - out << logEntry; - f.close(); - m_worked[m_hisCall]=true; -} - void MainWindow::on_actionErase_map65_rx_log_triggered() //Erase Rx log { int ret = QMessageBox::warning(this, "Confirm Erase", @@ -1935,83 +1813,6 @@ void MainWindow::on_actionErase_map65_rx_log_triggered() //Erase Rx log } } -void MainWindow::on_actionErase_map65_tx_log_triggered() //Erase Tx log -{ - int ret = QMessageBox::warning(this, "Confirm Erase", - "Are you sure you want to erase file map65_tx.log ?", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - if(ret==QMessageBox::Yes) { - QFile f("map65_tx.log"); - f.remove(); - } -} - -void MainWindow::on_actionNoJT65_triggered() -{ - m_mode65=0; - m_modeJT65=0; - m_TRperiod=60; - soundInThread.setPeriod(m_TRperiod); - soundOutThread.setPeriod(m_TRperiod); - m_wide_graph_window->setMode65(m_mode65); - m_wide_graph_window->setPeriod(m_TRperiod); - lab5->setStyleSheet(""); - lab5->setText(""); -} -void MainWindow::on_actionJT65A_triggered() -{ - m_mode="JT65A"; - m_modeJT65=1; - m_mode65=1; - m_modeJT65=1; - m_TRperiod=60; - soundInThread.setPeriod(m_TRperiod); - soundOutThread.setPeriod(m_TRperiod); - m_wide_graph_window->setMode65(m_mode65); - m_wide_graph_window->setPeriod(m_TRperiod); - lab5->setStyleSheet("QLabel{background-color: #ff6666}"); - lab5->setText("JT65A"); - ui->actionJT65A->setChecked(true); -} - -void MainWindow::on_actionJT65B_triggered() -{ - m_mode="JT65B"; - m_modeJT65=2; - m_mode65=2; - m_modeJT65=2; - m_TRperiod=60; - soundInThread.setPeriod(m_TRperiod); - soundOutThread.setPeriod(m_TRperiod); - m_wide_graph_window->setMode65(m_mode65); - m_wide_graph_window->setPeriod(m_TRperiod); - lab5->setStyleSheet("QLabel{background-color: #ffff66}"); - lab5->setText("JT65B"); - ui->actionJT65B->setChecked(true); -} - -void MainWindow::on_actionJT65C_triggered() -{ - m_mode="JT65C"; - m_modeJT65=3; - m_mode65=4; - m_TRperiod=60; - soundInThread.setPeriod(m_TRperiod); - soundOutThread.setPeriod(m_TRperiod); - m_wide_graph_window->setMode65(m_mode65); - m_wide_graph_window->setPeriod(m_TRperiod); - lab5->setStyleSheet("QLabel{background-color: #66ffb2}"); - lab5->setText("JT65C"); - ui->actionJT65C->setChecked(true); -} - -void MainWindow::on_actionNoQ65_triggered() -{ - m_modeQ65=0; - lab6->setStyleSheet(""); - lab6->setText(""); -} - void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; @@ -2026,7 +1827,6 @@ void MainWindow::on_actionQ65B_triggered() lab6->setText("Q65B"); } - void MainWindow::on_actionQ65C_triggered() { m_modeQ65=3; @@ -2060,50 +1860,11 @@ void MainWindow::on_NBslider_valueChanged(int n) m_NBslider=n; } -void MainWindow::on_actionAdjust_IQ_Calibration_triggered() -{ - m_adjustIQ=1; -} - -void MainWindow::on_actionApply_IQ_Calibration_triggered() -{ - m_applyIQcal= 1-m_applyIQcal; -} - void MainWindow::on_actionFUNcube_Dongle_triggered() { proc_qthid.start (QDir::toNativeSeparators(m_appDir + "/qthid"), QStringList {}); } -void MainWindow::on_actionEdit_wsjt_log_triggered() -{ - proc_editor.start (QDir::toNativeSeparators (m_editorCommand), {QDir::toNativeSeparators (m_appDir + "/wsjt.log"), }); -} - -void MainWindow::on_actionTx_Tune_triggered() -{ - if(g_pTxTune==NULL) { - g_pTxTune = new TxTune(0); - } - g_pTxTune->set_iqAmp(iqAmp); - g_pTxTune->set_iqPhase(iqPhase); - g_pTxTune->set_txPower(txPower); - g_pTxTune->show(); -} - -void MainWindow::on_pbTxMode_clicked() -{ - if(m_modeTx=="Q65") { - m_modeTx="JT65"; - ui->pbTxMode->setText("Tx JT65 #"); - } else { - m_modeTx="Q65"; - ui->pbTxMode->setText("Tx Q65 :"); - } -// m_wideGraph->setModeTx(m_modeTx); -// statusChanged(); -} - bool MainWindow::isGrid4(QString g) { if(g.length()!=4) return false; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 5525ce00d..105b5f010 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -66,34 +66,21 @@ private slots: void on_tolSpinBox_valueChanged(int arg1); void on_actionAstro_Data_triggered(); void on_stopButton_clicked(); - void on_actionRelease_Notes_triggered(); - void on_actionOnline_Users_Guide_triggered(); - void on_actionQSG_Q65_triggered(); - void on_actionQSG_MAP65_v3_triggered(); - void on_actionQ65_Sensitivity_in_MAP65_3_0_triggered(); void on_actionWide_Waterfall_triggered(); void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); void on_actionDelete_all_tf2_files_in_SaveDir_triggered(); - void on_actionFind_Delta_Phi_triggered(); - void on_actionF4_sets_Tx6_triggered(); - void on_actionOnly_EME_calls_triggered(); - void on_actionNo_shorthands_if_Tx1_triggered(); void on_actionNo_Deep_Search_triggered(); void on_actionNormal_Deep_Search_triggered(); void on_actionAggressive_Deep_Search_triggered(); void on_actionNone_triggered(); void on_actionSave_all_triggered(); - void on_actionKeyboard_shortcuts_triggered(); - void on_actionSpecial_mouse_commands_triggered(); - void on_actionAvailable_suffixes_and_add_on_prefixes_triggered(); void on_DecodeButton_clicked(); void decode(); void decodeBusy(bool b); void on_EraseButton_clicked(); void on_txb1_clicked(); - void on_txFirstCheckBox_stateChanged(int arg1); void set_ntx(int n); void on_txb2_clicked(); void on_txb3_clicked(); @@ -102,36 +89,21 @@ private slots: void on_txb6_clicked(); void on_lookupButton_clicked(); void on_addButton_clicked(); - void on_setTxFreqButton_clicked(); void on_dxCallEntry_textChanged(const QString &arg1); void on_dxGridEntry_textChanged(const QString &arg1); - void on_genStdMsgsPushButton_clicked(); void bumpDF(int n); - void on_logQSOButton_clicked(); void on_actionErase_map65_rx_log_triggered(); - void on_actionErase_map65_tx_log_triggered(); void on_NBcheckBox_toggled(bool checked); - void on_actionJT65A_triggered(); - void on_actionJT65B_triggered(); - void on_actionJT65C_triggered(); void on_NBslider_valueChanged(int value); - void on_actionAdjust_IQ_Calibration_triggered(); - void on_actionApply_IQ_Calibration_triggered(); void on_actionAFMHot_triggered(); void on_actionBlue_triggered(); void on_actionFUNcube_Dongle_triggered(); - void on_actionEdit_wsjt_log_triggered(); - void on_actionTx_Tune_triggered(); void on_actionQ65A_triggered(); void on_actionQ65B_triggered(); - void on_actionNoJT65_triggered(); - void on_actionNoQ65_triggered(); void on_actionQ65C_triggered(); void on_actionQ65D_triggered(); void on_actionQ65E_triggered(); - void on_pbTxMode_clicked(); - private: Ui::MainWindow *ui; QString m_appDir; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 8c416d8e2..fc25173c1 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -417,37 +417,6 @@ p, li { white-space: pre-wrap; } - - - - 40 - 80 - 90 - 23 - - - - - 0 - 0 - - - - - 90 - 0 - - - - - 70 - 16777215 - - - - &GenStdMsgs - - @@ -517,63 +486,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 23 - - - - - 80 - 16777215 - - - - Tx first - - - - - - - - 90 - 0 - - - - - 80 - 16777215 - - - - Tx Q65 $ - - - - - - - - 90 - 0 - - - - - 80 - 16777215 - - - - Set Tx Freq - - - @@ -1099,8 +1011,6 @@ p, li { white-space: pre-wrap; } - - @@ -1109,8 +1019,6 @@ p, li { white-space: pre-wrap; } Decode - - @@ -1128,26 +1036,14 @@ p, li { white-space: pre-wrap; } Help - - - - - - - - Mode - - - - - + @@ -1186,7 +1082,7 @@ p, li { white-space: pre-wrap; } - About MAP65 + About Q65W Ctrl+F1 @@ -1559,6 +1455,9 @@ p, li { white-space: pre-wrap; } true + + true + Q65C From 2a97ba420e1aa0c5106b106d635a59cde03f545b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 12:57:18 -0500 Subject: [PATCH 025/251] Removed more unused GUI controls. --- q65w/mainwindow.cpp | 55 -------- q65w/mainwindow.h | 6 - q65w/mainwindow.ui | 297 +------------------------------------------- 3 files changed, 2 insertions(+), 356 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 05e5211d0..7a5c28e89 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -79,15 +79,6 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionNormal_Deep_Search->setActionGroup(DepthGroup); ui->actionAggressive_Deep_Search->setActionGroup(DepthGroup); - QButtonGroup* txMsgButtonGroup = new QButtonGroup; - txMsgButtonGroup->addButton(ui->txrb1,1); - txMsgButtonGroup->addButton(ui->txrb2,2); - txMsgButtonGroup->addButton(ui->txrb3,3); - txMsgButtonGroup->addButton(ui->txrb4,4); - txMsgButtonGroup->addButton(ui->txrb5,5); - txMsgButtonGroup->addButton(ui->txrb6,6); - connect(txMsgButtonGroup,SIGNAL(buttonClicked(int)),SLOT(set_ntx(int))); - setWindowTitle (program_title ()); connect(&soundInThread, SIGNAL(readyForFFT(int)), @@ -793,10 +784,6 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent case Qt::Key_F4: ui->dxCallEntry->setText(""); ui->dxGridEntry->setText(""); - if(m_kb8rq) { - m_ntx=6; - ui->txrb6->setChecked(true); - } break; case Qt::Key_F6: if(e->modifiers() & Qt::ShiftModifier) { @@ -1571,48 +1558,6 @@ void MainWindow::set_ntx(int n) //set_ntx() m_ntx=n; } -void MainWindow::on_txb1_clicked() //txb1 -{ - m_ntx=1; - ui->txrb1->setChecked(true); - m_restart=true; -} - -void MainWindow::on_txb2_clicked() //txb2 -{ - m_ntx=2; - ui->txrb2->setChecked(true); - m_restart=true; -} - -void MainWindow::on_txb3_clicked() //txb3 -{ - m_ntx=3; - ui->txrb3->setChecked(true); - m_restart=true; -} - -void MainWindow::on_txb4_clicked() //txb4 -{ - m_ntx=4; - ui->txrb4->setChecked(true); - m_restart=true; -} - -void MainWindow::on_txb5_clicked() //txb5 -{ - m_ntx=5; - ui->txrb5->setChecked(true); - m_restart=true; -} - -void MainWindow::on_txb6_clicked() //txb6 -{ - m_ntx=6; - ui->txrb6->setChecked(true); - m_restart=true; -} - void MainWindow::lookup() //lookup() { QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 105b5f010..f067476c3 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -80,13 +80,7 @@ private slots: void decode(); void decodeBusy(bool b); void on_EraseButton_clicked(); - void on_txb1_clicked(); void set_ntx(int n); - void on_txb2_clicked(); - void on_txb3_clicked(); - void on_txb4_clicked(); - void on_txb5_clicked(); - void on_txb6_clicked(); void on_lookupButton_clicked(); void on_addButton_clicked(); void on_dxCallEntry_textChanged(const QString &arg1); diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index fc25173c1..ba778778f 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -652,303 +652,10 @@ p, li { white-space: pre-wrap; } - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - true - - - buttonGroup - - - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - buttonGroup - - - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - buttonGroup - - - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - buttonGroup - - - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - buttonGroup - - - - - - - - 16 - 0 - - - - - 0 - 20 - - - - - 20 - 16777215 - - - - - - - buttonGroup - - - - + - - - - - - 50 - 20 - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx1 - - - - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx2 - - - - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx3 - - - - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx4 - - - - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx5 - - - - - - - - 0 - 16 - - - - - 29 - 20 - - - - Tx6 - - - - + From cd5a92520856c94bb83b40f955b2519b8ac7512e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 13:17:46 -0500 Subject: [PATCH 026/251] Removing more unneeded GUI items. --- q65w/mainwindow.cpp | 45 ----------------------- q65w/mainwindow.h | 2 -- q65w/mainwindow.ui | 88 ++++++++------------------------------------- 3 files changed, 14 insertions(+), 121 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7a5c28e89..19dbf34a3 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -754,26 +754,6 @@ void MainWindow::on_actionAbout_triggered() //Display "About" dlg.exec(); } -void MainWindow::on_autoButton_clicked() //Auto -{ - m_auto = !m_auto; - if(m_auto) { - ui->autoButton->setStyleSheet(m_pbAutoOn_style); - ui->autoButton->setText("Auto is ON"); - } else { - btxok=false; - ui->autoButton->setStyleSheet(""); - ui->autoButton->setText("Auto is OFF"); - on_monitorButton_clicked(); - } -} - -void MainWindow::on_stopTxButton_clicked() //Stop Tx -{ - if(m_auto) on_autoButton_clicked(); - btxok=false; -} - void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent { switch(e->key()) @@ -1369,9 +1349,6 @@ void MainWindow::guiUpdate() } qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int nsec=ms/1000; - double tsec=0.001*ms; - double t2p=fmod(tsec,120.0); - bool bTxTime = (t2p >= tx1) and (t2p < tx2); if(bTune0 and !bTune) { btxok=false; @@ -1381,28 +1358,6 @@ void MainWindow::guiUpdate() if(bTune and !bTune0) bMonitoring0=m_monitoring; bTune0=bTune; - if(m_auto or bTune) { - if((bTxTime or bTune) and iptt==0 and !m_txMute) { - int itx=1; - int ierr = ptt_(&m_pttPort,&itx,&iptt); // Raise PTT - if(ierr != 0) { - on_stopTxButton_clicked(); - char s[18]; - sprintf(s,"Cannot open COM%d",m_pttPort); - msgBox(s); - } - - if(m_bIQxt) m_wide_graph_window->tx570(); // Set Si570 to Tx Freq - - if(!soundOutThread.isRunning()) { - soundOutThread.start(QThread::HighPriority); - } - } - if((!bTxTime and !bTune) or m_txMute) { - btxok=false; - } - } - // If PTT was just raised, start a countdown for raising TxOK: if(iptt==1 && iptt0==0) nc1=-9; // TxDelay = 0.8 s if(nc1 <= 0) nc1++; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index f067476c3..44db5e814 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -61,8 +61,6 @@ private slots: void on_actionAbout_triggered(); void on_actionLinrad_triggered(); void on_actionCuteSDR_triggered(); - void on_autoButton_clicked(); - void on_stopTxButton_clicked(); void on_tolSpinBox_valueChanged(int arg1); void on_actionAstro_Data_triggered(); void on_stopButton_clicked(); diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index ba778778f..5f61e48b1 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 635 + 472 523 @@ -18,7 +18,7 @@ - 635 + 472 0 @@ -111,19 +111,6 @@ p, li { white-space: pre-wrap; } - - - - - 50 - 0 - - - - Log &QSO - - - @@ -188,44 +175,6 @@ p, li { white-space: pre-wrap; } - - - - - 0 - 0 - - - - - 50 - 0 - - - - &Auto is OFF - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - St&op Tx - - - @@ -647,17 +596,17 @@ p, li { white-space: pre-wrap; } - - - - - - - - - - - + + + Qt::Horizontal + + + + 40 + 20 + + + @@ -670,7 +619,7 @@ p, li { white-space: pre-wrap; } 0 0 - 635 + 472 21 @@ -682,12 +631,9 @@ p, li { white-space: pre-wrap; } - - - @@ -697,12 +643,6 @@ p, li { white-space: pre-wrap; } - - - - - - From 2a2bc4e69b1d6af3788b01acdad9cda062eb0446 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 13:51:21 -0500 Subject: [PATCH 027/251] Remouve stuff related to soundout and txtune. --- q65w/CMakeLists.txt | 3 - q65w/mainwindow.cpp | 132 ++------------------------------------------ q65w/mainwindow.h | 7 --- q65w/q65w.pro | 8 +-- 4 files changed, 10 insertions(+), 140 deletions(-) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index c5c286d36..3a024d0e9 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -12,8 +12,6 @@ set (q65w_CXXSRCS set570.cpp signalmeter.cpp soundin.cpp - soundout.cpp - txtune.cpp widegraph.cpp ) @@ -26,7 +24,6 @@ set (q65w_UISRCS astro.ui devsetup.ui mainwindow.ui - txtune.ui widegraph.ui ) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 19dbf34a3..682dccecd 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -15,7 +15,6 @@ #include "about.h" #include "astro.h" #include "widegraph.h" -#include "txtune.h" #include "sleep.h" #include @@ -23,20 +22,16 @@ short int iwave[2*60*12000]; //Wave file for Tx audio int nwave; //Length of Tx waveform -bool btxok; //True if OK to transmit bool bTune; bool bIQxt; double outputLatency; //Latency in seconds -int txPower; int iqAmp; int iqPhase; qint16 id[4*60*96000]; -TxTune* g_pTxTune = NULL; QSharedMemory mem_m65("mem_m65"); extern const int RxDataFrequency = 96000; -extern const int TxDataFrequency = 11025; //-------------------------------------------------- MainWindow constructor MainWindow::MainWindow(QWidget *parent) : @@ -107,20 +102,14 @@ MainWindow::MainWindow(QWidget *parent) : m_auto=false; m_waterfallAvg = 1; m_network = true; - m_txFirst=false; - m_txMute=false; - btxok=false; m_restart=false; m_transmitting=false; m_widebandDecode=false; - m_ntx=1; m_myCall="K1JT"; m_myGrid="FN20qi"; m_saveDir="/users/joe/map65/install/save"; m_azelDir="/users/joe/map65/install/"; m_editorCommand="notepad"; - m_txFreq=125; - m_setftx=0; m_loopall=false; m_startAnother=false; m_saveAll=false; @@ -143,9 +132,6 @@ MainWindow::MainWindow(QWidget *parent) : m_modeJT65=0; m_modeQ65=0; m_TRperiod=60; - m_modeTx="JT65"; - bTune=false; - txPower=100; iqAmp=0; iqPhase=0; @@ -229,10 +215,6 @@ MainWindow::MainWindow(QWidget *parent) : if(m_xpol) soundInThread.setNrx(2); soundInThread.start(QThread::HighestPriority); - // Assign output device and start output thread - soundOutThread.setOutputDevice(m_paOutDevice); -// soundOutThread.start(QThread::HighPriority); - m_monitoring=true; // Start with Monitoring ON soundInThread.setMonitoring(m_monitoring); m_diskData=false; @@ -244,7 +226,6 @@ MainWindow::MainWindow(QWidget *parent) : m_wide_graph_window->m_mult570=m_mult570; m_wide_graph_window->m_mult570Tx=m_mult570Tx; m_wide_graph_window->m_cal570=m_cal570; - m_wide_graph_window->m_TxOffset=m_TxOffset; if(m_initIQplus) m_wide_graph_window->initIQplus(); // Create "m_worked", a dictionary of all calls in wsjt.log @@ -285,10 +266,6 @@ MainWindow::~MainWindow() soundInThread.quit(); soundInThread.wait(3000); } - if (soundOutThread.isRunning()) { - soundOutThread.quitExecution=true; - soundOutThread.wait(3000); - } Pa_Terminate(); fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); if(!m_decoderBusy) { @@ -306,7 +283,6 @@ void MainWindow::writeSettings() SettingsGroup g {&settings, "MainWindow"}; settings.setValue("geometry", saveGeometry()); settings.setValue("MRUdir", m_path); - settings.setValue("TxFirst",m_txFirst); settings.setValue("DXcall",ui->dxCallEntry->text()); settings.setValue("DXgrid",ui->dxGridEntry->text()); } @@ -315,7 +291,6 @@ void MainWindow::writeSettings() settings.setValue("MyCall",m_myCall); settings.setValue("MyGrid",m_myGrid); settings.setValue("IDint",m_idInt); - settings.setValue("PTTport",m_pttPort); settings.setValue("AstroFont",m_astroFont); settings.setValue("Xpol",m_xpol); settings.setValue("XpolX",m_xpolx); @@ -324,7 +299,6 @@ void MainWindow::writeSettings() settings.setValue("Editor",m_editorCommand); settings.setValue("DXCCpfx",m_dxccPfx); settings.setValue("Timeout",m_timeout); - settings.setValue("TxPower",txPower); settings.setValue("IQamp",iqAmp); settings.setValue("IQphase",iqPhase); settings.setValue("ApplyIQcal",m_applyIQcal); @@ -335,7 +309,6 @@ void MainWindow::writeSettings() settings.setValue("FSam96000", m_fs96000); settings.setValue("SoundInIndex",m_nDevIn); settings.setValue("paInDevice",m_paInDevice); - settings.setValue("SoundOutIndex",m_nDevOut); settings.setValue("paOutDevice",m_paOutDevice); settings.setValue("IQswap",m_IQswap); settings.setValue("Scale_dB",m_dB); @@ -349,7 +322,6 @@ void MainWindow::writeSettings() settings.setValue("Mode",m_mode); settings.setValue("nModeJT65",m_modeJT65); settings.setValue("nModeQ65",m_modeQ65); - settings.setValue("TxMode",m_modeTx); settings.setValue("SaveNone",ui->actionNone->isChecked()); settings.setValue("SaveAll",ui->actionSave_all->isChecked()); settings.setValue("NDepth",m_ndepth); @@ -362,9 +334,7 @@ void MainWindow::writeSettings() settings.setValue("PhaseX",(double)m_phasex); settings.setValue("PhaseY",(double)m_phasey); settings.setValue("Mult570",m_mult570); - settings.setValue("Mult570Tx",m_mult570Tx); settings.setValue("Cal570",m_cal570); - settings.setValue("TxOffset",m_TxOffset); settings.setValue("Colors",m_colors); settings.setValue("MaxDrift",ui->sbMaxDrift->value()); } @@ -379,14 +349,12 @@ void MainWindow::readSettings() ui->dxCallEntry->setText(settings.value("DXcall","").toString()); ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); m_path = settings.value("MRUdir", m_appDir + "/save").toString(); - m_txFirst = settings.value("TxFirst",false).toBool(); } SettingsGroup g {&settings, "Common"}; m_myCall=settings.value("MyCall","").toString(); m_myGrid=settings.value("MyGrid","").toString(); m_idInt=settings.value("IDint",0).toInt(); - m_pttPort=settings.value("PTTport",0).toInt(); m_astroFont=settings.value("AstroFont",20).toInt(); m_xpol=settings.value("Xpol",false).toBool(); ui->actionFind_Delta_Phi->setEnabled(m_xpol); @@ -396,7 +364,6 @@ void MainWindow::readSettings() m_editorCommand=settings.value("Editor","notepad").toString(); m_dxccPfx=settings.value("DXCCpfx","").toString(); m_timeout=settings.value("Timeout",20).toInt(); - txPower=settings.value("TxPower",100).toInt(); iqAmp=settings.value("IQamp",0).toInt(); iqPhase=settings.value("IQphase",0).toInt(); m_applyIQcal=settings.value("ApplyIQcal",0).toInt(); @@ -409,7 +376,6 @@ void MainWindow::readSettings() m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); m_paInDevice = settings.value("paInDevice",0).toInt(); - m_nDevOut = settings.value("SoundOutIndex", 0).toInt(); m_paOutDevice = settings.value("paOutDevice",0).toInt(); m_IQswap = settings.value("IQswap",false).toBool(); m_dB = settings.value("Scale_dB",0).toInt(); @@ -431,7 +397,6 @@ void MainWindow::readSettings() if(m_modeJT65==3) ui->actionJT65C->setChecked(true); m_modeQ65=settings.value("nModeQ65",2).toInt(); - m_modeTx=settings.value("TxMode","JT65").toString(); if(m_modeQ65==0) ui->actionNoQ65->setChecked(true); if(m_modeQ65==1) ui->actionQ65A->setChecked(true); if(m_modeQ65==2) ui->actionQ65B->setChecked(true); @@ -446,7 +411,6 @@ void MainWindow::readSettings() m_onlyEME=settings.value("NEME",false).toBool(); ui->actionOnly_EME_calls->setChecked(m_onlyEME); m_kb8rq=settings.value("KB8RQ",false).toBool(); - ui->actionF4_sets_Tx6->setChecked(m_kb8rq); m_NB=settings.value("NB",false).toBool(); ui->NBcheckBox->setChecked(m_NB); ui->sbMaxDrift->setValue(settings.value("MaxDrift",0).toInt()); @@ -457,9 +421,7 @@ void MainWindow::readSettings() m_phasex=settings.value("PhaseX",0.0).toFloat(); m_phasey=settings.value("PhaseY",0.0).toFloat(); m_mult570=settings.value("Mult570",2).toInt(); - m_mult570Tx=settings.value("Mult570Tx",1).toInt(); m_cal570=settings.value("Cal570",0.0).toDouble(); - m_TxOffset=settings.value("TxOffset",130.9).toDouble(); m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && @@ -632,7 +594,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_myCall=m_myCall; dlg.m_myGrid=m_myGrid; dlg.m_idInt=m_idInt; - dlg.m_pttPort=m_pttPort; dlg.m_astroFont=m_astroFont; dlg.m_xpol=m_xpol; dlg.m_xpolx=m_xpolx; @@ -654,9 +615,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_initIQplus=m_initIQplus; dlg.m_bIQxt=m_bIQxt; dlg.m_cal570=m_cal570; - dlg.m_TxOffset=m_TxOffset; dlg.m_mult570=m_mult570; - dlg.m_mult570Tx=m_mult570Tx; dlg.m_colors=m_colors; dlg.initDlg(); @@ -664,7 +623,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_myCall=dlg.m_myCall; m_myGrid=dlg.m_myGrid; m_idInt=dlg.m_idInt; - m_pttPort=dlg.m_pttPort; m_astroFont=dlg.m_astroFont; if(m_astro_window && m_astro_window->isVisible()) m_astro_window->setFontSize(m_astroFont); m_xpol=dlg.m_xpol; @@ -692,10 +650,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_bIQxt=dlg.m_bIQxt; m_colors=dlg.m_colors; m_cal570=dlg.m_cal570; - m_TxOffset=dlg.m_TxOffset; - m_mult570Tx=dlg.m_mult570Tx; m_wide_graph_window->m_mult570=m_mult570; - m_wide_graph_window->m_mult570Tx=m_mult570Tx; m_wide_graph_window->m_cal570=m_cal570; soundInThread.setSwapIQ(m_IQswap); soundInThread.setScale(m_dB); @@ -712,13 +667,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog soundInThread.setInputDevice(m_paInDevice); soundInThread.start(QThread::HighestPriority); } - - if(dlg.m_restartSoundOut) { - soundOutThread.quitExecution=true; - soundOutThread.wait(1000); - soundOutThread.setOutputDevice(m_paOutDevice); -// soundOutThread.start(QThread::HighPriority); - } } } @@ -758,9 +706,6 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent { switch(e->key()) { - case Qt::Key_F3: - m_txMute=!m_txMute; - break; case Qt::Key_F4: ui->dxCallEntry->setText(""); ui->dxGridEntry->setText(""); @@ -1328,45 +1273,18 @@ void MainWindow::decodeBusy(bool b) //decodeBusy() //------------------------------------------------------------- //guiUpdate() void MainWindow::guiUpdate() { - static int iptt0=0; - static int iptt=0; - static bool btxok0=false; - static bool bTune0=false; - static bool bMonitoring0=false; - static int nc0=1; - static int nc1=1; - static char msgsent[23]; - static int nsendingsh=0; int khsym=0; - double tx1=0.0; - double tx2=126.0*4096.0/11025.0 + 1.8; - if(m_modeTx=="Q65") tx2=85.0*7200.0/12000.0 + 1.8; - - if(!m_txFirst) { - tx1 += m_TRperiod; - tx2 += m_TRperiod; - } qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int nsec=ms/1000; - if(bTune0 and !bTune) { - btxok=false; - m_monitoring=bMonitoring0; - soundInThread.setMonitoring(m_monitoring); - } - if(bTune and !bTune0) bMonitoring0=m_monitoring; - bTune0=bTune; - -// If PTT was just raised, start a countdown for raising TxOK: - if(iptt==1 && iptt0==0) nc1=-9; // TxDelay = 0.8 s + /* if(nc1 <= 0) nc1++; if(nc1 == 0) { xSignalMeter->setValue(0); ySignalMeter->setValue(0); m_monitoring=false; soundInThread.setMonitoring(false); - btxok=true; m_transmitting=true; m_wide_graph_window->enableSetRxHardware(false); @@ -1385,30 +1303,7 @@ void MainWindow::guiUpdate() ; f.close(); } - -// If btxok was just lowered, start a countdown for lowering PTT - if(!btxok && btxok0 && iptt==1) nc0=-11; //RxDelay = 1.0 s - btxok0=btxok; - if(nc0 <= 0) nc0++; - if(nc0 == 0) { - if(m_bIQxt) m_wide_graph_window->rx570(); // Set Si570 back to Rx Freq - int itx=0; - ptt_(&m_pttPort,&itx,&iptt); // Lower PTT - if(!m_txMute) { - soundOutThread.quitExecution=true;\ - } - m_transmitting=false; - m_wide_graph_window->enableSetRxHardware(true); - if(m_auto) { - m_monitoring=true; - soundInThread.setMonitoring(m_monitoring); - } - } - - if(iptt == 0 && !btxok) { - // sending="" - // nsendingsh=0 - } +*/ if(m_monitoring) { ui->monitorButton->setStyleSheet(m_pbmonitor_style); @@ -1427,7 +1322,7 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << m_mode65 << m_modeQ65 << m_modeTx; +// qDebug() << "AAA" << nsec%60 << m_modeQ65; soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); @@ -1437,18 +1332,7 @@ void MainWindow::guiUpdate() lab4->setStyleSheet(""); } - if(m_transmitting) { - if(nsendingsh==1) { - lab1->setStyleSheet("QLabel{background-color: #66ffff}"); - } else if(nsendingsh==-1) { - lab1->setStyleSheet("QLabel{background-color: #ffccff}"); - } else { - lab1->setStyleSheet("QLabel{background-color: #ffff33}"); - } - char s[37]; - sprintf(s,"Tx: %s",msgsent); - lab1->setText(s); - } else if(m_monitoring) { + if(m_monitoring) { lab1->setStyleSheet("QLabel{background-color: #00ff00}"); m_nrx=soundInThread.nrx(); khsym=soundInThread.mhsym(); @@ -1489,7 +1373,6 @@ void MainWindow::guiUpdate() m_hsym0=khsym; m_sec0=nsec; } - iptt0=iptt; bIQxt=m_bIQxt; } @@ -1508,11 +1391,6 @@ void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg() message[22] = '\0'; } -void MainWindow::set_ntx(int n) //set_ntx() -{ - m_ntx=n; -} - void MainWindow::lookup() //lookup() { QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); @@ -1646,6 +1524,7 @@ void MainWindow::on_addButton_clicked() //Add button } } +/* void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() { // if(t.length()<1) return 0; @@ -1684,6 +1563,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() tx->setText(t); } } +*/ void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed { diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 44db5e814..e8ed20a2f 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -10,7 +10,6 @@ #include #include "getfile.h" #include "soundin.h" -#include "soundout.h" #include "signalmeter.h" #include "commons.h" #include "sleep.h" @@ -78,7 +77,6 @@ private slots: void decode(); void decodeBusy(bool b); void on_EraseButton_clicked(); - void set_ntx(int n); void on_lookupButton_clicked(); void on_addButton_clicked(); void on_dxCallEntry_textChanged(const QString &arg1); @@ -111,8 +109,6 @@ private: qint32 m_DF; qint32 m_tol; qint32 m_QSOfreq0; - qint32 m_ntx; - qint32 m_pttPort; qint32 m_astroFont; qint32 m_timeout; qint32 m_dPhi; @@ -225,7 +221,6 @@ private: SoundInThread soundInThread; //Instantiate the audio threads - SoundOutThread soundOutThread; //---------------------------------------------------- private functions void readSettings(); @@ -266,8 +261,6 @@ extern "C" { char* msgsent, short iwave[], int* nwave, int len1, int len2); - int ptt_(int* nport, int* itx, int* iptt); - void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, const char* mygrid, int* ndop00, int len1); } diff --git a/q65w/q65w.pro b/q65w/q65w.pro index e51c56a47..276386e31 100644 --- a/q65w/q65w.pro +++ b/q65w/q65w.pro @@ -30,19 +30,19 @@ DEFINES = UNIX } SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ - soundin.cpp soundout.cpp devsetup.cpp \ + soundin.cpp devsetup.cpp \ widegraph.cpp getfile.cpp \ astro.cpp displaytext.cpp getdev.cpp \ - txtune.cpp meterwidget.cpp signalmeter.cpp + meterwidget.cpp signalmeter.cpp win32 { SOURCES += killbyname.cpp set570.cpp } -HEADERS += mainwindow.h plotter.h soundin.h soundout.h \ +HEADERS += mainwindow.h plotter.h soundin.h \ about.h devsetup.h widegraph.h getfile.h \ commons.h sleep.h astro.h displaytext.h \ - txtune.h meterwidget.h signalmeter.h + meterwidget.h signalmeter.h FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ astro.ui txtune.ui From 8a70f9c13116bd2d02a7e2b2aba9e98100843e7c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 13:58:12 -0500 Subject: [PATCH 028/251] Remove more soundout stuff. --- q65w/devsetup.cpp | 4 - q65w/devsetup.h | 1 - q65w/soundout.cpp | 207 ------------------------------- q65w/soundout.h | 44 ------- q65w/txtune.cpp | 116 ------------------ q65w/txtune.h | 48 -------- q65w/txtune.ui | 302 ---------------------------------------------- 7 files changed, 722 deletions(-) delete mode 100644 q65w/soundout.cpp delete mode 100644 q65w/soundout.h delete mode 100644 q65w/txtune.cpp delete mode 100644 q65w/txtune.h delete mode 100644 q65w/txtune.ui diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index fe9d14a95..d895a7b86 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -12,7 +12,6 @@ DevSetup::DevSetup(QWidget *parent) : QDialog(parent) { ui.setupUi(this); //setup the dialog form m_restartSoundIn=false; - m_restartSoundOut=false; } DevSetup::~DevSetup() @@ -149,9 +148,6 @@ void DevSetup::accept() m_xpol!=ui.cbXpol->isChecked() or m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true; - if(m_nDevOut!=ui.comboBoxSndOut->currentIndex() or - m_paOutDevice!=m_outDevList[m_nDevOut]) m_restartSoundOut=true; - m_myCall=ui.myCallEntry->text(); m_myGrid=ui.myGridEntry->text(); m_idInt=ui.idIntSpinBox->value(); diff --git a/q65w/devsetup.h b/q65w/devsetup.h index c32a83e96..ce697388c 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -39,7 +39,6 @@ public: bool m_xpol; bool m_IQswap; bool m_restartSoundIn; - bool m_restartSoundOut; bool m_initIQplus; bool m_bIQxt; diff --git a/q65w/soundout.cpp b/q65w/soundout.cpp deleted file mode 100644 index e74d0549d..000000000 --- a/q65w/soundout.cpp +++ /dev/null @@ -1,207 +0,0 @@ -#include "soundout.h" - -#ifdef Q_OS_WIN32 -#include -#endif - -#define FRAMES_PER_BUFFER 256 - -#include - -extern float gran(); //Noise generator (for tests only) - -extern short int iwave[2*60*11025]; //Wave file for Tx audio -extern int nwave; -extern bool btxok; -extern bool bTune; -extern bool bIQxt; -extern int iqAmp; -extern int iqPhase; -extern int txPower; -extern double outputLatency; - -typedef struct //Parameters sent to or received from callback function -{ - int nTRperiod; -} paUserData; - -//--------------------------------------------------------------- d2aCallback -extern "C" int d2aCallback(const void * /*inputBuffer*/, void *outputBuffer, - unsigned long framesToProcess, - const PaStreamCallbackTimeInfo* /*timeInfo*/, - PaStreamCallbackFlags /*statusFlags*/, - void *userData ) -{ - paUserData *udata=(paUserData*)userData; - short *wptr = (short*)outputBuffer; - unsigned int i; - static int n; - static int ic=0; - static bool btxok0=false; - static bool bTune0=false; - static int nStart=0; - static double phi=0.; - double tsec,tstart,dphi; - int nsec; - int nTRperiod=udata->nTRperiod; - - // Get System time - qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; - tsec = 0.001*ms; - nsec = ms/1000; - qreal dPhase=iqPhase/5729.57795131; - qreal amp=1.0 + 0.0001*iqAmp; - qreal xAmp=txPower*295.00*qSqrt(2.0 - amp*amp); - qreal yAmp=txPower*295.00*amp; - static int nsec0=0; - - if(bTune) { - ic=0; - dphi=6.28318530718*1270.46/11025.0; - } - if(bTune0 and !bTune) btxok=false; - bTune0=bTune; - - if(nsec!=nsec0) { -// qDebug() << txPower << iqAmp << iqPhase << amp << xAmp << yAmp << dPhase << bTune; -// qDebug() << "A" << nsec%60 << bTune << btxok; -// ic=0; - nsec0=nsec; - } - - if(btxok and !btxok0) { //Start (or re-start) a transmission - n=nsec/nTRperiod; - tstart=tsec - n*nTRperiod - 1.0; - - if(tstart<1.0) { - ic=0; //Start of Tx cycle, set starting index to 0 - nStart=n; - } else { - if(n != nStart) { //Late start in new Tx cycle: compute starting index - ic=(int)(tstart*11025.0); - ic=2*ic; - nStart=n; - } - } - } - btxok0=btxok; - - if(btxok) { - for(i=0 ; i nwave) {i2a=0; i2b=0;} -// i2 = 500.0*(i2/32767.0 + 5.0*gran()); //Add noise (tests only!) -// if(bIQxt) { - if(1) { - if(bTune) { - phi += dphi; - } else { - phi=qAtan2(qreal(i2b),qreal(i2a)); - } - i2a=xAmp*qCos(phi); - i2b=yAmp*qSin(phi + dPhase); -// qDebug() << xAmp << yAmp << phi << i2a << i2b; - } -// i2a=0.01*txPower*i2a; -// i2b=0.01*txPower*i2b; - *wptr++ = i2b; //left - *wptr++ = i2a; //right - } - } else { - for(i=0 ; i nwave) { - btxok=0; - ic=0; - } - return 0; -} - -namespace -{ - struct COMWrapper - { - explicit COMWrapper () - { -#ifdef Q_OS_WIN32 - // required because Qt only does this for GUI thread - CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); -#endif - } - ~COMWrapper () - { -#ifdef Q_OS_WIN32 - CoUninitialize (); -#endif - } - }; -} - -void SoundOutThread::run() -{ - COMWrapper c; - - PaError paerr; - PaStreamParameters outParam; - PaStream *outStream; - paUserData udata; - quitExecution = false; - - auto device_info = Pa_GetDeviceInfo (m_nDevOut); - - outParam.device=m_nDevOut; //Output device number - outParam.channelCount=2; //Number of analog channels - outParam.sampleFormat=paInt16; //Send short ints to PortAudio - outParam.suggestedLatency=device_info->defaultLowOutputLatency; - outParam.hostApiSpecificStreamInfo=NULL; - - udata.nTRperiod=m_TRperiod; - paerr=Pa_IsFormatSupported(NULL,&outParam,11025.0); - if(paerr<0) { - qDebug() << "PortAudio says requested output format not supported."; - qDebug() << paerr; - return; - } - paerr=Pa_OpenStream(&outStream, //Output stream - NULL, //No input parameters - &outParam, //Output parameters - 11025.0, //Sample rate - FRAMES_PER_BUFFER, //Frames per buffer - paClipOff, //No clipping - d2aCallback, //output callbeck routine - &udata); //userdata - - paerr=Pa_StartStream(outStream); - if(paerr<0) { - qDebug() << "Failed to start audio output stream."; - return; - } - const PaStreamInfo* p=Pa_GetStreamInfo(outStream); - outputLatency = p->outputLatency; - bool qe = quitExecution; - -//---------------------------------------------- Soundcard output loop - while (!qe) { - qe = quitExecution; - if (qe) break; - msleep(100); - } - Pa_StopStream(outStream); - Pa_CloseStream(outStream); -} - -void SoundOutThread::setOutputDevice(int n) //setOutputDevice() -{ - if (isRunning()) return; - this->m_nDevOut=n; -} - -void SoundOutThread::setPeriod(int n) -{ - m_TRperiod=n; -} diff --git a/q65w/soundout.h b/q65w/soundout.h deleted file mode 100644 index 294c6fa5f..000000000 --- a/q65w/soundout.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef SOUNDOUT_H -#define SOUNDOUT_H -#include -#include - -// An instance of this thread sends audio data to a specified soundcard. -// Output can be muted while underway, preserving waveform timing when -// transmission is resumed. - -class SoundOutThread : public QThread -{ - Q_OBJECT - -protected: - virtual void run(); - -public: -// Constructs (but does not start) a SoundOutThread - SoundOutThread() - : quitExecution(false) // Initialize some private members - , m_rate(0) - , m_nwave(48*11025) - , m_txOK(false) - , m_txMute(false) - { - } - -public: - void setOutputDevice(qint32 n); - void setPeriod(int n); - bool quitExecution; //If true, thread exits gracefully - - -// Private members -private: - double m_rate; //Sample rate - qint32 m_nDevOut; //Output device number - qint32 m_nwave; //Length of wave file - qint32 m_TRperiod; //T/R period (30 or 60 s) - bool m_txOK; //Enable Tx audio - bool m_txMute; //Mute temporarily -}; - -#endif diff --git a/q65w/txtune.cpp b/q65w/txtune.cpp deleted file mode 100644 index b1d7fb71d..000000000 --- a/q65w/txtune.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "txtune.h" -#include "ui_txtune.h" -#include - -extern int txPower; -extern int iqAmp; -extern int iqPhase; -extern bool bTune; - -TxTune::TxTune(QWidget *parent) : - QDialog(parent), - ui(new Ui::TxTune) -{ - ui->setupUi(this); -} - -TxTune::~TxTune() -{ - delete ui; -} - -void TxTune::accept() -{ - if(bTune) on_pbTune_clicked(); - QDialog::accept(); -} - -void TxTune::reject() -{ - if(bTune) on_pbTune_clicked(); - set_iqAmp(m_saveAmp); - set_iqPhase(m_savePha); - set_txPower(m_saveTxPower); - QDialog::reject(); -} - -void TxTune::on_pwrSlider_valueChanged(int n) -{ - txPower=n; - ui->labPower->setText (QString {"%1 %"}.arg (n)); -} - -void TxTune::on_ampSlider_valueChanged(int n) -{ - m_iqAmp1=n; - iqAmp=10*m_iqAmp1 + m_iqAmp2; - ui->labAmpReal->setText (QString::number (1.0 + 0.0001 * iqAmp, 'f', 4)); -} - -void TxTune::on_fineAmpSlider_valueChanged(int n) -{ - m_iqAmp2=n; - iqAmp=10*m_iqAmp1 + m_iqAmp2; - ui->labAmpReal->setText (QString::number (1.0 + 0.0001*iqAmp, 'f', 4)); -} - -void TxTune::on_phaSlider_valueChanged(int n) -{ - m_iqPha1=n; - iqPhase=10*m_iqPha1 + m_iqPha2; - ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); -} - -void TxTune::on_finePhaSlider_valueChanged(int n) -{ - m_iqPha2=n; - iqPhase=10*m_iqPha1 + m_iqPha2; - ui->labPhaReal->setText (QString::number (0.01*iqPhase, 'f', 2)); -} - -void TxTune::set_iqAmp(int n) -{ - m_saveAmp=n; - m_iqAmp1=n/10; - m_iqAmp2=n%10; - ui->ampSlider->setValue(m_iqAmp1); - ui->fineAmpSlider->setValue(m_iqAmp2); -} - -void TxTune::set_iqPhase(int n) -{ - m_savePha=n; - m_iqPha1=n/10; - m_iqPha2=n%10; - ui->phaSlider->setValue(m_iqPha1); - ui->finePhaSlider->setValue(m_iqPha2); -} - -void TxTune::set_txPower(int n) -{ - m_saveTxPower=n; - ui->pwrSlider->setValue(n); -} - -void TxTune::on_cbTxImage_toggled(bool b) -{ - ui->ampSlider->setEnabled(b); - ui->fineAmpSlider->setEnabled(b); - ui->labAmp->setEnabled(b); - ui->labFineAmp->setEnabled(b); - ui->phaSlider->setEnabled(b); - ui->finePhaSlider->setEnabled(b); - ui->labPha->setEnabled(b); - ui->labFinePha->setEnabled(b); -} - -void TxTune::on_pbTune_clicked() -{ - bTune = !bTune; - if(bTune) { - QString style="QPushButton{background-color: red;}"; - ui->pbTune->setStyleSheet(style); - } else { - ui->pbTune->setStyleSheet(""); - } -} diff --git a/q65w/txtune.h b/q65w/txtune.h deleted file mode 100644 index e60015726..000000000 --- a/q65w/txtune.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef TXTUNE_H -#define TXTUNE_H - -#include - -namespace Ui { -class TxTune; -} - -class TxTune : public QDialog -{ - Q_OBJECT - -public: - explicit TxTune(QWidget *parent = 0); - ~TxTune(); - -public slots: - void accept(); - void reject(); - -private slots: - void on_pwrSlider_valueChanged(int n); - void on_ampSlider_valueChanged(int n); - void on_phaSlider_valueChanged(int n); - void on_cbTxImage_toggled(bool b); - void on_pbTune_clicked(); - void on_fineAmpSlider_valueChanged(int n); - void on_finePhaSlider_valueChanged(int n); - -public: - void set_iqAmp(int n); - void set_iqPhase(int n); - void set_txPower(int n); - -private: - qint32 m_iqAmp1; - qint32 m_iqAmp2; - qint32 m_iqPha1; - qint32 m_iqPha2; - qint32 m_saveAmp; - qint32 m_savePha; - qint32 m_saveTxPower; - - Ui::TxTune *ui; -}; - -#endif // TXTUNE_H diff --git a/q65w/txtune.ui b/q65w/txtune.ui deleted file mode 100644 index af78cd418..000000000 --- a/q65w/txtune.ui +++ /dev/null @@ -1,302 +0,0 @@ - - - TxTune - - - - 0 - 0 - 400 - 300 - - - - Tx Tune - - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - false - - - - - - 13 - 38 - 351 - 191 - - - - - - - - 70 - 0 - - - - Tx Power: - - - - - - - 100 - - - 100 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - 10 - - - - - - - Enable Tx I/Q Adjustment - - - - - - - false - - - - 70 - 0 - - - - I/Q Amplitude: - - - - - - - false - - - -100 - - - 100 - - - 0 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - - - - - false - - - Fine: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - false - - - -100 - - - 100 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - - - - - false - - - - 70 - 0 - - - - I/Q Phase: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - false - - - -100 - - - 100 - - - 0 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - - - - - false - - - Fine: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - false - - - -100 - - - 100 - - - Qt::Horizontal - - - QSlider::TicksBelow - - - - - - - 1.0000 - - - Qt::AlignCenter - - - - - - - 0.000 - - - Qt::AlignCenter - - - - - - - Tune - - - - - - - 100 % - - - Qt::AlignCenter - - - - - - - - - - buttonBox - accepted() - TxTune - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - TxTune - reject() - - - 316 - 260 - - - 286 - 274 - - - - - From fa5a63df8a27146c14b31c9210019bebd2336513 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 14:13:05 -0500 Subject: [PATCH 029/251] Removinf unised stuff from devsetup. --- q65w/devsetup.cpp | 26 ---- q65w/devsetup.h | 3 - q65w/devsetup.ui | 343 -------------------------------------------- q65w/mainwindow.cpp | 94 ++++-------- 4 files changed, 25 insertions(+), 441 deletions(-) diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index d895a7b86..6b67ff9cb 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -80,17 +80,9 @@ void DevSetup::initDlg() ui.myCallEntry->setText(m_myCall); ui.myGridEntry->setText(m_myGrid); - ui.idIntSpinBox->setValue(m_idInt); - ui.pttComboBox->setCurrentIndex(m_pttPort); ui.astroFont->setValue(m_astroFont); - ui.cbXpol->setChecked(m_xpol); - ui.rbAntennaX->setChecked(m_xpolx); ui.saveDirEntry->setText(m_saveDir); ui.azelDirEntry->setText(m_azelDir); - ui.editorEntry->setText(m_editorCommand); - ui.dxccEntry->setText(m_dxccPfx); - ui.timeoutSpinBox->setValue(m_timeout); - ui.dPhiSpinBox->setValue(m_dPhi); ui.fCalSpinBox->setValue(m_fCal); ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); ui.networkRadioButton->setChecked(m_network); @@ -145,22 +137,13 @@ void DevSetup::accept() if(m_network!=ui.networkRadioButton->isChecked() or m_nDevIn!=ui.comboBoxSndIn->currentIndex() or m_paInDevice!=m_inDevList[m_nDevIn] or - m_xpol!=ui.cbXpol->isChecked() or m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true; m_myCall=ui.myCallEntry->text(); m_myGrid=ui.myGridEntry->text(); - m_idInt=ui.idIntSpinBox->value(); - m_pttPort=ui.pttComboBox->currentIndex(); m_astroFont=ui.astroFont->value(); - m_xpol=ui.cbXpol->isChecked(); - m_xpolx=ui.rbAntennaX->isChecked(); m_saveDir=ui.saveDirEntry->text(); m_azelDir=ui.azelDirEntry->text(); - m_editorCommand=ui.editorEntry->text(); - m_dxccPfx=ui.dxccEntry->text(); - m_timeout=ui.timeoutSpinBox->value(); - m_dPhi=ui.dPhiSpinBox->value(); m_fCal=ui.fCalSpinBox->value(); m_fAdd=ui.faddEntry->text().toDouble(); m_network=ui.networkRadioButton->isChecked(); @@ -194,15 +177,6 @@ void DevSetup::on_soundCardRadioButton_toggled(bool checked) ui.sb_dB->setEnabled(checked); } -void DevSetup::on_cbXpol_stateChanged(int n) -{ - m_xpol = (n!=0); - ui.rbAntenna->setEnabled(m_xpol); - ui.rbAntennaX->setEnabled(m_xpol); - ui.dPhiSpinBox->setEnabled(m_xpol); - ui.labelDphi->setEnabled(m_xpol); -} - void DevSetup::on_cal570SpinBox_valueChanged(double ppm) { m_cal570=ppm; diff --git a/q65w/devsetup.h b/q65w/devsetup.h index ce697388c..71dad4027 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -33,10 +33,8 @@ public: double m_cal570; double m_TxOffset; - bool m_xpolx; bool m_network; bool m_fs96000; - bool m_xpol; bool m_IQswap; bool m_restartSoundIn; bool m_initIQplus; @@ -57,7 +55,6 @@ public slots: private slots: void on_soundCardRadioButton_toggled(bool checked); - void on_cbXpol_stateChanged(int arg1); void on_cal570SpinBox_valueChanged(double ppm); void on_mult570SpinBox_valueChanged(int mult); void on_sbBackgroundRed_valueChanged(int arg1); diff --git a/q65w/devsetup.ui b/q65w/devsetup.ui index 48f2a0b2c..ffd4a7fba 100644 --- a/q65w/devsetup.ui +++ b/q65w/devsetup.ui @@ -63,32 +63,6 @@ - - - - - 0 - 20 - - - - ID Interval (min): - - - - - - - - 0 - 20 - - - - PTT Port: - - - @@ -126,99 +100,6 @@ - - - - -20 - - - 10 - - - - - - - - 60 - 16777215 - - - - false - - - - None - - - - - COM1 - - - - - COM2 - - - - - COM3 - - - - - COM4 - - - - - COM5 - - - - - COM6 - - - - - COM7 - - - - - COM8 - - - - - COM9 - - - - - COM10 - - - - - COM11 - - - - - COM12 - - - - - COM13 - - - - @@ -252,32 +133,6 @@ - - - - - 0 - 20 - - - - DXCC: - - - - - - - - 0 - 20 - - - - Timeout (min): - - - @@ -324,26 +179,6 @@ - - - - - 16777215 - 16777215 - - - - PJ9 - - - - - - - 40 - - - @@ -381,154 +216,6 @@ - - - - - 0 - 0 - - - - - 0 - 55 - - - - Antennas: - - - - - 10 - 23 - 321 - 22 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Xpol - - - true - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - + - - - true - - - - - - - x - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - - 0 - 20 - - - - Dphi: - - - - - - - - 0 - 20 - - - - -180 - - - 180 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - @@ -577,36 +264,6 @@ - - - - - - - 80 - 20 - - - - Editor command: - - - - - - - - 328 - 16777215 - - - - notepad - - - - - diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 682dccecd..f4e6abe68 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -211,8 +211,6 @@ MainWindow::MainWindow(QWidget *parent) : soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); soundInThread.setPort(m_udpPort); - if(!m_xpol) soundInThread.setNrx(1); - if(m_xpol) soundInThread.setNrx(2); soundInThread.start(QThread::HighestPriority); m_monitoring=true; // Start with Monitoring ON @@ -292,8 +290,6 @@ void MainWindow::writeSettings() settings.setValue("MyGrid",m_myGrid); settings.setValue("IDint",m_idInt); settings.setValue("AstroFont",m_astroFont); - settings.setValue("Xpol",m_xpol); - settings.setValue("XpolX",m_xpolx); settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); settings.setValue("Editor",m_editorCommand); @@ -356,9 +352,6 @@ void MainWindow::readSettings() m_myGrid=settings.value("MyGrid","").toString(); m_idInt=settings.value("IDint",0).toInt(); m_astroFont=settings.value("AstroFont",20).toInt(); - m_xpol=settings.value("Xpol",false).toBool(); - ui->actionFind_Delta_Phi->setEnabled(m_xpol); - m_xpolx=settings.value("XpolX",false).toBool(); m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); m_editorCommand=settings.value("Editor","notepad").toString(); @@ -444,13 +437,13 @@ void MainWindow::dataSink(int k) static int ntrz=0; static int nkhz; static int nfsample=96000; - static int nxpol=0; static int nsec0=0; static int nsum=0; static float fgreen; static int ndiskdat; static int nb; static int nadj=0; + static int nxpol=0; static float px=0.0,py=0.0; static uchar lstrong[1024]; static float rejectx; @@ -470,8 +463,6 @@ void MainWindow::dataSink(int k) if(m_NB) nb=1; nfsample=96000; if(!m_fs96000) nfsample=95238; - nxpol=0; - if(m_xpol) nxpol=1; fgreen=m_wide_graph_window->fGreen(); nadj++; if(m_adjustIQ==0) nadj=0; @@ -494,21 +485,14 @@ void MainWindow::dataSink(int k) QString t; m_pctZap=nzap/178.3; - ui->yMeterFrame->setVisible(m_xpol); - if(m_xpol) { - lab4->setText ( - QString {" Rx noise: %1 %2 %3 %% "} - .arg (px, 5, 'f', 1) - .arg (py, 5, 'f', 1) - .arg (m_pctZap, 5, 'f', 1) - ); - } else { - lab4->setText ( - QString {" Rx noise: %1 %2 %% "} - .arg (px, 5, 'f', 1) - .arg (m_pctZap, 5, 'f', 1) - ); - } + ui->yMeterFrame->setVisible(false); + + lab4->setText ( + QString {" Rx noise: %1 %2 %% "} + .arg (px, 5, 'f', 1) + .arg (m_pctZap, 5, 'f', 1) + ); + xSignalMeter->setValue(px); // Update the signal meters ySignalMeter->setValue(py); if(m_monitoring || m_diskData) { @@ -516,20 +500,11 @@ void MainWindow::dataSink(int k) } if(nadj == 10) { - if(m_xpol) { - ui->decodedTextBrowser->append ( - QString {"Amp: %1 %2 Phase: %3 %4"} - .arg (m_gainx, 6, 'f', 4).arg (m_gainy, 6, 'f', 4) - .arg (m_phasex, 6, 'f', 4) - .arg (m_phasey, 6, 'f', 4) - ); - } else { - ui->decodedTextBrowser->append( - QString {"Amp: %1 Phase: %1"} - .arg (m_gainx, 6, 'f', 4) - .arg (m_phasex, 6, 'f', 4) - ); - } + ui->decodedTextBrowser->append( + QString {"Amp: %1 Phase: %1"} + .arg (m_gainx, 6, 'f', 4) + .arg (m_phasex, 6, 'f', 4) + ); ui->decodedTextBrowser->append(t); m_adjustIQ=0; } @@ -572,9 +547,8 @@ void MainWindow::dataSink(int k) if(m_saveAll and !m_diskData) { QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + t.time().toString("hhmm"); - if(m_xpol) fname += ".tf2"; - if(!m_xpol) fname += ".iq"; - *future2 = QtConcurrent::run(savetf2, fname, m_xpol); + fname += ".iq"; + *future2 = QtConcurrent::run(savetf2, fname, false); watcher2->setFuture(*future2); } } @@ -595,8 +569,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_myGrid=m_myGrid; dlg.m_idInt=m_idInt; dlg.m_astroFont=m_astroFont; - dlg.m_xpol=m_xpol; - dlg.m_xpolx=m_xpolx; dlg.m_saveDir=m_saveDir; dlg.m_azelDir=m_azelDir; dlg.m_editorCommand=m_editorCommand; @@ -625,9 +597,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_idInt=dlg.m_idInt; m_astroFont=dlg.m_astroFont; if(m_astro_window && m_astro_window->isVisible()) m_astro_window->setFontSize(m_astroFont); - m_xpol=dlg.m_xpol; - ui->actionFind_Delta_Phi->setEnabled(m_xpol); - m_xpolx=dlg.m_xpolx; + ui->actionFind_Delta_Phi->setEnabled(false); m_saveDir=dlg.m_saveDir; m_azelDir=dlg.m_azelDir; m_editorCommand=dlg.m_editorCommand; @@ -662,8 +632,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog if(m_fs96000) soundInThread.setRate(96000.0); if(!m_fs96000) soundInThread.setRate(95238.1); soundInThread.setFadd(m_fAdd); - if(!m_xpol) soundInThread.setNrx(1); - if(m_xpol) soundInThread.setNrx(2); + soundInThread.setNrx(1); soundInThread.setInputDevice(m_paInDevice); soundInThread.start(QThread::HighestPriority); } @@ -883,18 +852,12 @@ void MainWindow::on_actionOpen_triggered() //Open File m_monitoring=false; soundInThread.setMonitoring(m_monitoring); QString fname; - if(m_xpol) { - fname=QFileDialog::getOpenFileName(this, "Open File", m_path, - "MAP65 Files (*.tf2)"); - } else { - fname=QFileDialog::getOpenFileName(this, "Open File", m_path, - "MAP65 Files (*.iq)"); - } + fname=QFileDialog::getOpenFileName(this, "Open File", m_path, + "MAP65 Files (*.iq)"); if(fname != "") { m_path=fname; int i; i=fname.indexOf(".iq") - 11; - if(m_xpol) i=fname.indexOf(".tf2") - 11; if(i>=0) { lab1->setStyleSheet("QLabel{background-color: #66ff66}"); lab1->setText(" " + fname.mid(i,15) + " "); @@ -903,7 +866,7 @@ void MainWindow::on_actionOpen_triggered() //Open File m_diskData=true; int dbDgrd=0; if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; - *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + *future1 = QtConcurrent::run(getfile, fname, false, dbDgrd); watcher1->setFuture(*future1); } } @@ -913,11 +876,7 @@ void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next int i,len; QFileInfo fi(m_path); QStringList list; - if(m_xpol) { - list= fi.dir().entryList().filter(".tf2"); - } else { - list= fi.dir().entryList().filter(".iq"); - } + list= fi.dir().entryList().filter(".iq"); for (i = 0; i < list.size()-1; ++i) { if(i==list.size()-2) m_loopall=false; len=list.at(i).length(); @@ -927,7 +886,6 @@ void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next m_path=fname; int i; i=fname.indexOf(".iq") - 11; - if(m_xpol) i=fname.indexOf(".tf2") - 11; if(i>=0) { lab1->setStyleSheet("QLabel{background-color: #66ff66}"); lab1->setText(" " + fname.mid(i,len) + " "); @@ -935,7 +893,7 @@ void MainWindow::on_actionOpen_next_in_directory_triggered() //Open Next m_diskData=true; int dbDgrd=0; if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; - *future1 = QtConcurrent::run(getfile, fname, m_xpol, dbDgrd); + *future1 = QtConcurrent::run(getfile, fname, false, dbDgrd); watcher1->setFuture(*future1); return; } @@ -1106,14 +1064,12 @@ void MainWindow::decode() //decode() datcom_.ntimeout=m_timeout; datcom_.ntol=m_tol; datcom_.nxant=0; - if(m_xpolx) datcom_.nxant=1; if(datcom_.nutc < m_nutc0) m_map65RxLog |= 1; //Date and Time to map65_rx.log m_nutc0=datcom_.nutc; datcom_.map65RxLog=m_map65RxLog; datcom_.nfsample=96000; if(!m_fs96000) datcom_.nfsample=95238; datcom_.nxpol=0; - if(m_xpol) datcom_.nxpol=1; datcom_.nmode=10*m_modeQ65 + m_modeJT65; // datcom_.nfast=1; //No longer used datcom_.nsave=m_nsave; @@ -1346,8 +1302,8 @@ void MainWindow::guiUpdate() if(m_nrx==1) t="S1"; if(m_nrx==2) t="S2"; } - if((abs(m_nrx)==1 and m_xpol) or (abs(m_nrx)==2 and !m_xpol)) - lab1->setStyleSheet("QLabel{background-color: #ff1493}"); +// if((abs(m_nrx)==1 and m_xpol) or (abs(m_nrx)==2 and !m_xpol)) +// lab1->setStyleSheet("QLabel{background-color: #ff1493}"); if(khsym==m_hsym0) { t="Nil"; lab1->setStyleSheet("QLabel{background-color: #ffc0cb}"); From ce23a1897b6be17f7de123eca7ba434f9f3dd36c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 15:04:34 -0500 Subject: [PATCH 030/251] Remove more unused stuff. --- q65w/devsetup.cpp | 222 ----------- q65w/devsetup.h | 27 -- q65w/devsetup.ui | 933 -------------------------------------------- q65w/mainwindow.cpp | 75 +--- q65w/mainwindow.h | 12 - 5 files changed, 4 insertions(+), 1265 deletions(-) diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index 6b67ff9cb..857c0ab02 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -74,7 +74,6 @@ void DevSetup::initDlg() sprintf(p2,"%2d %-8s %-39s",id,p1,pa_device_name); QString t(p2); - ui.comboBoxSndOut->addItem(t); } } @@ -87,40 +86,11 @@ void DevSetup::initDlg() ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); ui.networkRadioButton->setChecked(m_network); ui.soundCardRadioButton->setChecked(!m_network); - ui.rb96000->setChecked(m_fs96000); - ui.rb95238->setChecked(!m_fs96000); - ui.rbIQXT->setChecked(m_bIQxt); - ui.rbSi570->setChecked(!m_bIQxt); - ui.mult570TxSpinBox->setEnabled(m_bIQxt); ui.comboBoxSndIn->setEnabled(!m_network); ui.comboBoxSndIn->setCurrentIndex(m_nDevIn); - ui.comboBoxSndOut->setCurrentIndex(m_nDevOut); ui.sbPort->setValue(m_udpPort); ui.cbIQswap->setChecked(m_IQswap); - ui.cbInitIQplus->setChecked(m_initIQplus); ui.sb_dB->setValue(m_dB); - ui.mult570SpinBox->setValue(m_mult570); - ui.mult570TxSpinBox->setValue(m_mult570Tx); - ui.cal570SpinBox->setValue(m_cal570); - ui.sbTxOffset->setValue(m_TxOffset); - ::sscanf (m_colors.toLatin1(),"%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", - &r,&g,&b,&r0,&g0,&b0,&r1,&g1,&b1,&r2,&g2,&b2,&r3,&g3,&b3); - updateColorLabels(); - ui.sbBackgroundRed->setValue(r); - ui.sbBackgroundGreen->setValue(g); - ui.sbBackgroundBlue->setValue(b); - ui.sbRed0->setValue(r0); - ui.sbRed1->setValue(r1); - ui.sbRed2->setValue(r2); - ui.sbRed3->setValue(r3); - ui.sbGreen0->setValue(g0); - ui.sbGreen1->setValue(g1); - ui.sbGreen2->setValue(g2); - ui.sbGreen3->setValue(g3); - ui.sbBlue0->setValue(b0); - ui.sbBlue1->setValue(b1); - ui.sbBlue2->setValue(b2); - ui.sbBlue3->setValue(b3); m_paInDevice=m_inDevList[m_nDevIn]; m_paOutDevice=m_outDevList[m_nDevOut]; @@ -147,213 +117,21 @@ void DevSetup::accept() m_fCal=ui.fCalSpinBox->value(); m_fAdd=ui.faddEntry->text().toDouble(); m_network=ui.networkRadioButton->isChecked(); - m_fs96000=ui.rb96000->isChecked(); - m_bIQxt=ui.rbIQXT->isChecked(); m_nDevIn=ui.comboBoxSndIn->currentIndex(); m_paInDevice=m_inDevList[m_nDevIn]; - m_nDevOut=ui.comboBoxSndOut->currentIndex(); m_paOutDevice=m_outDevList[m_nDevOut]; m_udpPort=ui.sbPort->value(); m_IQswap=ui.cbIQswap->isChecked(); - m_initIQplus=ui.cbInitIQplus->isChecked(); m_dB=ui.sb_dB->value(); - m_mult570=ui.mult570SpinBox->value(); - m_mult570Tx=ui.mult570TxSpinBox->value(); - m_cal570=ui.cal570SpinBox->value(); - m_TxOffset=ui.sbTxOffset->value(); - QDialog::accept(); } void DevSetup::on_soundCardRadioButton_toggled(bool checked) { ui.comboBoxSndIn->setEnabled(ui.soundCardRadioButton->isChecked()); - ui.rb96000->setChecked(checked); - ui.rb95238->setEnabled(!checked); ui.label_InputDev->setEnabled(checked); ui.label_Port->setEnabled(!checked); ui.sbPort->setEnabled(!checked); ui.cbIQswap->setEnabled(checked); ui.sb_dB->setEnabled(checked); } - -void DevSetup::on_cal570SpinBox_valueChanged(double ppm) -{ - m_cal570=ppm; -} - -void DevSetup::on_mult570SpinBox_valueChanged(int mult) -{ - m_mult570=mult; -} - -void DevSetup::on_sb_dB_valueChanged(int n) -{ - m_dB=n; -} - -void DevSetup::updateColorLabels() -{ - QString t; - int r=ui.sbBackgroundRed->value(); - int g=ui.sbBackgroundGreen->value(); - int b=ui.sbBackgroundBlue->value(); - int r0=ui.sbRed0->value(); - int r1=ui.sbRed1->value(); - int r2=ui.sbRed2->value(); - int r3=ui.sbRed3->value(); - int g0=ui.sbGreen0->value(); - int g1=ui.sbGreen1->value(); - int g2=ui.sbGreen2->value(); - int g3=ui.sbGreen3->value(); - int b0=ui.sbBlue0->value(); - int b1=ui.sbBlue1->value(); - int b2=ui.sbBlue2->value(); - int b3=ui.sbBlue3->value(); - - ui.lab0->setStyleSheet ( - QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} - .arg (r, 2, 16, QLatin1Char {'0'}) - .arg (g, 2, 16, QLatin1Char {'0'}) - .arg (b, 2, 16, QLatin1Char {'0'}) - .arg (r0, 2, 16, QLatin1Char {'0'}) - .arg (g0, 2, 16, QLatin1Char {'0'}) - .arg (b0, 2, 16, QLatin1Char {'0'}) - ); - ui.lab1->setStyleSheet( - QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} - .arg (r, 2, 16, QLatin1Char {'0'}) - .arg (g, 2, 16, QLatin1Char {'0'}) - .arg (b, 2, 16, QLatin1Char {'0'}) - .arg (r1, 2, 16, QLatin1Char {'0'}) - .arg (g1, 2, 16, QLatin1Char {'0'}) - .arg (b1, 2, 16, QLatin1Char {'0'}) - ); - ui.lab2->setStyleSheet( - QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} - .arg (r, 2, 16, QLatin1Char {'0'}) - .arg (g, 2, 16, QLatin1Char {'0'}) - .arg (b, 2, 16, QLatin1Char {'0'}) - .arg (r2, 2, 16, QLatin1Char {'0'}) - .arg (g2, 2, 16, QLatin1Char {'0'}) - .arg (b2, 2, 16, QLatin1Char {'0'}) - ); - ui.lab3->setStyleSheet( - QString {"QLabel{background-color: #%1%2%3; color: #%4%5%6}"} - .arg (r, 2, 16, QLatin1Char {'0'}) - .arg (g, 2, 16, QLatin1Char {'0'}) - .arg (b, 2, 16, QLatin1Char {'0'}) - .arg (r3, 2, 16, QLatin1Char {'0'}) - .arg (g3, 2, 16, QLatin1Char {'0'}) - .arg (b3, 2, 16, QLatin1Char {'0'}) - ); - - m_colors.clear (); - QTextStream ots {&m_colors, QIODevice::WriteOnly}; - ots.setIntegerBase (16); - ots.setFieldWidth (2); - ots.setPadChar ('0'); - ots << r << g << b << r0 << g0 << b0 << r1 << g1 << b1 << r2 << g2 << b2 << r3 << g3 << b3; -} - -void DevSetup::on_sbBackgroundRed_valueChanged(int /*r*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBackgroundGreen_valueChanged(int /*g*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBackgroundBlue_valueChanged(int /*b*/) -{ - updateColorLabels(); -} - - -void DevSetup::on_sbRed0_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbGreen0_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBlue0_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbRed1_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbGreen1_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBlue1_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbRed2_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbGreen2_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBlue2_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbRed3_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbGreen3_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_sbBlue3_valueChanged(int /*arg1*/) -{ - updateColorLabels(); -} - -void DevSetup::on_pushButton_5_clicked() -{ - QColor color = QColorDialog::getColor(Qt::green, this); - if (color.isValid()) { - } -} - -void DevSetup::on_mult570TxSpinBox_valueChanged(int n) -{ - m_mult570Tx=n; -} - -void DevSetup::on_rbIQXT_toggled(bool checked) -{ - m_bIQxt=checked; - ui.mult570TxSpinBox->setEnabled(m_bIQxt); - ui.label_25->setEnabled(m_bIQxt); - ui.sbTxOffset->setEnabled(m_bIQxt); - ui.label_26->setEnabled(m_bIQxt); -} - -void DevSetup::on_sbTxOffset_valueChanged(double f) -{ - m_TxOffset=f; -} diff --git a/q65w/devsetup.h b/q65w/devsetup.h index 71dad4027..21deda46f 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -38,46 +38,19 @@ public: bool m_IQswap; bool m_restartSoundIn; bool m_initIQplus; - bool m_bIQxt; QString m_myCall; QString m_myGrid; QString m_saveDir; QString m_azelDir; QString m_dxccPfx; - QString m_colors; QString m_editorCommand; - QColor m_colorBackground; - public slots: void accept(); private slots: void on_soundCardRadioButton_toggled(bool checked); - void on_cal570SpinBox_valueChanged(double ppm); - void on_mult570SpinBox_valueChanged(int mult); - void on_sbBackgroundRed_valueChanged(int arg1); - void on_sbBackgroundGreen_valueChanged(int arg1); - void on_sbBackgroundBlue_valueChanged(int arg1); - void updateColorLabels(void); - void on_sbRed0_valueChanged(int arg1); - void on_sbGreen0_valueChanged(int arg1); - void on_sbBlue0_valueChanged(int arg1); - void on_sbRed1_valueChanged(int arg1); - void on_sbGreen1_valueChanged(int arg1); - void on_sbBlue1_valueChanged(int arg1); - void on_sbRed2_valueChanged(int arg1); - void on_sbGreen2_valueChanged(int arg1); - void on_sbBlue2_valueChanged(int arg1); - void on_sbRed3_valueChanged(int arg1); - void on_sbGreen3_valueChanged(int arg1); - void on_sbBlue3_valueChanged(int arg1); - void on_pushButton_5_clicked(); - void on_mult570TxSpinBox_valueChanged(int arg1); - void on_rbIQXT_toggled(bool checked); - void on_sbTxOffset_valueChanged(double f); - void on_sb_dB_valueChanged(int n); private: int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3; diff --git a/q65w/devsetup.ui b/q65w/devsetup.ui index ffd4a7fba..05cabbccc 100644 --- a/q65w/devsetup.ui +++ b/q65w/devsetup.ui @@ -478,943 +478,10 @@ - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 13 - - - - - - - - - 0 - 0 - - - - - 16777215 - 60 - - - - Sample Rate - - - - - 30 - 20 - 282 - 22 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 96000 Hz - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 95238 Hz - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 55 - - - - Output Device (Tx Audio) - - - - - 10 - 20 - 291 - 22 - - - - - - - - - - - Colors - - - - - 12 - 21 - 351 - 281 - - - - - - - - 10 - - - - Choose colors for Band Map and Messages Windows - - - Qt::AlignCenter - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 80 - 20 - - - - - - - - Red - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 31 - 20 - - - - - - - - Green - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 34 - 20 - - - - - - - - Blue - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 80 - 20 - - - - - - - - - - - - - 60 - 16777215 - - - - Background - - - Qt::AlignCenter - - - - - - - 255 - - - - - - - 255 - - - - - - - 255 - - - 102 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 55 - 20 - - - - - - - - - - - - - 60 - 16777215 - - - - Newest - - - Qt::AlignCenter - - - - - - - 255 - - - 255 - - - - - - - 255 - - - - - - - 255 - - - - - - - - 0 - 0 - - - - - 50 - 16777215 - - - - - Courier New - 9 - - - - K1ABC - - - - - - - - - - - - 60 - 16777215 - - - - 2nd - - - Qt::AlignCenter - - - - - - - 255 - - - 255 - - - - - - - 255 - - - 255 - - - - - - - 255 - - - - - - - - 0 - 0 - - - - - 50 - 16777215 - - - - - Courier New - 9 - - - - K1ABC - - - - - - - - - - - - 60 - 16777215 - - - - 3rd - - - Qt::AlignCenter - - - - - - - 255 - - - 150 - - - - - - - 255 - - - 150 - - - - - - - 255 - - - 150 - - - - - - - - 0 - 0 - - - - - 50 - 16777215 - - - - - Courier New - 9 - - - - K1ABC - - - - - - - - - - - - 60 - 16777215 - - - - Oldest - - - Qt::AlignCenter - - - - - - - 255 - - - 100 - - - - - - - 255 - - - 100 - - - - - - - 255 - - - 100 - - - - - - - - 0 - 0 - - - - - 50 - 16777215 - - - - - Courier New - 9 - - - - K1ABC - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Color Selector - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Si570 Control - - - - - 41 - 41 - 272 - 248 - - - - - - - - - LO Selection: - - - - - - - IQ+, Generic Si570 - - - true - - - - - - - IQ+ Rx/XT - - - false - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 40 - - - - - - - - - - Rx frequency multiplier: - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 47 - 20 - - - - - - - - - 0 - 0 - - - - - 80 - 0 - - - - 1 - - - 8 - - - 2 - - - - - - - - - - - Tx Offset (MHz): - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 80 - 0 - - - - 3 - - - 150.000000000000000 - - - 130.900000000000006 - - - - - - - - - - - false - - - Tx frequency multiplier: - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 47 - 20 - - - - - - - - false - - - - 0 - 0 - - - - - 80 - 0 - - - - 1 - - - - - - - - - - - Frequency correction (ppm): - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 80 - 0 - - - - 3 - - - -200.000000000000000 - - - 200.000000000000000 - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 40 - - - - - - - - Initialize IQ+ on startup - - - diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index f4e6abe68..e534665f0 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -99,11 +99,9 @@ MainWindow::MainWindow(QWidget *parent) : connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); - m_auto=false; m_waterfallAvg = 1; m_network = true; m_restart=false; - m_transmitting=false; m_widebandDecode=false; m_myCall="K1JT"; m_myGrid="FN20qi"; @@ -137,8 +135,6 @@ MainWindow::MainWindow(QWidget *parent) : xSignalMeter = new SignalMeter(ui->xMeterFrame); xSignalMeter->resize(50, 160); - ySignalMeter = new SignalMeter(ui->yMeterFrame); - ySignalMeter->resize(50, 160); #ifdef WIN32 while(true) { @@ -219,12 +215,7 @@ MainWindow::MainWindow(QWidget *parent) : m_tol=500; m_wide_graph_window->setTol(m_tol); m_wide_graph_window->setFcal(m_fCal); - if(m_fs96000) m_wide_graph_window->setFsample(96000); - if(!m_fs96000) m_wide_graph_window->setFsample(95238); - m_wide_graph_window->m_mult570=m_mult570; - m_wide_graph_window->m_mult570Tx=m_mult570Tx; - m_wide_graph_window->m_cal570=m_cal570; - if(m_initIQplus) m_wide_graph_window->initIQplus(); + m_wide_graph_window->setFsample(96000); // Create "m_worked", a dictionary of all calls in wsjt.log QFile f("wsjt.log"); @@ -329,8 +320,6 @@ void MainWindow::writeSettings() settings.setValue("GainY",(double)m_gainy); settings.setValue("PhaseX",(double)m_phasex); settings.setValue("PhaseY",(double)m_phasey); - settings.setValue("Mult570",m_mult570); - settings.setValue("Cal570",m_cal570); settings.setValue("Colors",m_colors); settings.setValue("MaxDrift",ui->sbMaxDrift->value()); } @@ -413,8 +402,6 @@ void MainWindow::readSettings() m_gainy=settings.value("GainY",1.0).toFloat(); m_phasex=settings.value("PhaseX",0.0).toFloat(); m_phasey=settings.value("PhaseY",0.0).toFloat(); - m_mult570=settings.value("Mult570",2).toInt(); - m_cal570=settings.value("Cal570",0.0).toDouble(); m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && @@ -488,13 +475,12 @@ void MainWindow::dataSink(int k) ui->yMeterFrame->setVisible(false); lab4->setText ( - QString {" Rx noise: %1 %2 %% "} + QString {" Rx: %1 %2 %% "} .arg (px, 5, 'f', 1) .arg (m_pctZap, 5, 'f', 1) ); xSignalMeter->setValue(px); // Update the signal meters - ySignalMeter->setValue(py); if(m_monitoring || m_diskData) { m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } @@ -585,11 +571,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_IQswap=m_IQswap; dlg.m_dB=m_dB; dlg.m_initIQplus=m_initIQplus; - dlg.m_bIQxt=m_bIQxt; - dlg.m_cal570=m_cal570; - dlg.m_mult570=m_mult570; - dlg.m_colors=m_colors; - dlg.initDlg(); if(dlg.exec() == QDialog::Accepted) { m_myCall=dlg.m_myCall; @@ -617,11 +598,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_IQswap=dlg.m_IQswap; m_dB=dlg.m_dB; m_initIQplus=dlg.m_initIQplus; - m_bIQxt=dlg.m_bIQxt; - m_colors=dlg.m_colors; - m_cal570=dlg.m_cal570; - m_wide_graph_window->m_mult570=m_mult570; - m_wide_graph_window->m_cal570=m_cal570; soundInThread.setSwapIQ(m_IQswap); soundInThread.setScale(m_dB); @@ -741,18 +717,6 @@ void MainWindow::createStatusBar() //createStatusBar lab1->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab1); - lab2 = new QLabel("QSO freq: 125"); - lab2->setAlignment(Qt::AlignHCenter); - lab2->setMinimumSize(QSize(90,10)); - lab2->setFrameStyle(QFrame::Panel | QFrame::Sunken); - statusBar()->addWidget(lab2); - - lab3 = new QLabel("QSO DF: 0"); - lab3->setAlignment(Qt::AlignHCenter); - lab3->setMinimumSize(QSize(80,10)); - lab3->setFrameStyle(QFrame::Panel | QFrame::Sunken); - statusBar()->addWidget(lab3); - lab4 = new QLabel(""); lab4->setAlignment(Qt::AlignHCenter); lab4->setMinimumSize(QSize(80,10)); @@ -1234,42 +1198,12 @@ void MainWindow::guiUpdate() qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int nsec=ms/1000; - /* - if(nc1 <= 0) nc1++; - if(nc1 == 0) { - xSignalMeter->setValue(0); - ySignalMeter->setValue(0); - m_monitoring=false; - soundInThread.setMonitoring(false); - m_transmitting=true; - m_wide_graph_window->enableSetRxHardware(false); - - QString t=" Tx " + m_modeTx + " "; - t=t.left(11); - QFile f("map65_tx.log"); - f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); - QTextStream out(&f); - out << QDateTime::currentDateTimeUtc().toString("yyyy-MMM-dd hh:mm") - << t << QString::fromLatin1(msgsent) -#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) - << Qt::endl -#else - << endl -#endif - ; - f.close(); - } -*/ - if(m_monitoring) { ui->monitorButton->setStyleSheet(m_pbmonitor_style); } else { ui->monitorButton->setStyleSheet(""); } - lab2->setText("QSO Freq: " + QString::number(m_wide_graph_window->QSOfreq())); - lab3->setText("QSO DF: " + QString::number(m_wide_graph_window->DF())); - m_wide_graph_window->updateFreqLabel(); if(m_startAnother) { @@ -1282,7 +1216,7 @@ void MainWindow::guiUpdate() soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); - if(m_pctZap>30.0 and !m_transmitting) { + if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); } else { lab4->setStyleSheet(""); @@ -1323,8 +1257,7 @@ void MainWindow::guiUpdate() ui->labUTC->setText(utc); if((!m_monitoring and !m_diskData) or (khsym==m_hsym0)) { xSignalMeter->setValue(0); - ySignalMeter->setValue(0); - lab4->setText(" Rx noise: 0.0 0.0 0.0% "); + lab4->setText(" Rx noise: 0.0 0.0% "); } m_hsym0=khsym; m_sec0=nsec; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e8ed20a2f..7c14d3b2a 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -128,8 +128,6 @@ private: qint32 m_NBslider; qint32 m_adjustIQ; qint32 m_applyIQcal; - qint32 m_mult570; - qint32 m_mult570Tx; qint32 m_nsum; qint32 m_nsave; qint32 m_TRperiod; @@ -139,23 +137,13 @@ private: qint32 m_dB; double m_fAdd; - // double m_IQamp; - // double m_IQphase; - double m_cal570; - double m_TxOffset; double m_xavg; bool m_monitoring; - bool m_transmitting; bool m_diskData; bool m_loopall; bool m_decoderBusy; - bool m_txFirst; - bool m_auto; - bool m_txMute; bool m_restart; - bool m_xpol; - bool m_xpolx; bool m_call3Modified; bool m_startAnother; bool m_saveAll; From 50f2ef1931268ba4019af7cb82f015aff20bc750 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 15:10:59 -0500 Subject: [PATCH 031/251] Remove stuff from widegraph. --- q65w/CMakeLists.txt | 1 - q65w/set570.cpp | 272 -------------------------------------------- q65w/widegraph.cpp | 7 +- q65w/widegraph.h | 9 -- 4 files changed, 4 insertions(+), 285 deletions(-) delete mode 100644 q65w/set570.cpp diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index 3a024d0e9..a82c2da09 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -9,7 +9,6 @@ set (q65w_CXXSRCS mainwindow.cpp meterwidget.cpp plotter.cpp - set570.cpp signalmeter.cpp soundin.cpp widegraph.cpp diff --git a/q65w/set570.cpp b/q65w/set570.cpp deleted file mode 100644 index a56832292..000000000 --- a/q65w/set570.cpp +++ /dev/null @@ -1,272 +0,0 @@ - -/* Linux / Windows program to control the frequency of a si570 synthesizer - ON5GN 6 jan 2012 - Under Linux: - -use the linux version of function void si570_sleep(int us) - -compile with - gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm - -run with sudo ./set_si570_freq - Under Windows: - -use the windows version of function void si570_sleep(int us) - -compile with mingw - C:\mingw\bin\mingw32-gcc -Wall -o set_si570_freq set_si570_freq.c -lusb -lm - -run with set_si570_freq.exe -*/ - -#include /* Standard input/output definitions */ -#include /* String function definitions */ -#include /* UNIX standard function definitions */ -#include - -#ifdef WIN32 -#include -#endif - -#include -#include - -#define USB_SUCCESS 0 -#define USB_ERROR_NOTFOUND 1 -#define USB_ERROR_ACCESS 2 -#define USB_ERROR_IO 3 -#define VENDOR_NAME "www.obdev.at" -#define PRODUCT_NAME "DG8SAQ-I2C" -#define USBDEV_SHARED_VENDOR 0x16C0 // VOTI VID -#define USBDEV_SHARED_PRODUCT 0x05DC // OBDEV PID - // Use obdev's generic shared VID/PID pair - // following the rules outlined in - // firmware/usbdrv/USBID-License.txt. -#define REQUEST_SET_FREQ_BY_VALUE 0x32 -#define MAX_USB_ERR_CNT 6 - -double freq_parm; -double delay_average; -int from_freq; -int to_freq; -int increment_freq; -int display_freq = -1; -int delay; -static libusb_device_handle * global_si570usb_handle; - -void si570_sleep(int us) -{ -#if defined (Q_OS_WIN) - ::Sleep (us / 1000); -#else - ::usleep (us); -#endif -} - -double round(double x) -{ - int i=x+0.5; - return (double)i; -} - -double current_time(void) //for delay measurements -{ - struct timeval t; - gettimeofday(&t,NULL); - return 0.000001*t.tv_usec+t.tv_sec; -} - -unsigned char Si570usbOpenDevice(libusb_device_handle **device, char *usbSerialID); -void setLongWord( int value, char * bytes); -int setFreqByValue(libusb_device_handle * handle, double frequency); -void sweepa_freq(void); -void sweepm_freq(void); - -int set570(double freq_MHz) -{ -//### -// qDebug() << "A" << freq_MHz; -// if(freq_MHz != 999.0) return 0; -//### - - char * my_usbSerialID = nullptr; - -// MAIN MENU DIALOG - if (Si570usbOpenDevice(&global_si570usb_handle, my_usbSerialID) != USB_SUCCESS) - { - return -1; - } - -//SET FREQUENCY - if((freq_MHz < 3.45)|(freq_MHz > 866.0)) return -2; - setFreqByValue(global_si570usb_handle,freq_MHz); - return 0; -} - -unsigned char Si570usbOpenDevice (libusb_device_handle * * udh, char * usbSerialID) -{ - if (*udh) return USB_SUCCESS; // only scan USB devices 1st time - - int vendor = USBDEV_SHARED_VENDOR; - char *vendorName = (char *)VENDOR_NAME; - int product = USBDEV_SHARED_PRODUCT; - char *productName = (char *)PRODUCT_NAME; - - libusb_device_handle * handle = nullptr; - unsigned char errorCode = USB_ERROR_NOTFOUND; - char buffer[256]; - int rc; - if ((rc = libusb_init (nullptr)) < 0) // init default context (safe to repeat) - { - printf ("usb initialization error message %s\n", libusb_error_name (rc)); - return errorCode = USB_ERROR_ACCESS; - } - - libusb_device * * device_list; - int device_count = libusb_get_device_list (nullptr, &device_list); - if (device_count < 0) - { - puts ("no usb devices"); - errorCode = USB_ERROR_NOTFOUND; - } - else - { - for (int i = 0; i < device_count; ++i) - { - libusb_device * device = device_list[i]; - libusb_device_descriptor descriptor; - if ((rc = libusb_get_device_descriptor (device, &descriptor)) < 0) - { - printf ("usb get device descriptor error message %s\n", libusb_error_name (rc)); - errorCode = USB_ERROR_ACCESS; - continue; - } - if (vendor == descriptor.idVendor && product == descriptor.idProduct) - { - // now we must open the device to query strings - if ((rc = libusb_open (device, &handle)) < 0) - { - printf ("usb open device error message %s\n", libusb_error_name (rc)); - errorCode = USB_ERROR_ACCESS; - continue; - } - if (!vendorName && !productName) - { - break; // good to go - } - if (libusb_get_string_descriptor_ascii (handle, descriptor.iManufacturer - , reinterpret_cast (buffer), sizeof buffer) < 0) - { - printf ("usb get vendor name error message %s\n", libusb_error_name (rc)); - errorCode = USB_ERROR_IO; - } - else - { - if (!vendorName || !strcmp (buffer, vendorName)) - { - if (libusb_get_string_descriptor_ascii (handle, descriptor.iProduct - , reinterpret_cast (buffer), sizeof buffer) < 0) - { - printf ("usb get product name error message %s\n", libusb_error_name (rc)); - errorCode = USB_ERROR_IO; - } - else - { - if (!productName || !strcmp (buffer, productName)) - { - if (libusb_get_string_descriptor_ascii (handle, descriptor.iSerialNumber - , reinterpret_cast (buffer), sizeof buffer) < 0) - { - printf ("usb get serial number error message %s\n", libusb_error_name (rc)); - errorCode = USB_ERROR_IO; - } - else - { - if (!usbSerialID || !strcmp (buffer, usbSerialID)) - { - break; // good to go - } - } - } - } - } - } - libusb_close (handle); - handle = nullptr; - } - } - libusb_free_device_list (device_list, 1); - } - if (handle) - { - errorCode = USB_SUCCESS; - *udh = handle; - } - return errorCode; -} - -void setLongWord( int value, char * bytes) -{ - bytes[0] = value & 0xff; - bytes[1] = ((value & 0xff00) >> 8) & 0xff; - bytes[2] = ((value & 0xff0000) >> 16) & 0xff; - bytes[3] = ((value & 0xff000000) >> 24) & 0xff; -} - -int setFreqByValue(libusb_device_handle * handle, double frequency) -{ -// Windows Doc from PE0FKO: -// -// Command 0x32: -// ------------- -// Set the oscillator frequency by value. The frequency is formatted in MHz -// as 11.21 bits value. -// The "automatic band pass filter selection", "smooth tune", -// "one side calibration" and the "frequency subtract multiply" are all -// done in this function. (if enabled in the firmware) -// -// Default: None -// -// Parameters: -// requesttype: LIBUSB_ENDPOINT_OUT -// request: 0x32 -// value: 0 -// index: 0 -// bytes: pointer 32 bits integer -// size: 4 -// -// Code sample: -// uint32_t iFreq; -// double dFreq; -// -// dFreq = 30.123456; // MHz -// iFreq = (uint32_t)( dFreq * (1UL << 21) ) -// r = usbCtrlMsgOUT(0x32, 0, 0, (char *)&iFreq, sizeof(iFreq)); -// if (r < 0) Error -// - - char buffer[4]; - int i2cAddress = 0x55; - int request = REQUEST_SET_FREQ_BY_VALUE; - int value = 0x700 + i2cAddress; - int my_index = 0; - int retval; - int err_cnt; - - err_cnt =0; - set_again:; - setLongWord(round(frequency * 2097152.0), buffer); // 2097152=2^21 - retval = libusb_control_transfer ( - handle, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE | LIBUSB_ENDPOINT_OUT, - request, - value, - my_index, - reinterpret_cast (buffer), - sizeof(buffer), - 5000); - if (retval != 4) { - err_cnt ++; - if(err_cnt < MAX_USB_ERR_CNT) { - si570_sleep(1000); // delay 1000 microsec - goto set_again; - } else { - printf("Error when setting frequency, returncode=%i\n",retval); - printf("usb error message: %s\n", libusb_error_name (retval)); - } - } - return retval; -} diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp index 265b00fa3..4e3eeba7a 100644 --- a/q65w/widegraph.cpp +++ b/q65w/widegraph.cpp @@ -299,6 +299,7 @@ void WideGraph::on_fCenterLineEdit_editingFinished() m_dForceCenterFreq=ui->fCenterLineEdit->text().toDouble(); } +/* void WideGraph::on_pbSetRxHardware_clicked() { int iret=set570(m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq); @@ -322,7 +323,7 @@ void WideGraph::initIQplus() on_pbSetRxHardware_clicked(); } } - +*/ void WideGraph::on_cbSpec2d_toggled(bool b) { ui->widePlot->set2Dspec(b); @@ -343,7 +344,7 @@ void WideGraph::on_cbLockTxRx_stateChanged(int n) m_bLockTxRx = (n!=0); ui->widePlot->setLockTxRx(m_bLockTxRx); } - +/* void WideGraph::rx570() { double f=m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq; @@ -372,7 +373,7 @@ void WideGraph::tx570() mb.exec(); } } - +*/ void WideGraph::updateFreqLabel() { auto rxFreq = QString {"%1"}.arg (ui->widePlot->rxFreq (), 10, 'f', 6); diff --git a/q65w/widegraph.h b/q65w/widegraph.h index 1e330cfde..29739beaa 100644 --- a/q65w/widegraph.h +++ b/q65w/widegraph.h @@ -33,8 +33,6 @@ public: void setPeriod(int n); void setDecodeFinished(); double fGreen(); - void rx570(); - void tx570(); void updateFreqLabel(); void enableSetRxHardware(bool b); @@ -46,7 +44,6 @@ signals: public slots: void wideFreezeDecode(int n); - void initIQplus(); protected: virtual void keyPressEvent( QKeyEvent *e ); @@ -61,7 +58,6 @@ private slots: void on_autoZeroPushButton_clicked(); void on_cbFcenter_stateChanged(int arg1); void on_fCenterLineEdit_editingFinished(); - void on_pbSetRxHardware_clicked(); void on_cbSpec2d_toggled(bool checked); void on_cbLockTxRx_stateChanged(int arg1); @@ -73,10 +69,7 @@ public: private: bool m_bLockTxRx; public: - qint32 m_mult570; - qint32 m_mult570Tx; double m_dForceCenterFreq; - double m_cal570; double m_TxOffset; private: bool m_bIQxt; @@ -87,6 +80,4 @@ private: qint32 m_TRperiod=60; }; -extern int set570(double freq_MHz); - #endif // WIDEGRAPH_H From bac63c1ea7605b0609d8950bc46f1b6025200b48 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 15:14:49 -0500 Subject: [PATCH 032/251] Remove the read_log() stuff. --- q65w/mainwindow.cpp | 26 -------------------------- q65w/mainwindow.h | 1 - 2 files changed, 27 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index e534665f0..28ef636a1 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1052,9 +1052,6 @@ void MainWindow::decode() //decode() datcom_.junk1=1234; datcom_.junk2=5678; - //newdat=1 ==> this is new data, must do the big FFT - //nagain=1 ==> decode only at fQSO +/- Tol - char *to = (char*)mem_m65.data(); char *from = (char*) datcom_.d4; int size=sizeof(datcom_); @@ -1137,8 +1134,6 @@ void MainWindow::readFromStdout() //readFromStdout return; } - read_log(); - if(t.indexOf("~") >= 0) { int n=t.length(); int m=2; @@ -1543,24 +1538,3 @@ bool MainWindow::isGrid4(QString g) if(g.mid(3,1)<'0' or g.mid(3,1)>'9') return false; return true; } - -void MainWindow::read_log() -{ - // Update "m_worked" by reading wsjtx.log - m_worked.clear(); //Start from scratch - QFile f("wsjtx.log"); - f.open(QIODevice::ReadOnly); - if(f.isOpen()) { - QTextStream in(&f); - QString line,callsign; - for(int i=0; i<99999; i++) { - line=in.readLine(); - if(line.length()<=0) break; - callsign=line.mid(40,6); - int n=callsign.indexOf(","); - if(n>0) callsign=callsign.left(n); - m_worked[callsign]=true; - } - f.close(); - } -} diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 7c14d3b2a..488c7813d 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -222,7 +222,6 @@ private: void stub(); bool isGrid4(QString g); bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); - void read_log(); }; extern void getfile(QString fname, bool xpol, int idInt); From 7f6f260dc888b8aafc141488cec6aaa9b3905a1f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 15:20:51 -0500 Subject: [PATCH 033/251] Start removing portAudio stuff. --- q65w/mainwindow.cpp | 17 ++--------------- q65w/mainwindow.h | 4 ++-- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 28ef636a1..1ee50df71 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -200,10 +200,7 @@ MainWindow::MainWindow(QWidget *parent) : watcher2 = new QFutureWatcher; connect(watcher2, SIGNAL(finished()),this,SLOT(diskWriteFinished())); -// Assign input device and start input thread - soundInThread.setInputDevice(m_paInDevice); - if(m_fs96000) soundInThread.setRate(96000.0); - if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setRate(96000.0); soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); soundInThread.setPort(m_udpPort); @@ -295,8 +292,6 @@ void MainWindow::writeSettings() settings.setValue("NetworkInput", m_network); settings.setValue("FSam96000", m_fs96000); settings.setValue("SoundInIndex",m_nDevIn); - settings.setValue("paInDevice",m_paInDevice); - settings.setValue("paOutDevice",m_paOutDevice); settings.setValue("IQswap",m_IQswap); settings.setValue("Scale_dB",m_dB); settings.setValue("IQxt",m_bIQxt); @@ -357,8 +352,6 @@ void MainWindow::readSettings() m_network = settings.value("NetworkInput",true).toBool(); m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); - m_paInDevice = settings.value("paInDevice",0).toInt(); - m_paOutDevice = settings.value("paOutDevice",0).toInt(); m_IQswap = settings.value("IQswap",false).toBool(); m_dB = settings.value("Scale_dB",0).toInt(); m_initIQplus = settings.value("InitIQplus",false).toBool(); @@ -566,7 +559,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_network=m_network; dlg.m_fs96000=m_fs96000; dlg.m_nDevIn=m_nDevIn; - dlg.m_nDevOut=m_nDevOut; dlg.m_udpPort=m_udpPort; dlg.m_IQswap=m_IQswap; dlg.m_dB=m_dB; @@ -591,9 +583,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_fs96000=dlg.m_fs96000; m_network=dlg.m_network; m_nDevIn=dlg.m_nDevIn; - m_paInDevice=dlg.m_paInDevice; - m_nDevOut=dlg.m_nDevOut; - m_paOutDevice=dlg.m_paOutDevice; m_udpPort=dlg.m_udpPort; m_IQswap=dlg.m_IQswap; m_dB=dlg.m_dB; @@ -605,11 +594,9 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog soundInThread.quit(); soundInThread.wait(1000); soundInThread.setNetwork(m_network); - if(m_fs96000) soundInThread.setRate(96000.0); - if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setRate(96000.0); soundInThread.setFadd(m_fAdd); soundInThread.setNrx(1); - soundInThread.setInputDevice(m_paInDevice); soundInThread.start(QThread::HighestPriority); } } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 488c7813d..e084f1948 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -122,8 +122,8 @@ private: qint32 m_mode65; qint32 m_nrx; qint32 m_hsym0; - qint32 m_paInDevice; - qint32 m_paOutDevice; +// qint32 m_paInDevice; +// qint32 m_paOutDevice; qint32 m_udpPort; qint32 m_NBslider; qint32 m_adjustIQ; From 61796515afe1e5f3d925308d258710853a657890 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 15:34:39 -0500 Subject: [PATCH 034/251] More cleanup in devsetup. --- q65w/devsetup.cpp | 76 ------------------------------------------ q65w/devsetup.ui | 85 +---------------------------------------------- 2 files changed, 1 insertion(+), 160 deletions(-) diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index 857c0ab02..675ab1583 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -20,63 +20,6 @@ DevSetup::~DevSetup() void DevSetup::initDlg() { - int k,id; - int valid_devices=0; - int minChan[MAXDEVICES]; - int maxChan[MAXDEVICES]; - int minSpeed[MAXDEVICES]; - int maxSpeed[MAXDEVICES]; - char hostAPI_DeviceName[MAXDEVICES][50]; - char s[256]; - int numDevices=Pa_GetDeviceCount(); - getDev(&numDevices,hostAPI_DeviceName,minChan,maxChan,minSpeed,maxSpeed); - k=0; - for(id=0; id= minSpeed[id] && 96000 <= maxSpeed[id]) { - m_inDevList[k]=id; - k++; - sprintf(s,"%2d %d %-49s",id,maxChan[id],hostAPI_DeviceName[id]); - QString t(s); - ui.comboBoxSndIn->addItem(t); - valid_devices++; - } - } - - const PaDeviceInfo *pdi; - int nchout; - char *p,*p1; - char p2[256]; - char pa_device_name[128]; - char pa_device_hostapi[128]; - - k=0; - for(id=0; idmaxOutputChannels; - if(nchout>=2) { - m_outDevList[k]=id; - k++; - sprintf((char*)(pa_device_name),"%s",pdi->name); - sprintf((char*)(pa_device_hostapi),"%s", - Pa_GetHostApiInfo(pdi->hostApi)->name); - - p1=(char*)""; - p=strstr(pa_device_hostapi,"MME"); - if(p!=NULL) p1=(char*)"MME"; - p=strstr(pa_device_hostapi,"Direct"); - if(p!=NULL) p1=(char*)"DirectX"; - p=strstr(pa_device_hostapi,"WASAPI"); - if(p!=NULL) p1=(char*)"WASAPI"; - p=strstr(pa_device_hostapi,"ASIO"); - if(p!=NULL) p1=(char*)"ASIO"; - p=strstr(pa_device_hostapi,"WDM-KS"); - if(p!=NULL) p1=(char*)"WDM-KS"; - - sprintf(p2,"%2d %-8s %-39s",id,p1,pa_device_name); - QString t(p2); - } - } - ui.myCallEntry->setText(m_myCall); ui.myGridEntry->setText(m_myGrid); ui.astroFont->setValue(m_astroFont); @@ -84,17 +27,9 @@ void DevSetup::initDlg() ui.azelDirEntry->setText(m_azelDir); ui.fCalSpinBox->setValue(m_fCal); ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); - ui.networkRadioButton->setChecked(m_network); - ui.soundCardRadioButton->setChecked(!m_network); - ui.comboBoxSndIn->setEnabled(!m_network); - ui.comboBoxSndIn->setCurrentIndex(m_nDevIn); ui.sbPort->setValue(m_udpPort); ui.cbIQswap->setChecked(m_IQswap); ui.sb_dB->setValue(m_dB); - - m_paInDevice=m_inDevList[m_nDevIn]; - m_paOutDevice=m_outDevList[m_nDevOut]; - } //------------------------------------------------------- accept() @@ -104,11 +39,6 @@ void DevSetup::accept() // Check to see whether SoundInThread must be restarted, // and save user parameters. - if(m_network!=ui.networkRadioButton->isChecked() or - m_nDevIn!=ui.comboBoxSndIn->currentIndex() or - m_paInDevice!=m_inDevList[m_nDevIn] or - m_udpPort!=ui.sbPort->value()) m_restartSoundIn=true; - m_myCall=ui.myCallEntry->text(); m_myGrid=ui.myGridEntry->text(); m_astroFont=ui.astroFont->value(); @@ -116,10 +46,6 @@ void DevSetup::accept() m_azelDir=ui.azelDirEntry->text(); m_fCal=ui.fCalSpinBox->value(); m_fAdd=ui.faddEntry->text().toDouble(); - m_network=ui.networkRadioButton->isChecked(); - m_nDevIn=ui.comboBoxSndIn->currentIndex(); - m_paInDevice=m_inDevList[m_nDevIn]; - m_paOutDevice=m_outDevList[m_nDevOut]; m_udpPort=ui.sbPort->value(); m_IQswap=ui.cbIQswap->isChecked(); m_dB=ui.sb_dB->value(); @@ -128,8 +54,6 @@ void DevSetup::accept() void DevSetup::on_soundCardRadioButton_toggled(bool checked) { - ui.comboBoxSndIn->setEnabled(ui.soundCardRadioButton->isChecked()); - ui.label_InputDev->setEnabled(checked); ui.label_Port->setEnabled(!checked); ui.sbPort->setEnabled(!checked); ui.cbIQswap->setEnabled(checked); diff --git a/q65w/devsetup.ui b/q65w/devsetup.ui index 05cabbccc..6d6f798ec 100644 --- a/q65w/devsetup.ui +++ b/q65w/devsetup.ui @@ -284,7 +284,7 @@ - Input Source (Rx, Baseband) + Input from Linrad @@ -296,46 +296,6 @@ - - - - - - true - - - SoundCard - - - false - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Network - - - true - - - - - @@ -435,49 +395,6 @@ - - - - false - - - - 0 - 0 - - - - Dev Ch API Name - - - - - - - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 50 - 13 - - - - - - From 43c3a5ec2623b795bd7ab43fa646bb83845fc03f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 16:04:32 -0500 Subject: [PATCH 035/251] More deletions of portaudio stuff. --- q65w/CMakeLists.txt | 1 - q65w/devsetup.cpp | 3 - q65w/getdev.cpp | 259 -------------------------------------- q65w/mainwindow.cpp | 6 - q65w/paInputDevice.c | 56 --------- q65w/pa_get_device_info.c | 173 ------------------------- q65w/q65w.pro | 3 +- 7 files changed, 1 insertion(+), 500 deletions(-) delete mode 100644 q65w/getdev.cpp delete mode 100644 q65w/paInputDevice.c delete mode 100644 q65w/pa_get_device_info.c diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index a82c2da09..97a3b01b8 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -3,7 +3,6 @@ set (q65w_CXXSRCS astro.cpp devsetup.cpp displaytext.cpp - getdev.cpp getfile.cpp main.cpp mainwindow.cpp diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index 675ab1583..dacb82055 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -3,9 +3,6 @@ #include #include #include -#include - -#define MAXDEVICES 200 //----------------------------------------------------------- DevSetup() DevSetup::DevSetup(QWidget *parent) : QDialog(parent) diff --git a/q65w/getdev.cpp b/q65w/getdev.cpp deleted file mode 100644 index 45addfa01..000000000 --- a/q65w/getdev.cpp +++ /dev/null @@ -1,259 +0,0 @@ -#include -#define MAXDEVICES 100 -#include -#include -#include - -//------------------------------------------------------- pa_get_device_info -int pa_get_device_info (int n, - void *pa_device_name, - void *pa_device_hostapi, - double *pa_device_max_speed, - double *pa_device_min_speed, - int *pa_device_max_bytes, - int *pa_device_min_bytes, - int *pa_device_max_channels, - int *pa_device_min_channels ) -{ - - (void) n ; - (void) pa_device_name; - (void) pa_device_hostapi; - (void) pa_device_max_speed; - (void) pa_device_min_speed; - (void) pa_device_max_bytes; - (void) pa_device_min_bytes; - (void) pa_device_max_channels; - (void) pa_device_min_channels; - const PaDeviceInfo *deviceInfo; - PaError pa_err; - PaStreamParameters inputParameters; - int i,j, speed_warning; - int minBytes, maxBytes; - double maxStandardSampleRate; - double minStandardSampleRate; - int minInputChannels; - int maxInputChannels; - -// negative terminated list - static double standardSampleRates[] = {8000.0, 9600.0, - 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, - 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; -// ******************************************************* - - - *pa_device_max_speed=0; - *pa_device_min_speed=0; - *pa_device_max_bytes=0; - *pa_device_min_bytes=0; - *pa_device_max_channels=0; - *pa_device_min_channels=0; - minInputChannels=0; - if(n >= Pa_GetDeviceCount() ) return -1; - deviceInfo = Pa_GetDeviceInfo(n); - if (deviceInfo->maxInputChannels==0) return -1; - sprintf((char*)(pa_device_name),"%s",deviceInfo->name); - sprintf((char*)(pa_device_hostapi),"%s", - Pa_GetHostApiInfo( deviceInfo->hostApi )->name); - speed_warning=0; - -// bypass bug in Juli@ ASIO driver: -// this driver hangs after a Pa_IsFormatSupported call - i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); - if (i == 0) { - minStandardSampleRate=44100; - maxStandardSampleRate=192000; - minBytes=1; - maxBytes=4; - maxInputChannels= deviceInfo->maxInputChannels; - minInputChannels= 1; - goto end_pa_get_device_info; - } - -// Investigate device capabilities. -// Check min and max samplerates with 16 bit data. - maxStandardSampleRate=0; - minStandardSampleRate=0; - inputParameters.device = n; - inputParameters.channelCount = deviceInfo->maxInputChannels; - inputParameters.sampleFormat = paInt16; - inputParameters.suggestedLatency = 0; - inputParameters.hostApiSpecificStreamInfo = NULL; - -// ************************************************************************ -//filter for portaudio Windows hostapi's with non experts. -//only allow ASIO or WASAPI or WDM-KS - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); - if (i==0 ) goto end_filter_hostapi; - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, - "Windows WASAPI", 14); - if (i==0 ) goto end_filter_hostapi; - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, - "Windows WDM-KS", 14); - if (i==0 ) goto end_filter_hostapi; - speed_warning=1; -end_filter_hostapi:; - -// ************************************************************************ - i=0; - while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - standardSampleRates[i] ); - if(pa_err == paDeviceUnavailable) return -1; - if(pa_err == paInvalidDevice) return -1; - if(pa_err == paFormatIsSupported ) { - minStandardSampleRate=standardSampleRates[i]; - } - i++; - } - if(minStandardSampleRate == 0) return -1; - j=i; - while(standardSampleRates[i] > 0 ) i++; - i--; - - while(i >= j && maxStandardSampleRate==0) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - standardSampleRates[i] ); - if(pa_err == paDeviceUnavailable) return -1; - if(pa_err == paInvalidDevice) return -1; - if( pa_err == paFormatIsSupported ) { - maxStandardSampleRate=standardSampleRates[i]; - } - i--; - } - -// check if min SampleRate = max SampleRate - if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { - maxStandardSampleRate= minStandardSampleRate; - } - -// check min and max bytes - minBytes=2; - maxBytes=2; - inputParameters.sampleFormat = paUInt8; - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - if( pa_err == paFormatIsSupported ) { - minBytes=1; - } - inputParameters.sampleFormat = paInt32; - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - if( pa_err == paFormatIsSupported ) { - maxBytes=4; - } - -// check min channel count - maxInputChannels= deviceInfo->maxInputChannels; - inputParameters.channelCount = 1; - inputParameters.sampleFormat = paInt16; - pa_err=paFormatIsSupported+32000; - while(pa_err != paFormatIsSupported && - ( inputParameters.channelCount < (maxInputChannels+1)) ) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - inputParameters.channelCount++; - } - if( pa_err == paFormatIsSupported ) { - minInputChannels=inputParameters.channelCount-1; - } else { - return -1; - } - -end_pa_get_device_info:; - - *pa_device_max_speed=maxStandardSampleRate; - *pa_device_min_speed=minStandardSampleRate; - *pa_device_max_bytes=maxBytes; - *pa_device_min_bytes=minBytes; - *pa_device_max_channels= maxInputChannels; - *pa_device_min_channels= minInputChannels; - - return speed_warning; -} - - -void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, - int* maxChan, int* minSpeed, int* maxSpeed) -{ - int i; - char pa_device_name[128]; - char pa_device_hostapi[128]; - double pa_device_max_speed; - double pa_device_min_speed; - int pa_device_max_bytes; - int pa_device_min_bytes; - int pa_device_max_channels; - int pa_device_min_channels; - char p2[256]; - char *p,*p1; - static int iret, valid_dev_cnt; - - iret=pa_get_device_info (id, - &pa_device_name, - &pa_device_hostapi, - &pa_device_max_speed, - &pa_device_min_speed, - &pa_device_max_bytes, - &pa_device_min_bytes, - &pa_device_max_channels, - &pa_device_min_channels); - - if (iret >= 0 ) { - valid_dev_cnt++; - - p1=(char*)""; - p=strstr(pa_device_hostapi,"MME"); - if(p!=NULL) p1=(char*)"MME"; - p=strstr(pa_device_hostapi,"Direct"); - if(p!=NULL) p1=(char*)"DirectX"; - p=strstr(pa_device_hostapi,"WASAPI"); - if(p!=NULL) p1=(char*)"WASAPI"; - p=strstr(pa_device_hostapi,"ASIO"); - if(p!=NULL) p1=(char*)"ASIO"; - p=strstr(pa_device_hostapi,"WDM-KS"); - if(p!=NULL) p1=(char*)"WDM-KS"; - - sprintf(p2,"%-8s %-39s",p1,pa_device_name); - for(i=0; i<50; i++) { - hostAPI_DeviceName[i]=p2[i]; - if(p2[i]==0) break; - } - *minChan=pa_device_min_channels; - *maxChan=pa_device_max_channels; - *minSpeed=(int)pa_device_min_speed; - *maxSpeed=(int)pa_device_max_speed; - } else { - for(i=0; i<50; i++) { - hostAPI_DeviceName[i]=0; - } - *minChan=0; - *maxChan=0; - *minSpeed=0; - *maxSpeed=0; - } -} - -void getDev(int* numDevices0, char hostAPI_DeviceName[][50], - int minChan[], int maxChan[], - int minSpeed[], int maxSpeed[]) -{ - int i,id,numDevices; - int minch,maxch,minsp,maxsp; - char apidev[256]; - - numDevices=Pa_GetDeviceCount(); - *numDevices0=numDevices; - - for(id=0; id #define NFFT 32768 @@ -161,10 +160,6 @@ MainWindow::MainWindow(QWidget *parent) : fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); - PaError paerr=Pa_Initialize(); //Initialize Portaudio - if(paerr!=paNoError) { - msgBox("Unable to initialize PortAudio."); - } readSettings(); //Restore user's setup params QFile lockFile(m_appDir + "/.lock"); //Create .lock so m65 will wait lockFile.open(QIODevice::ReadWrite); @@ -252,7 +247,6 @@ MainWindow::~MainWindow() soundInThread.quit(); soundInThread.wait(3000); } - Pa_Terminate(); fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); if(!m_decoderBusy) { QFile lockFile(m_appDir + "/.lock"); diff --git a/q65w/paInputDevice.c b/q65w/paInputDevice.c deleted file mode 100644 index bad4973f4..000000000 --- a/q65w/paInputDevice.c +++ /dev/null @@ -1,56 +0,0 @@ -#include -#include -#include - -void paInputDevice(int id, char* hostAPI_DeviceName, int* minChan, - int* maxChan, int* minSpeed, int* maxSpeed) -{ - int i; - char pa_device_name[128]; - char pa_device_hostapi[128]; - double pa_device_max_speed; - double pa_device_min_speed; - int pa_device_max_bytes; - int pa_device_min_bytes; - int pa_device_max_channels; - int pa_device_min_channels; - char p2[256]; - char *p,*p1; - static int iret, valid_dev_cnt; - - iret=pa_get_device_info (id, - &pa_device_name, - &pa_device_hostapi, - &pa_device_max_speed, - &pa_device_min_speed, - &pa_device_max_bytes, - &pa_device_min_bytes, - &pa_device_max_channels, - &pa_device_min_channels); - - if (iret >= 0 ) { - valid_dev_cnt++; - - p1=""; - p=strstr(pa_device_hostapi,"MME"); - if(p!=NULL) p1="MME"; - p=strstr(pa_device_hostapi,"Direct"); - if(p!=NULL) p1="DirectX"; - p=strstr(pa_device_hostapi,"WASAPI"); - if(p!=NULL) p1="WASAPI"; - p=strstr(pa_device_hostapi,"ASIO"); - if(p!=NULL) p1="ASIO"; - p=strstr(pa_device_hostapi,"WDM-KS"); - if(p!=NULL) p1="WDM-KS"; - - sprintf(p2,"%-8s %-39s",p1,pa_device_name); - for(i=0; i<50; i++) { - hostAPI_DeviceName[i]=p2[i]; - if(p2[i]==0) break; - } - *minChan=pa_device_min_channels; - *maxChan=pa_device_max_channels; - *minSpeed=(int)pa_device_min_speed; - *maxSpeed=(int)pa_device_max_speed; - } -} diff --git a/q65w/pa_get_device_info.c b/q65w/pa_get_device_info.c deleted file mode 100644 index 968d3434b..000000000 --- a/q65w/pa_get_device_info.c +++ /dev/null @@ -1,173 +0,0 @@ -#include -#include -#include - -#define MAX_LATENCY 20 - -PaStream *in_stream; -//------------------------------------------------------- pa_get_device_info -int pa_get_device_info (int n, - void *pa_device_name, - void *pa_device_hostapi, - double *pa_device_max_speed, - double *pa_device_min_speed, - int *pa_device_max_bytes, - int *pa_device_min_bytes, - int *pa_device_max_channels, - int *pa_device_min_channels ) -{ - - (void) n ; - (void) pa_device_name; - (void) pa_device_hostapi; - (void) pa_device_max_speed; - (void) pa_device_min_speed; - (void) pa_device_max_bytes; - (void) pa_device_min_bytes; - (void) pa_device_max_channels; - (void) pa_device_min_channels; - const PaDeviceInfo *deviceInfo; - PaError pa_err; - PaStreamParameters inputParameters; - int i,j, speed_warning; - int minBytes, maxBytes; - double maxStandardSampleRate; - double minStandardSampleRate; - int minInputChannels; - int maxInputChannels; - -// negative terminated list - static double standardSampleRates[] = {8000.0, 9600.0, - 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, - 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1}; -// ******************************************************* - - - *pa_device_max_speed=0; - *pa_device_min_speed=0; - *pa_device_max_bytes=0; - *pa_device_min_bytes=0; - *pa_device_max_channels=0; - *pa_device_min_channels=0; - minInputChannels=0; - if(n >= Pa_GetDeviceCount() ) return -1; - deviceInfo = Pa_GetDeviceInfo(n); - if (deviceInfo->maxInputChannels==0) return -1; - sprintf((char*)(pa_device_name),"%s",deviceInfo->name); - sprintf((char*)(pa_device_hostapi),"%s", - Pa_GetHostApiInfo( deviceInfo->hostApi )->name); - speed_warning=0; - -// bypass bug in Juli@ ASIO driver: -// this driver hangs after a Pa_IsFormatSupported call - i = strncmp(deviceInfo->name, "ASIO 2.0 - ESI Juli@", 19); - if (i == 0) { - minStandardSampleRate=44100; - maxStandardSampleRate=192000; - minBytes=1; - maxBytes=4; - maxInputChannels= deviceInfo->maxInputChannels; - minInputChannels= 1; - goto end_pa_get_device_info; - } - -// Investigate device capabilities. -// Check min and max samplerates with 16 bit data. - maxStandardSampleRate=0; - minStandardSampleRate=0; - inputParameters.device = n; - inputParameters.channelCount = deviceInfo->maxInputChannels; - inputParameters.sampleFormat = paInt16; - inputParameters.suggestedLatency = 0; - inputParameters.hostApiSpecificStreamInfo = NULL; - -// ************************************************************************ -//filter for portaudio Windows hostapi's with non experts. -//only allow ASIO or WASAPI or WDM-KS - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, "ASIO", 4); - if (i==0 ) goto end_filter_hostapi; - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, - "Windows WASAPI", 14); - if (i==0 ) goto end_filter_hostapi; - i = strncmp(Pa_GetHostApiInfo(deviceInfo->hostApi)->name, - "Windows WDM-KS", 14); - if (i==0 ) goto end_filter_hostapi; - speed_warning=1; -end_filter_hostapi:; - -// ************************************************************************ - i=0; - while(standardSampleRates[i] > 0 && minStandardSampleRate==0) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - standardSampleRates[i] ); - if(pa_err == paDeviceUnavailable) return -1; - if(pa_err == paInvalidDevice) return -1; - if(pa_err == paFormatIsSupported ) { - minStandardSampleRate=standardSampleRates[i]; - } - i++; - } - if(minStandardSampleRate == 0) return -1; - j=i; - while(standardSampleRates[i] > 0 ) i++; - i--; - while(i >= j && maxStandardSampleRate==0) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - standardSampleRates[i] ); - if(pa_err == paDeviceUnavailable) return -1; - if(pa_err == paInvalidDevice) return -1; - if( pa_err == paFormatIsSupported ) { - maxStandardSampleRate=standardSampleRates[i]; - } - i--; - } - -// check if min SampleRate = max SampleRate - if(maxStandardSampleRate==0 && (minStandardSampleRate != 0)) { - maxStandardSampleRate= minStandardSampleRate; - } - -// check min and max bytes - minBytes=2; - maxBytes=2; - inputParameters.sampleFormat = paUInt8; - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - if( pa_err == paFormatIsSupported ) { - minBytes=1; - } - inputParameters.sampleFormat = paInt32; - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - if( pa_err == paFormatIsSupported ) { - maxBytes=4; - } - -// check min channel count - maxInputChannels= deviceInfo->maxInputChannels; - inputParameters.channelCount = 1; - inputParameters.sampleFormat = paInt16; - pa_err=paFormatIsSupported+32000; - while(pa_err != paFormatIsSupported && - ( inputParameters.channelCount < (maxInputChannels+1)) ) { - pa_err=Pa_IsFormatSupported(&inputParameters, NULL, - maxStandardSampleRate ); - inputParameters.channelCount++; - } - if( pa_err == paFormatIsSupported ) { - minInputChannels=inputParameters.channelCount-1; - } else { - return -1; - } - -end_pa_get_device_info:; - - *pa_device_max_speed=maxStandardSampleRate; - *pa_device_min_speed=minStandardSampleRate; - *pa_device_max_bytes=maxBytes; - *pa_device_min_bytes=minBytes; - *pa_device_max_channels= maxInputChannels; - *pa_device_min_channels= minInputChannels; - - return speed_warning; -} diff --git a/q65w/q65w.pro b/q65w/q65w.pro index 276386e31..269b09818 100644 --- a/q65w/q65w.pro +++ b/q65w/q65w.pro @@ -51,8 +51,7 @@ RC_FILE = map65.rc unix { LIBS += ../map65/libm65/libm65.a -LIBS += -lfftw3f -lportaudio -lgfortran -#LIBS +- -lusb +LIBS += -lfftw3f -lgfortran } win32 { From 52b946f5469b5e10b9a0737919988bfdac1c0168 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 16:12:07 -0500 Subject: [PATCH 036/251] Remove portaudio input code. --- q65w/soundin.cpp | 196 ----------------------------------------------- 1 file changed, 196 deletions(-) diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 46433d4ea..5b13badb5 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -50,96 +50,6 @@ extern "C" } datcom_; } -typedef struct -{ - int kin; //Parameters sent to/from the portaudio callback function - int nrx; - int dB; - bool bzero; - bool iqswap; -} paUserData; - -//--------------------------------------------------------------- a2dCallback -extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer, - unsigned long framesToProcess, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ) - -// This routine called by the PortAudio engine when samples are available. -// It may be called at interrupt level, so don't do anything -// that could mess up the system like calling malloc() or free(). - -{ - paUserData *udata=(paUserData*)userData; - (void) outputBuffer; //Prevent unused variable warnings. - (void) timeInfo; - (void) userData; - int nbytes,i,j; - float d4[4*FRAMES_PER_BUFFER]; - float d4a[4*FRAMES_PER_BUFFER]; - float tmp; - float fac; - - if( (statusFlags&paInputOverflow) != 0) { - qDebug() << "Input Overflow"; - } - if(udata->bzero) { //Start of a new minute - udata->kin=0; //Reset buffer pointer - udata->bzero=false; - } - - nbytes=udata->nrx*8*framesToProcess; //Bytes per frame - memcpy(d4,inputBuffer,nbytes); //Copy all samples to d4 - - fac=32767.0 * pow(10.0,0.05*udata->dB); - - if(udata->nrx==2) { - for(i=0; i<4*int(framesToProcess); i++) { //Negate odd-numbered frames - d4[i]=fac*d4[i]; - j=i/4; - if((j%2)==1) d4[i]=-d4[i]; - } - if(!udata->iqswap) { - for(i=0; ikin],d4,nbytes); //Copy from d4 to dd() - } else { - int k=0; - for(i=0; i<2*int(framesToProcess); i+=2) { //Negate odd-numbered frames - j=i/2; - if(j%2==0) { - d4a[k++]=fac*d4[i]; - d4a[k++]=fac*d4[i+1]; - } else { - d4a[k++]=-fac*d4[i]; - d4a[k++]=-fac*d4[i+1]; - } - d4a[k++]=0.0; - d4a[k++]=0.0; - } - if(!udata->iqswap) { - for(i=0; ikin],d4a,2*nbytes); //Copy from d4a to dd() - } - udata->kin += framesToProcess; - return paContinue; -} - namespace { struct COMWrapper @@ -165,115 +75,9 @@ void SoundInThread::run() //SoundInThread::run() quitExecution = false; if (m_net) { -// qDebug() << "Start inputUDP()"; inputUDP(); -// qDebug() << "Finished inputUDP()"; return; } - - COMWrapper c; - - //---------------------------------------------------- Soundcard Setup - // qDebug() << "Start souncard input"; - - PaError paerr; - PaStreamParameters inParam; - PaStream *inStream; - paUserData udata; - - udata.kin=0; //Buffer pointer - udata.bzero=false; //Flag to request reset of kin - udata.nrx=m_nrx; //Number of polarizations - udata.iqswap=m_IQswap; - udata.dB=m_dB; - - auto device_info = Pa_GetDeviceInfo (m_nDevIn); - - inParam.device=m_nDevIn; //### Input Device Number ### - inParam.channelCount=2*m_nrx; //Number of analog channels - inParam.sampleFormat=paFloat32; //Get floats from Portaudio - inParam.suggestedLatency=device_info->defaultHighInputLatency; - inParam.hostApiSpecificStreamInfo=NULL; - - paerr=Pa_IsFormatSupported(&inParam,NULL,96000.0); - if(paerr<0) { - QString error_message; - if (paUnanticipatedHostError == paerr) - { - auto const * last_host_error = Pa_GetLastHostErrorInfo (); - error_message = QString {"PortAudio Host API error: %1"}.arg (last_host_error->errorText); - } - else - { - error_message = "PortAudio says requested soundcard format not supported."; - } - emit error(error_message); -// return; - } - paerr=Pa_OpenStream(&inStream, //Input stream - &inParam, //Input parameters - NULL, //No output parameters - 96000.0, //Sample rate - FRAMES_PER_BUFFER, //Frames per buffer -// paClipOff+paDitherOff, //No clipping or dithering - paClipOff, //No clipping - a2dCallback, //Input callbeck routine - &udata); //userdata - - paerr=Pa_StartStream(inStream); - if(paerr<0) { - emit error("Failed to start audio input stream."); - return; - } -// const PaStreamInfo* p=Pa_GetStreamInfo(inStream); - - bool qe = quitExecution; - int ntr0=99; - int k=0; - int nsec; - int ntr; - int nBusy=0; - int nhsym0=0; - -//---------------------------------------------- Soundcard input loop - while (!qe) { - qe = quitExecution; - if (qe) break; - qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; - nsec = ms/1000; // Time according to this computer - ntr = nsec % m_TRperiod; - -// Reset buffer pointer and symbol number at start of minute - if(ntr < ntr0 or !m_monitoring or m_TRperiod!=m_TRperiod0) { - nhsym0=0; - udata.bzero=true; - m_TRperiod0=m_TRperiod; - } - k=udata.kin; - udata.iqswap=m_IQswap; - udata.dB=m_dB; - if(m_monitoring) { - if(m_bForceCenterFreq) { - datcom_.fcenter=m_dForceCenterFreq; - } else { - datcom_.fcenter=144.125; - } - m_hsym=(k-2048)*11025.0/(2048.0*m_rate); - if(m_hsym != nhsym0) { - if(m_dataSinkBusy) { - nBusy++; - } else { - m_dataSinkBusy=true; - emit readyForFFT(k); //Signal to compute new FFTs - } - nhsym0=m_hsym; - } - } - msleep(100); - ntr0=ntr; - } - Pa_StopStream(inStream); - Pa_CloseStream(inStream); } void SoundInThread::setSwapIQ(bool b) From c2352bd00afcd3265d89b4429461be21c97efd05 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 16:15:41 -0500 Subject: [PATCH 037/251] Final(?) portaudio removal. --- q65w/CMakeLists.txt | 2 +- q65w/soundin.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index 97a3b01b8..d14d91f47 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -40,7 +40,7 @@ qt5_wrap_ui (q65w_GENUISRCS ${q65w_UISRCS}) add_executable (q65w ${q65w_CXXSRCS} ${q65w_CSRCS} ${q65w_GENUISRCS} q65w.rc) target_include_directories (q65w PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) -target_link_libraries (q65w wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Portaudio::Portaudio Usb::Usb) +target_link_libraries (q65w wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Usb::Usb) if (WSJT_CREATE_WINMAIN) set_target_properties (q65w PROPERTIES WIN32_EXECUTABLE ON) diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 5b13badb5..76edfcb4c 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -10,7 +10,6 @@ #define NFFT 32768 #define FRAMES_PER_BUFFER 1024 -#include extern "C" { struct From 29abbedfe890c3c47a0afc3330ca54ad47f1ae2d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 17:17:51 -0500 Subject: [PATCH 038/251] Revert "Start removing portAudio stuff." This reverts commit 7f6f260dc888b8aafc141488cec6aaa9b3905a1f. --- q65w/mainwindow.cpp | 17 +++++++++++++++-- q65w/mainwindow.h | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index c2e3eb639..7702dec08 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -195,7 +195,10 @@ MainWindow::MainWindow(QWidget *parent) : watcher2 = new QFutureWatcher; connect(watcher2, SIGNAL(finished()),this,SLOT(diskWriteFinished())); - soundInThread.setRate(96000.0); +// Assign input device and start input thread + soundInThread.setInputDevice(m_paInDevice); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); soundInThread.setPort(m_udpPort); @@ -286,6 +289,8 @@ void MainWindow::writeSettings() settings.setValue("NetworkInput", m_network); settings.setValue("FSam96000", m_fs96000); settings.setValue("SoundInIndex",m_nDevIn); + settings.setValue("paInDevice",m_paInDevice); + settings.setValue("paOutDevice",m_paOutDevice); settings.setValue("IQswap",m_IQswap); settings.setValue("Scale_dB",m_dB); settings.setValue("IQxt",m_bIQxt); @@ -346,6 +351,8 @@ void MainWindow::readSettings() m_network = settings.value("NetworkInput",true).toBool(); m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); + m_paInDevice = settings.value("paInDevice",0).toInt(); + m_paOutDevice = settings.value("paOutDevice",0).toInt(); m_IQswap = settings.value("IQswap",false).toBool(); m_dB = settings.value("Scale_dB",0).toInt(); m_initIQplus = settings.value("InitIQplus",false).toBool(); @@ -553,6 +560,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_network=m_network; dlg.m_fs96000=m_fs96000; dlg.m_nDevIn=m_nDevIn; + dlg.m_nDevOut=m_nDevOut; dlg.m_udpPort=m_udpPort; dlg.m_IQswap=m_IQswap; dlg.m_dB=m_dB; @@ -577,6 +585,9 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_fs96000=dlg.m_fs96000; m_network=dlg.m_network; m_nDevIn=dlg.m_nDevIn; + m_paInDevice=dlg.m_paInDevice; + m_nDevOut=dlg.m_nDevOut; + m_paOutDevice=dlg.m_paOutDevice; m_udpPort=dlg.m_udpPort; m_IQswap=dlg.m_IQswap; m_dB=dlg.m_dB; @@ -588,9 +599,11 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog soundInThread.quit(); soundInThread.wait(1000); soundInThread.setNetwork(m_network); - soundInThread.setRate(96000.0); + if(m_fs96000) soundInThread.setRate(96000.0); + if(!m_fs96000) soundInThread.setRate(95238.1); soundInThread.setFadd(m_fAdd); soundInThread.setNrx(1); + soundInThread.setInputDevice(m_paInDevice); soundInThread.start(QThread::HighestPriority); } } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e084f1948..488c7813d 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -122,8 +122,8 @@ private: qint32 m_mode65; qint32 m_nrx; qint32 m_hsym0; -// qint32 m_paInDevice; -// qint32 m_paOutDevice; + qint32 m_paInDevice; + qint32 m_paOutDevice; qint32 m_udpPort; qint32 m_NBslider; qint32 m_adjustIQ; From f88f5ddc7adae44f1bcdd5def6411edf344caaf3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 17:32:47 -0500 Subject: [PATCH 039/251] Remove the 95238 Hz sample-rate stuff. --- q65w/mainwindow.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7702dec08..42e3e0ffe 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -197,8 +197,7 @@ MainWindow::MainWindow(QWidget *parent) : // Assign input device and start input thread soundInThread.setInputDevice(m_paInDevice); - if(m_fs96000) soundInThread.setRate(96000.0); - if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setRate(96000.0); soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); soundInThread.setPort(m_udpPort); @@ -599,8 +598,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog soundInThread.quit(); soundInThread.wait(1000); soundInThread.setNetwork(m_network); - if(m_fs96000) soundInThread.setRate(96000.0); - if(!m_fs96000) soundInThread.setRate(95238.1); + soundInThread.setRate(96000.0); soundInThread.setFadd(m_fAdd); soundInThread.setNrx(1); soundInThread.setInputDevice(m_paInDevice); @@ -874,8 +872,7 @@ void MainWindow::diskDat() //diskDat() datcom_.fcenter=m_wide_graph_window->m_dForceCenterFreq; } - if(m_fs96000) hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol - if(!m_fs96000) hsym=2048.0*95238.1/11025.0; + hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol for(int i=0; i<304; i++) { // Do the half-symbol FFTs int k = i*hsym + 2048.5; dataSink(k); From 58075a444386fde4be2cfc4210a85c0bbb1de944 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 17:41:07 -0500 Subject: [PATCH 040/251] Why is m_psOutDevice needed, now? --- q65w/mainwindow.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 488c7813d..1c3d51bfc 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -123,7 +123,7 @@ private: qint32 m_nrx; qint32 m_hsym0; qint32 m_paInDevice; - qint32 m_paOutDevice; + qint32 m_paOutDevice; //### Why is this needed, now? ### qint32 m_udpPort; qint32 m_NBslider; qint32 m_adjustIQ; From c98eb2019fd9e6fcf9ac98d3aef32fb876c10a56 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 18:35:42 -0500 Subject: [PATCH 041/251] Looking for what's still needed... --- q65w/mainwindow.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 42e3e0ffe..20745f176 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -788,11 +788,6 @@ void MainWindow::msgBox(QString t) //msgBox msgBox0.exec(); } -void MainWindow::stub() //stub() -{ - msgBox("Not yet implemented."); -} - void MainWindow::on_actionAstro_Data_triggered() //Display Astro { if (m_astro_window ) m_astro_window->show(); From 1099837b50b70e45dc08645ca7dc34a0a9632764 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 18:41:28 -0500 Subject: [PATCH 042/251] More cleanup of unneeded stuff. --- q65w/mainwindow.cpp | 56 --------------------------------------------- q65w/mainwindow.h | 11 --------- 2 files changed, 67 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 20745f176..b983446c5 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1246,21 +1246,6 @@ void MainWindow::guiUpdate() bIQxt=m_bIQxt; } -void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg() -{ - bool eom; - eom=false; - for(int i=0;i<22; i++) { - if (i >= ba.size () || !ba[i]) eom=true; - if(eom) { - message[i] = ' '; - } else { - message[i]=ba[i]; - } - } - message[22] = '\0'; -} - void MainWindow::lookup() //lookup() { QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); @@ -1394,47 +1379,6 @@ void MainWindow::on_addButton_clicked() //Add button } } -/* -void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype() -{ -// if(t.length()<1) return 0; - char message[23]; - char msgsent[23]; - int len1=22; - int mode65=0; //mode65 ==> check message but don't make wave() - double samfac=1.0; - int nsendingsh=0; - int mwave; - t=t.toUpper(); - int i1=t.indexOf(" OOO"); - QByteArray s=t.toUpper().toLocal8Bit(); - ba2msg(s,message); - gen65_(message,&mode65,&samfac,&nsendingsh,msgsent,iwave, - &mwave,len1,len1); - - QPalette p(tx->palette()); - if(nsendingsh==1) { - p.setColor(QPalette::Base,"#66ffff"); - } else if(nsendingsh==-1) { - p.setColor(QPalette::Base,"#ffccff"); - } else { - p.setColor(QPalette::Base,Qt::white); - } - tx->setPalette(p); - int len=t.length(); - if(nsendingsh==-1) { - len=qMin(len,13); - if(i1>10) { - tx->setText(t.mid(0,len).toUpper() + " OOO"); - } else { - tx->setText(t.mid(0,len).toUpper()); - } - } else { - tx->setText(t); - } -} -*/ - void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed { m_hisCall=t.toUpper().trimmed(); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 1c3d51bfc..b7e70b7b2 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -217,9 +217,6 @@ private: void updateStatusBar(); void msgBox(QString t); void lookup(); - void ba2msg(QByteArray ba, char* message); - void msgtype(QString t, QLineEdit* tx); - void stub(); bool isGrid4(QString g); bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); }; @@ -240,14 +237,6 @@ extern "C" { float* px, float* py, float s[], int* nkhz, int* nhsym, int* nzap, float* slimit, uchar lstrong[]); - void gen65_(char* msg, int* mode65, double* samfac, - int* nsendingsh, char* msgsent, short iwave[], int* nwave, - int len1, int len2); - - void gen_q65_wave_(char* msg, int* ntxFreq, int* mode64, - char* msgsent, short iwave[], int* nwave, - int len1, int len2); - void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, const char* mygrid, int* ndop00, int len1); } From a7a53dc3bab6952eafa5abe600af1b3924a05fb7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 18:52:48 -0500 Subject: [PATCH 043/251] Don't need dxccPfx. --- q65w/devsetup.h | 1 - q65w/mainwindow.cpp | 4 ---- 2 files changed, 5 deletions(-) diff --git a/q65w/devsetup.h b/q65w/devsetup.h index 21deda46f..c3fe4b264 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -43,7 +43,6 @@ public: QString m_myGrid; QString m_saveDir; QString m_azelDir; - QString m_dxccPfx; QString m_editorCommand; public slots: diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index b983446c5..2df35beb4 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -277,7 +277,6 @@ void MainWindow::writeSettings() settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); settings.setValue("Editor",m_editorCommand); - settings.setValue("DXCCpfx",m_dxccPfx); settings.setValue("Timeout",m_timeout); settings.setValue("IQamp",iqAmp); settings.setValue("IQphase",iqPhase); @@ -337,7 +336,6 @@ void MainWindow::readSettings() m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); m_editorCommand=settings.value("Editor","notepad").toString(); - m_dxccPfx=settings.value("DXCCpfx","").toString(); m_timeout=settings.value("Timeout",20).toInt(); iqAmp=settings.value("IQamp",0).toInt(); iqPhase=settings.value("IQphase",0).toInt(); @@ -551,7 +549,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_saveDir=m_saveDir; dlg.m_azelDir=m_azelDir; dlg.m_editorCommand=m_editorCommand; - dlg.m_dxccPfx=m_dxccPfx; dlg.m_timeout=m_timeout; dlg.m_dPhi=m_dPhi; dlg.m_fCal=m_fCal; @@ -575,7 +572,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_saveDir=dlg.m_saveDir; m_azelDir=dlg.m_azelDir; m_editorCommand=dlg.m_editorCommand; - m_dxccPfx=dlg.m_dxccPfx; m_timeout=dlg.m_timeout; m_dPhi=dlg.m_dPhi; m_fCal=dlg.m_fCal; From 8c2fec1212191bce89d6e8d4f392636dc006957f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:07:15 -0500 Subject: [PATCH 044/251] Don't need getDev(). --- q65w/mainwindow.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index b7e70b7b2..f32759f80 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -224,9 +224,6 @@ private: extern void getfile(QString fname, bool xpol, int idInt); extern void savetf2(QString fname, bool xpol); extern int killbyname(const char* progName); -extern void getDev(int* numDevices,char hostAPI_DeviceName[][50], - int minChan[], int maxChan[], - int minSpeed[], int maxSpeed[]); extern "C" { //----------------------------------------------------- C and Fortran routines From 3dc206dc2b11d4d082d27d998856a179553a4622 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:31:17 -0500 Subject: [PATCH 045/251] More unneeded stuff removed. --- q65w/mainwindow.cpp | 11 ----------- q65w/mainwindow.h | 8 +------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2df35beb4..28d426d0e 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -93,9 +93,6 @@ MainWindow::MainWindow(QWidget *parent) : } }); - connect(&proc_editor, SIGNAL(error(QProcess::ProcessError)), - this, SLOT(editor_error())); - connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); m_waterfallAvg = 1; @@ -124,7 +121,6 @@ MainWindow::MainWindow(QWidget *parent) : m_udpPort=50004; m_adjustIQ=0; m_applyIQcal=0; - m_colors="000066ff0000ffff00969696646464"; m_nsave=0; m_modeJT65=0; m_modeQ65=0; @@ -312,7 +308,6 @@ void MainWindow::writeSettings() settings.setValue("GainY",(double)m_gainy); settings.setValue("PhaseX",(double)m_phasex); settings.setValue("PhaseY",(double)m_phasey); - settings.setValue("Colors",m_colors); settings.setValue("MaxDrift",ui->sbMaxDrift->value()); } @@ -393,7 +388,6 @@ void MainWindow::readSettings() m_gainy=settings.value("GainY",1.0).toFloat(); m_phasex=settings.value("PhaseX",0.0).toFloat(); m_phasey=settings.value("PhaseY",0.0).toFloat(); - m_colors=settings.value("Colors","000066ff0000ffff00969696646464").toString(); if(!ui->actionLinrad->isChecked() && !ui->actionCuteSDR->isChecked() && !ui->actionAFMHot->isChecked() && !ui->actionBlue->isChecked()) { @@ -1450,11 +1444,6 @@ void MainWindow::on_NBslider_valueChanged(int n) m_NBslider=n; } -void MainWindow::on_actionFUNcube_Dongle_triggered() -{ - proc_qthid.start (QDir::toNativeSeparators(m_appDir + "/qthid"), QStringList {}); -} - bool MainWindow::isGrid4(QString g) { if(g.length()!=4) return false; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index f32759f80..a1d1df96d 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -87,7 +87,6 @@ private slots: void on_NBslider_valueChanged(int value); void on_actionAFMHot_triggered(); void on_actionBlue_triggered(); - void on_actionFUNcube_Dongle_triggered(); void on_actionQ65A_triggered(); void on_actionQ65B_triggered(); void on_actionQ65C_triggered(); @@ -165,8 +164,6 @@ private: QRect m_wideGraphGeom; QLabel* lab1; // labels in status bar - QLabel* lab2; - QLabel* lab3; QLabel* lab4; QLabel* lab5; QLabel* lab6; @@ -180,9 +177,6 @@ private: QFutureWatcher* watcher2; QProcess proc_m65; - QProcess proc_qthid; - QProcess proc_editor; - QString m_path; QString m_pbdecoding_style1; @@ -198,7 +192,7 @@ private: QString m_palette; QString m_dateTime; QString m_mode; - QString m_colors; + QString m_colors; //Why still needed? QString m_editorCommand; QString m_modeTx; From c1972fc2ddb308b0d897914ff0b027a4d4917a47 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:36:10 -0500 Subject: [PATCH 046/251] More removals of unneeded studd, reduce size of id[] array. --- q65w/mainwindow.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 28d426d0e..7f04841ab 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -19,14 +19,9 @@ #define NFFT 32768 -short int iwave[2*60*12000]; //Wave file for Tx audio -int nwave; //Length of Tx waveform -bool bTune; -bool bIQxt; -double outputLatency; //Latency in seconds int iqAmp; int iqPhase; -qint16 id[4*60*96000]; +qint16 id[2*60*96000]; QSharedMemory mem_m65("mem_m65"); @@ -1233,7 +1228,6 @@ void MainWindow::guiUpdate() m_hsym0=khsym; m_sec0=nsec; } - bIQxt=m_bIQxt; } void MainWindow::lookup() //lookup() From defb89573f8f159d92de151316536bc024f2d7ee Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:44:48 -0500 Subject: [PATCH 047/251] More cleanup. --- q65w/mainwindow.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7f04841ab..ac52112b9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -70,12 +70,9 @@ MainWindow::MainWindow(QWidget *parent) : setWindowTitle (program_title ()); - connect(&soundInThread, SIGNAL(readyForFFT(int)), - this, SLOT(dataSink(int))); - connect(&soundInThread, SIGNAL(error(QString)), this, - SLOT(showSoundInError(QString))); - connect(&soundInThread, SIGNAL(status(QString)), this, - SLOT(showStatusMessage(QString))); + connect(&soundInThread, SIGNAL(readyForFFT(int)), this, SLOT(dataSink(int))); + connect(&soundInThread, SIGNAL(error(QString)), this, SLOT(showSoundInError(QString))); + connect(&soundInThread, SIGNAL(status(QString)), this, SLOT(showStatusMessage(QString))); createStatusBar(); connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); @@ -130,8 +127,7 @@ MainWindow::MainWindow(QWidget *parent) : while(true) { int iret=killbyname("m65.exe"); if(iret == 603) break; - if(iret != 0) msgBox("KillByName return code: " + - QString::number(iret)); + if(iret != 0) msgBox("KillByName return code: " + QString::number(iret)); } #endif @@ -946,8 +942,6 @@ void MainWindow::decode() //decode() { ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); -// QFile f("mockRTfiles.txt"); -// if(datcom_.nagain==0 && (!m_diskData) && !f.exists()) { if(datcom_.nagain==0 && (!m_diskData)) { qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000; int imin=ms/60000; @@ -963,8 +957,7 @@ void MainWindow::decode() //decode() datcom_.ndiskdat=0; if(m_diskData) { datcom_.ndiskdat=1; - int i0=m_path.indexOf(".tf2"); - if(i0<0) i0=m_path.indexOf(".iq"); + int i0=m_path.indexOf(".iq"); if(i0>0) { // Compute self Doppler using the filename for Date and Time int nyear=m_path.mid(i0-11,2).toInt()+2000; @@ -975,7 +968,6 @@ void MainWindow::decode() //decode() double uth=nhr + nmin/60.0; int nfreq=(int)datcom_.fcenter; int ndop00; - astrosub00_(&nyear, &month, &nday, &uth, &nfreq, m_myGrid.toLatin1(),&ndop00,6); datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom } From 4d51c4e0a8dd090367865cfbb87ca336f5a4d118 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:53:18 -0500 Subject: [PATCH 048/251] Get rid of most of the editor-command stuff. --- q65w/mainwindow.cpp | 15 +++++---------- q65w/mainwindow.h | 3 +-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index ac52112b9..72a2e1864 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -95,7 +95,7 @@ MainWindow::MainWindow(QWidget *parent) : m_myGrid="FN20qi"; m_saveDir="/users/joe/map65/install/save"; m_azelDir="/users/joe/map65/install/"; - m_editorCommand="notepad"; +// m_editorCommand="notepad"; m_loopall=false; m_startAnother=false; m_saveAll=false; @@ -263,7 +263,7 @@ void MainWindow::writeSettings() settings.setValue("AstroFont",m_astroFont); settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); - settings.setValue("Editor",m_editorCommand); +// settings.setValue("Editor",m_editorCommand); settings.setValue("Timeout",m_timeout); settings.setValue("IQamp",iqAmp); settings.setValue("IQphase",iqPhase); @@ -321,7 +321,7 @@ void MainWindow::readSettings() m_astroFont=settings.value("AstroFont",20).toInt(); m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); - m_editorCommand=settings.value("Editor","notepad").toString(); +// m_editorCommand=settings.value("Editor","notepad").toString(); m_timeout=settings.value("Timeout",20).toInt(); iqAmp=settings.value("IQamp",0).toInt(); iqPhase=settings.value("IQphase",0).toInt(); @@ -533,7 +533,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_astroFont=m_astroFont; dlg.m_saveDir=m_saveDir; dlg.m_azelDir=m_azelDir; - dlg.m_editorCommand=m_editorCommand; +// dlg.m_editorCommand=m_editorCommand; dlg.m_timeout=m_timeout; dlg.m_dPhi=m_dPhi; dlg.m_fCal=m_fCal; @@ -556,7 +556,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog ui->actionFind_Delta_Phi->setEnabled(false); m_saveDir=dlg.m_saveDir; m_azelDir=dlg.m_azelDir; - m_editorCommand=dlg.m_editorCommand; +// m_editorCommand=dlg.m_editorCommand; m_timeout=dlg.m_timeout; m_dPhi=dlg.m_dPhi; m_fCal=dlg.m_fCal; @@ -1063,11 +1063,6 @@ void MainWindow::m65_error (QProcess::ProcessError) QTimer::singleShot (0, this, SLOT (close ())); } -void MainWindow::editor_error() //editor_error -{ - msgBox("Error starting or running\n" + m_appDir + "/" + m_editorCommand); -} - void MainWindow::readFromStdout() //readFromStdout { while(proc_m65.canReadLine()) diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index a1d1df96d..e68ebed73 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -45,7 +45,6 @@ public slots: void freezeDecode(int n); void readFromStdout(); void m65_error (QProcess::ProcessError); - void editor_error(); void guiUpdate(); private: @@ -193,7 +192,7 @@ private: QString m_dateTime; QString m_mode; QString m_colors; //Why still needed? - QString m_editorCommand; + QString m_editorCommand; //Why still needed? QString m_modeTx; QHash m_worked; From c4288b143dae26e8bf96ef5a9c355733616e3c19 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 19:59:15 -0500 Subject: [PATCH 049/251] Remove (most of) lab7. --- q65w/mainwindow.cpp | 13 ------------- q65w/mainwindow.h | 4 ++-- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 72a2e1864..03ae0ce05 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -707,12 +707,6 @@ void MainWindow::createStatusBar() //createStatusBar lab6->setMinimumSize(QSize(50,10)); lab6->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab6); - - lab7 = new QLabel("Avg: 0"); - lab7->setAlignment(Qt::AlignHCenter); - lab7->setMinimumSize(QSize(50,10)); - lab7->setFrameStyle(QFrame::Panel | QFrame::Sunken); - statusBar()->addWidget(lab7); } void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox @@ -1068,13 +1062,6 @@ void MainWindow::readFromStdout() //readFromStdout while(proc_m65.canReadLine()) { QByteArray t=proc_m65.readLine(); - if(t.indexOf("") >= 0) { - m_nsum=t.mid(17,4).toInt(); - m_nsave=t.mid(21,4).toInt(); - lab7->setText (QString {"Avg: %1"}.arg (m_nsum)); - if(m_modeQ65>0) m_wide_graph_window->setDecodeFinished(); - } - if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { if(m_widebandDecode) { m_widebandDecode=false; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e68ebed73..3eea5d083 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -166,7 +166,7 @@ private: QLabel* lab4; QLabel* lab5; QLabel* lab6; - QLabel* lab7; + QLabel* lab7; //Why still needed? QMessageBox msgBox0; @@ -193,7 +193,7 @@ private: QString m_mode; QString m_colors; //Why still needed? QString m_editorCommand; //Why still needed? - QString m_modeTx; + QString m_modeTx; //Why still needed? QHash m_worked; From 3a9bb0a22e804e4e7518f6dca753cb3a9030842d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 20:09:38 -0500 Subject: [PATCH 050/251] Remove stuff for '&' to stdOut. --- q65w/mainwindow.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 03ae0ce05..093f6b1dc 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1091,23 +1091,6 @@ void MainWindow::readFromStdout() //readFromStdout ui->decodedTextBrowser->verticalScrollBar()->setValue(n); m_widebandDecode=true; } - - if(t.indexOf("&") >= 0) { - QString q(t); - QString callsign=q.mid(5); - callsign=callsign.mid(0,callsign.indexOf(" ")); - if(callsign.length()>2) { - if(m_worked[callsign]) { - q=q.mid(1,4) + " " + q.mid(5); - } else { - q=q.mid(1,4) + " *" + q.mid(5); - } - } - } - if(t.indexOf("=") >= 0) { - int n=t.size(); - qDebug() << t.mid(1,n-3).trimmed(); - } } } From df388a35f088ac2b37f26dfe2a795d8b86f8cbef Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 5 Dec 2022 20:12:01 -0500 Subject: [PATCH 051/251] Remove more junk. --- q65w/mainwindow.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 093f6b1dc..3ac43daae 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -95,7 +95,6 @@ MainWindow::MainWindow(QWidget *parent) : m_myGrid="FN20qi"; m_saveDir="/users/joe/map65/install/save"; m_azelDir="/users/joe/map65/install/"; -// m_editorCommand="notepad"; m_loopall=false; m_startAnother=false; m_saveAll=false; @@ -263,7 +262,6 @@ void MainWindow::writeSettings() settings.setValue("AstroFont",m_astroFont); settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); -// settings.setValue("Editor",m_editorCommand); settings.setValue("Timeout",m_timeout); settings.setValue("IQamp",iqAmp); settings.setValue("IQphase",iqPhase); @@ -321,7 +319,6 @@ void MainWindow::readSettings() m_astroFont=settings.value("AstroFont",20).toInt(); m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); -// m_editorCommand=settings.value("Editor","notepad").toString(); m_timeout=settings.value("Timeout",20).toInt(); iqAmp=settings.value("IQamp",0).toInt(); iqPhase=settings.value("IQphase",0).toInt(); @@ -533,7 +530,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog dlg.m_astroFont=m_astroFont; dlg.m_saveDir=m_saveDir; dlg.m_azelDir=m_azelDir; -// dlg.m_editorCommand=m_editorCommand; dlg.m_timeout=m_timeout; dlg.m_dPhi=m_dPhi; dlg.m_fCal=m_fCal; @@ -556,7 +552,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog ui->actionFind_Delta_Phi->setEnabled(false); m_saveDir=dlg.m_saveDir; m_azelDir=dlg.m_azelDir; -// m_editorCommand=dlg.m_editorCommand; m_timeout=dlg.m_timeout; m_dPhi=dlg.m_dPhi; m_fCal=dlg.m_fCal; @@ -1159,8 +1154,6 @@ void MainWindow::guiUpdate() if(m_nrx==1) t="S1"; if(m_nrx==2) t="S2"; } -// if((abs(m_nrx)==1 and m_xpol) or (abs(m_nrx)==2 and !m_xpol)) -// lab1->setStyleSheet("QLabel{background-color: #ff1493}"); if(khsym==m_hsym0) { t="Nil"; lab1->setStyleSheet("QLabel{background-color: #ffc0cb}"); From df96e8dee3d306c4dd80105e6862274ccac0953f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 09:01:52 -0500 Subject: [PATCH 052/251] Set Q65W program name and version. --- q65w/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/q65w/main.cpp b/q65w/main.cpp index 0fd3680b2..a6b612244 100644 --- a/q65w/main.cpp +++ b/q65w/main.cpp @@ -18,8 +18,8 @@ int main(int argc, char *argv[]) { QApplication a {argc, argv}; // Override programs executable basename as application name. - a.setApplicationName ("MAP65"); - a.setApplicationVersion ("3.0.1"); + a.setApplicationName ("Q65W"); + a.setApplicationVersion ("0.1"); // switch off as we share an Info.plist file with WSJT-X a.setAttribute (Qt::AA_DontUseNativeMenuBar); MainWindow w; From 86e9ecb651f3de9b2b301b1461d1075adfe4fcd1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 10:21:52 -0500 Subject: [PATCH 053/251] Be sure to set m_TRperiod! --- q65w/mainwindow.cpp | 6 +++--- q65w/soundin.cpp | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 3ac43daae..0bf2d33b7 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -187,6 +187,7 @@ MainWindow::MainWindow(QWidget *parent) : soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); soundInThread.setPort(m_udpPort); + soundInThread.setPeriod(m_TRperiod); soundInThread.start(QThread::HighestPriority); m_monitoring=true; // Start with Monitoring ON @@ -448,7 +449,7 @@ void MainWindow::dataSink(int k) ui->yMeterFrame->setVisible(false); lab4->setText ( - QString {" Rx: %1 %2 %% "} + QString {" Rx: %1 %2 % "} .arg (px, 5, 'f', 1) .arg (m_pctZap, 5, 'f', 1) ); @@ -1080,7 +1081,6 @@ void MainWindow::readFromStdout() //readFromStdout #ifdef WIN32 m=3; #endif -// qDebug() << "aa" << n << m << t.trimmed(); if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); @@ -1130,7 +1130,7 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << m_modeQ65; +// qDebug() << "AAA" << nsec%60 << m_TRperiod; soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 76edfcb4c..1bc02a4ac 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -202,7 +202,8 @@ void SoundInThread::inputUDP() qe = quitExecution; if (qe) break; if (!udpSocket->hasPendingDatagrams()) { - msleep(2); // Sleep if no packet available +// msleep(2); // Sleep if no packet available + QObject().thread()->usleep(2000); } else { int nBytesRead = udpSocket->readDatagram((char *)&b,1416); if (nBytesRead != 1416) qDebug() << "UDP Read Error:" << nBytesRead; @@ -217,6 +218,7 @@ void SoundInThread::inputUDP() nhsym0=0; m_TRperiod0=m_TRperiod; } + ntr0=ntr; if(m_monitoring) { From f519ff759227bf851b3a1b1ebaf6f1ea21b34e63 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 10:36:02 -0500 Subject: [PATCH 054/251] Fix up the signal thermometers. --- q65w/mainwindow.cpp | 1 - q65w/mainwindow.ui | 17 +++++------------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 0bf2d33b7..1f0d4369d 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -446,7 +446,6 @@ void MainWindow::dataSink(int k) QString t; m_pctZap=nzap/178.3; - ui->yMeterFrame->setVisible(false); lab4->setText ( QString {" Rx: %1 %2 % "} diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 5f61e48b1..459db3e05 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -181,16 +181,12 @@ p, li { white-space: pre-wrap; } - - QFrame::StyledPanel + + + 50 + 0 + - - QFrame::Raised - - - - - QFrame::StyledPanel @@ -642,9 +638,6 @@ p, li { white-space: pre-wrap; } Setup - - - From 5344fa559c1432038ac94e747e992285b05c9c72 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 10:55:52 -0500 Subject: [PATCH 055/251] Bump RC number to 6 (for now). --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a27d5ffb9..1e7c6893c 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 5) +set_build_type (RC 6) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # From f4412ea7e2aa7a9d5931cdaae1e74cfe4456d77e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 12:27:48 -0500 Subject: [PATCH 056/251] Only call decode() once, at ihsym=302. --- q65w/astro.cpp | 2 +- q65w/commons.h | 2 +- q65w/libm65/decode0.f90 | 10 ++++------ q65w/libm65/map65a.f90 | 2 +- q65w/mainwindow.cpp | 24 ++++++++---------------- q65w/mainwindow.h | 1 - 6 files changed, 15 insertions(+), 26 deletions(-) diff --git a/q65w/astro.cpp b/q65w/astro.cpp index a6b0460a8..38c45857b 100644 --- a/q65w/astro.cpp +++ b/q65w/astro.cpp @@ -70,7 +70,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, &azmoondx, &elmoondx, &ntsky, &ndop, &ndop00,&ramoon, &decmoon, &dgrd, &poloffset, &xnr, 6, 6); - datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom + datcom_.ndop00=ndop00; //Send self Doppler to decoder, via datcom sprintf(cc, "Az: %6.1f\n" "El: %6.1f\n" diff --git a/q65w/commons.h b/q65w/commons.h index f7ea43d9e..e8fff92bd 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -31,7 +31,7 @@ extern struct { //This is "common/datcom/..." in Fortran int nfsample; //Input sample rate int nxpol; //1 if using xpol antennas, 0 otherwise int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 - int nfast; //No longer used + int ndop00; //EME Self Doppler int nsave; //Number of s3(64,63) spectra saved int max_drift; //Maximum Q65 drift: units symbol_rate/TxT int nhsym; //Number of available JT65 half-symbols diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index 438079f1d..e3e8c251d 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -19,6 +19,7 @@ subroutine decode0(dd,ss,savg,nstandalone) save call sec0(0,tquick) + ncand=0 call timer('decode0 ',0) if(newdat.ne.0) then nz=96000*nhsym/5.3833 @@ -56,15 +57,12 @@ subroutine decode0(dd,ss,savg,nstandalone) mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00) + ndiskdat,nxpol,nmode,ndop00,ncand) call timer('map65a ',1) call timer('decode0 ',1) - call sec0(1,tdec) - if(nhsym.eq.nhsym1) write(*,1010) nsum,nsave,nstandalone,nhsym,tdec -1010 format('',3i4,i6,f6.2) - if(nhsym.eq.nhsym2) write(*,1012) nsum,nsave,nstandalone,nhsym,tdec,ndecodes -1012 format('',3i4,i6,f6.2,i5) + if(nhsym.eq.nhsym2) write(*,1012) ndecodes,ncand +1012 format('',2i4) flush(6) return diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index a6bf1bb80..249bbf6e4 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -2,7 +2,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00) + ndiskdat,nxpol,nmode,ndop00,ncand) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 1f0d4369d..8c1fd7453 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -90,7 +90,6 @@ MainWindow::MainWindow(QWidget *parent) : m_waterfallAvg = 1; m_network = true; m_restart=false; - m_widebandDecode=false; m_myCall="K1JT"; m_myGrid="FN20qi"; m_saveDir="/users/joe/map65/install/save"; @@ -495,7 +494,7 @@ void MainWindow::dataSink(int k) n=0; } - if(ihsym>=302) { //Decode at t=56 s (for Q65 and data from disk) + if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; datcom_.nagain=0; @@ -958,7 +957,7 @@ void MainWindow::decode() //decode() int nfreq=(int)datcom_.fcenter; int ndop00; astrosub00_(&nyear, &month, &nday, &uth, &nfreq, m_myGrid.toLatin1(),&ndop00,6); - datcom_.nfast=ndop00; //Send self Doppler to decoder, via datcom + datcom_.ndop00=ndop00; //Send self Doppler to decoder, via datcom } } datcom_.neme=0; @@ -987,7 +986,6 @@ void MainWindow::decode() //decode() if(!m_fs96000) datcom_.nfsample=95238; datcom_.nxpol=0; datcom_.nmode=10*m_modeQ65 + m_modeJT65; -// datcom_.nfast=1; //No longer used datcom_.nsave=m_nsave; datcom_.max_drift=ui->sbMaxDrift->value(); @@ -1053,22 +1051,17 @@ void MainWindow::m65_error (QProcess::ProcessError) } void MainWindow::readFromStdout() //readFromStdout -{ +{ while(proc_m65.canReadLine()) { QByteArray t=proc_m65.readLine(); - if((t.indexOf("") >= 0) or (t.indexOf("") >= 0)) { - if(m_widebandDecode) { - m_widebandDecode=false; - } + if(t.indexOf("") >= 0) { QFile lockFile(m_appDir + "/.lock"); lockFile.open(QIODevice::ReadWrite); - if(t.indexOf("") >= 0) { - int ndecodes=t.mid(40,5).toInt(); - lab5->setText(QString::number(ndecodes)); - m_map65RxLog=0; - m_startAnother=m_loopall; - } + QString t1=t.mid(16,8); + lab5->setText(t1); + m_map65RxLog=0; + m_startAnother=m_loopall; ui->DecodeButton->setStyleSheet(""); decodeBusy(false); return; @@ -1083,7 +1076,6 @@ void MainWindow::readFromStdout() //readFromStdout if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m).trimmed()); n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); ui->decodedTextBrowser->verticalScrollBar()->setValue(n); - m_widebandDecode=true; } } } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 3eea5d083..e860a586a 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -146,7 +146,6 @@ private: bool m_startAnother; bool m_saveAll; bool m_onlyEME; - bool m_widebandDecode; bool m_kb8rq; bool m_NB; bool m_fs96000; From 5054fb9e4e7c8011c1284ec52cc9aba143e57121 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 12:45:37 -0500 Subject: [PATCH 057/251] Remove a qDebug(). --- widgets/mainwindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 94b678065..6821a04ff 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -9209,7 +9209,6 @@ void MainWindow::readWidebandDecodes() } t+=t1; } - qDebug() << "bb" << t; if(m_ActiveStationsWidget != NULL) { m_ActiveStationsWidget->erase(); m_ActiveStationsWidget->displayRecentStations(t); From fcee5057f22e493adf2b7e6539c5523ea2926b0a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 13:05:36 -0500 Subject: [PATCH 058/251] No need for paOutDevice. --- q65w/mainwindow.cpp | 7 ------- q65w/mainwindow.h | 1 - 2 files changed, 8 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 8c1fd7453..037f9bb83 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -273,7 +273,6 @@ void MainWindow::writeSettings() settings.setValue("FSam96000", m_fs96000); settings.setValue("SoundInIndex",m_nDevIn); settings.setValue("paInDevice",m_paInDevice); - settings.setValue("paOutDevice",m_paOutDevice); settings.setValue("IQswap",m_IQswap); settings.setValue("Scale_dB",m_dB); settings.setValue("IQxt",m_bIQxt); @@ -332,7 +331,6 @@ void MainWindow::readSettings() m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); m_paInDevice = settings.value("paInDevice",0).toInt(); - m_paOutDevice = settings.value("paOutDevice",0).toInt(); m_IQswap = settings.value("IQswap",false).toBool(); m_dB = settings.value("Scale_dB",0).toInt(); m_initIQplus = settings.value("InitIQplus",false).toBool(); @@ -561,7 +559,6 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog m_nDevIn=dlg.m_nDevIn; m_paInDevice=dlg.m_paInDevice; m_nDevOut=dlg.m_nDevOut; - m_paOutDevice=dlg.m_paOutDevice; m_udpPort=dlg.m_udpPort; m_IQswap=dlg.m_IQswap; m_dB=dlg.m_dB; @@ -1162,10 +1159,6 @@ void MainWindow::guiUpdate() m_setftx=0; QString utc = t.date().toString(" yyyy MMM dd \n") + t.time().toString(); ui->labUTC->setText(utc); - if((!m_monitoring and !m_diskData) or (khsym==m_hsym0)) { - xSignalMeter->setValue(0); - lab4->setText(" Rx noise: 0.0 0.0% "); - } m_hsym0=khsym; m_sec0=nsec; } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e860a586a..a3beba068 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -121,7 +121,6 @@ private: qint32 m_nrx; qint32 m_hsym0; qint32 m_paInDevice; - qint32 m_paOutDevice; //### Why is this needed, now? ### qint32 m_udpPort; qint32 m_NBslider; qint32 m_adjustIQ; From 24859b0b3aece90815e5c14dac76c1e84c8c345c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 14:56:29 -0500 Subject: [PATCH 059/251] Establish max width for q65w main window. --- q65w/mainwindow.ui | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 459db3e05..e84772319 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -24,7 +24,7 @@ - 2048 + 550 800 @@ -1166,11 +1166,4 @@ p, li { white-space: pre-wrap; } - - - - true - - - From df21127af722595e0efdb684329262f6551afdb5 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 6 Dec 2022 15:59:12 -0500 Subject: [PATCH 060/251] Clean up the display in Active Stations window. --- q65w/libm65/ftninit.f90 | 2 +- widgets/mainwindow.cpp | 44 ++++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/q65w/libm65/ftninit.f90 b/q65w/libm65/ftninit.f90 index f97705942..c55bf04f6 100644 --- a/q65w/libm65/ftninit.f90 +++ b/q65w/libm65/ftninit.f90 @@ -10,7 +10,7 @@ subroutine ftninit(appd) addpfx=' ' call pfxdump(appd//'/prefixes.txt') - open(12,file=appd//'/wb_q65.txt',status='unknown') + open(12,file=appd//'/q65w_decodes.txt',status='unknown') open(13,file=appd//'/map65.log',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') open(21,file=appd//'/map65_rx.log',status='unknown',access='append',err=950) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 6821a04ff..ea9192dd5 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4782,7 +4782,7 @@ void MainWindow::guiUpdate() // qDebug() << "AAA" << nsec << int(m_specOp) << ui->labDXped->text(); if(m_mode=="Q65") { - QFileInfo fi(m_appDir+"/wb_q65.txt"); + QFileInfo fi(m_appDir+"/q65w_decodes.txt"); QDateTime fileTime=fi.lastModified(); QDateTime now = QDateTime::currentDateTimeUtc (); int age=fileTime.msecsTo(now)/1000; @@ -9162,10 +9162,10 @@ void MainWindow::write_transmit_entry (QString const& file_name) void MainWindow::readWidebandDecodes() { -// Update "m_wEMECall" by reading wb_dec.txt +// Update "m_wEMECall" by reading q65w_decodes.txt int nhr=0; int nmin=0; - QFile f(m_appDir+"/wb_q65.txt"); + QFile f(m_appDir+"/q65w_decodes.txt"); f.open(QIODevice::ReadOnly); if(f.isOpen()) { QTextStream in(&f); @@ -9179,12 +9179,12 @@ void MainWindow::readWidebandDecodes() QString msg=line.mid(27,-1); int i1=msg.indexOf(" "); int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); - QString call=msg.mid(i1+1,i2-i1); + QString dxcall=msg.mid(i1+1,i2-i1-1); QString w3=msg.mid(i2+1,-1); - m_EMECall[call].fsked=fsked; - m_EMECall[call].t=60*nhr + nmin; - m_EMECall[call].worked=false; - if(w3.contains(grid_regexp)) m_EMECall[call].grid4=w3; + m_EMECall[dxcall].fsked=fsked; + m_EMECall[dxcall].t=60*nhr + nmin; + m_EMECall[dxcall].worked=false; + if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; } f.close(); @@ -9199,16 +9199,38 @@ void MainWindow::readWidebandDecodes() QMap::iterator i; QString t=""; QString t1; + QString dxcall; + QStringList list; + float f[100]; + int indx[100]; + + int k=0; for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { int age=60*nhr + nmin - (i->t); if(age<0) age += 1440; + dxcall=(i.key()+" ").left(8); if(i->worked) { - t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,i.key().toLatin1().constData(),age); + t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); } else { - t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,i.key().toLatin1().constData(),age); + t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); } - t+=t1; + f[k]=i->fsked; + list.append(t1); + k++; } + + if(k>0) { + t1=""; + int kz=k; + indexx_(f,&kz,indx); + for(int k=0; kerase(); m_ActiveStationsWidget->displayRecentStations(t); From 10c70d042ccc3f19620d24a57b626af7a2ceb638 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 7 Dec 2022 11:45:05 -0500 Subject: [PATCH 061/251] Clean up the "Active Stations" display when used with Q65W. --- widgets/activeStations.cpp | 17 ++++++++++++++++- widgets/activeStations.h | 3 ++- widgets/activeStations.ui | 8 +++++++- widgets/mainwindow.cpp | 36 +++++++++++++++--------------------- 4 files changed, 40 insertions(+), 24 deletions(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index b5ecbf737..00b922bef 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -57,8 +57,23 @@ void ActiveStations::write_settings () settings_->setValue("ReadyOnly",ui->cbReadyOnly->isChecked()); } -void ActiveStations::displayRecentStations(QString const& t) +void ActiveStations::displayRecentStations(QString mode, QString const& t) { + m_mode=mode; + bool b=(m_mode=="Q65"); + if(b) { + ui->header_label2->setText(" N Freq Call Age"); + ui->label->setText("QSOs:"); + } else { + ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); + ui->label->setText("Rate:"); + } + ui->bandChanges->setVisible(!b); + ui->cbReadyOnly->setVisible(!b); + ui->label_2->setVisible(!b); + ui->label_3->setVisible(!b); + ui->score->setVisible(!b); + ui->sbMaxRecent->setVisible(!b); ui->RecentStationsPlainTextEdit->setPlainText(t); } diff --git a/widgets/activeStations.h b/widgets/activeStations.h index 1897f08d9..324908434 100644 --- a/widgets/activeStations.h +++ b/widgets/activeStations.h @@ -19,7 +19,7 @@ class ActiveStations public: explicit ActiveStations(QSettings *, QFont const&, QWidget * parent = 0); ~ActiveStations(); - void displayRecentStations(QString const&); + void displayRecentStations(QString mode, QString const&); void changeFont (QFont const&); int maxRecent(); int maxAge(); @@ -44,6 +44,7 @@ private: Q_SLOT void on_cbReadyOnly_toggled(bool b); qint64 m_msec0=0; + QString m_mode=""; QSettings * settings_; QScopedPointer ui; diff --git a/widgets/activeStations.ui b/widgets/activeStations.ui index 02b1f618a..427525853 100644 --- a/widgets/activeStations.ui +++ b/widgets/activeStations.ui @@ -50,7 +50,7 @@ - 16777215 + 80 16777215 @@ -82,6 +82,12 @@ 0 + + + 80 + 16777215 + + <html><head/><body><p>Set maximum elapsed number of T/R sequences.</p></body></html> diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ea9192dd5..03f3577b4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1369,7 +1369,6 @@ void MainWindow::readSettings() if (displayContestLog) on_contest_log_action_triggered (); if(displayActiveStations) { on_actionActiveStations_triggered(); -// QFile f {m_config.writeable_data_dir ().absoluteFilePath ("activeCalls.txt")}; } } @@ -3645,7 +3644,7 @@ void MainWindow::ARRL_Digi_Display() t += (t1 + list[k] + "\n"); if(i>=maxRecent) break; } - if(m_ActiveStationsWidget!=NULL) m_ActiveStationsWidget->displayRecentStations(t); + if(m_ActiveStationsWidget!=NULL) m_ActiveStationsWidget->displayRecentStations(m_mode,t); m_ActiveStationsWidget->setClickOK(true); } @@ -9183,19 +9182,11 @@ void MainWindow::readWidebandDecodes() QString w3=msg.mid(i2+1,-1); m_EMECall[dxcall].fsked=fsked; m_EMECall[dxcall].t=60*nhr + nmin; - m_EMECall[dxcall].worked=false; + m_EMECall[dxcall].worked=false; //### TEMPORARY ### if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; } f.close(); - /* - if(m_ActiveStationsWidget != NULL) m_ActiveStationsWidget->erase(); - - if(m_ActiveStationsWidget!=NULL) m_ActiveStationsWidget->displayRecentStations(t); - QString t1; - if(!bReady) t1 = t1.asprintf(" %3d %+2.2d %4d %1d %2d %4d",az,snr,freq,itx,age,points); - */ - QMap::iterator i; QString t=""; QString t1; @@ -9203,20 +9194,23 @@ void MainWindow::readWidebandDecodes() QStringList list; float f[100]; int indx[100]; + int maxAge=m_ActiveStationsWidget->maxAge(); int k=0; for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { int age=60*nhr + nmin - (i->t); if(age<0) age += 1440; - dxcall=(i.key()+" ").left(8); - if(i->worked) { - t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); - } else { - t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); + if(age<=maxAge) { + dxcall=(i.key()+" ").left(8); + if(i->worked) { + t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); + } else { + t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); + } + f[k]=i->fsked; + list.append(t1); + k++; } - f[k]=i->fsked; - list.append(t1); - k++; } if(k>0) { @@ -9225,7 +9219,7 @@ void MainWindow::readWidebandDecodes() indexx_(f,&kz,indx); for(int k=0; kerase(); - m_ActiveStationsWidget->displayRecentStations(t); + m_ActiveStationsWidget->displayRecentStations(m_mode,t); } } } From 9ff1f9ff3f53bd94eef33e0c07bf19b3dc12fee4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 8 Dec 2022 11:57:51 -0500 Subject: [PATCH 062/251] Allow clicking in Active Stations window to call a station identified by Q65W. --- q65w/mainwindow.cpp | 1 + widgets/activeStations.cpp | 2 +- widgets/activeStations.ui | 2 +- widgets/mainwindow.cpp | 30 ++++++++++++++++++++++++------ 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 037f9bb83..f5f2cd0da 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -1013,6 +1013,7 @@ void MainWindow::decode() //decode() datcom_.ndiskdat=0; m_map65RxLog=0; m_call3Modified=false; + qDebug() << "aa" << 10.0*log10(m_xavg); QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start lockFile.remove(); diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 00b922bef..3c429b83d 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -62,7 +62,7 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) m_mode=mode; bool b=(m_mode=="Q65"); if(b) { - ui->header_label2->setText(" N Freq Call Age"); + ui->header_label2->setText(" N Freq Call Tx Age"); ui->label->setText("QSOs:"); } else { ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); diff --git a/widgets/activeStations.ui b/widgets/activeStations.ui index 427525853..50730a9c6 100644 --- a/widgets/activeStations.ui +++ b/widgets/activeStations.ui @@ -195,7 +195,7 @@ - Call Grid Age Points + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 03f3577b4..babb87a6b 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1046,6 +1046,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, void MainWindow::not_GA_warning_message () { + /* ### TEMPORARY ### MessageBox::critical_message (this, "This is a pre-release version of WSJT-X 2.6.0 made\n" "available for testing purposes. By design it will\n" @@ -1054,6 +1055,7 @@ void MainWindow::not_GA_warning_message () if (now >= QDateTime {{2023, 03, 31}, {23, 59, 59, 999}, Qt::UTC}) { Q_EMIT finished (); } + */ } void MainWindow::initialize_fonts () @@ -3652,15 +3654,26 @@ void MainWindow::callSandP2(int n) { if(m_ready2call[n]=="") return; QStringList w=m_ready2call[n].split(' ', SkipEmptyParts); - m_deCall=w[0]; - m_deGrid=w[1]; + if(m_mode=="Q65") { + int nkhz=int(w[0].toFloat()+0.5); + m_freqNominal=(1296*1000 + nkhz)* 1000; + int i0=1; + if(w[1]=="*") i0=2; + m_deCall=w[i0]; + m_deGrid=""; + m_txFirst=(w[i0+1]=="0"); + ui->TxFreqSpinBox->setValue(1500); + } else { + m_deCall=w[0]; + m_deGrid=w[1]; + ui->RxFreqSpinBox->setValue(w[4].toInt()); + m_txFirst = (w[5]=="0"); + } m_bDoubleClicked=true; //### needed? ui->dxCallEntry->setText(m_deCall); ui->dxGridEntry->setText(m_deGrid); genStdMsgs(w[3]); //### real SNR would be better here? - ui->RxFreqSpinBox->setValue(w[4].toInt()); setTxMsg(1); - m_txFirst = (w[5]=="0"); ui->txFirstCheckBox->setChecked(m_txFirst); if (!ui->autoButton->isChecked()) ui->autoButton->click(); // Enable Tx if(m_transmitting) m_restart=true; @@ -9161,6 +9174,7 @@ void MainWindow::write_transmit_entry (QString const& file_name) void MainWindow::readWidebandDecodes() { + if(m_ActiveStationsWidget==NULL) return; // Update "m_wEMECall" by reading q65w_decodes.txt int nhr=0; int nmin=0; @@ -9196,21 +9210,24 @@ void MainWindow::readWidebandDecodes() int indx[100]; int maxAge=m_ActiveStationsWidget->maxAge(); + m_ActiveStationsWidget->setClickOK(false); int k=0; for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { + int odd=1 - (i->t)%2; int age=60*nhr + nmin - (i->t); if(age<0) age += 1440; if(age<=maxAge) { dxcall=(i.key()+" ").left(8); if(i->worked) { - t1=t1.asprintf("%5.1f %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); + t1=t1.asprintf("%5.1f %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); } else { - t1=t1.asprintf("%5.1f * %8s %4d\n",i->fsked,dxcall.toLatin1().constData(),age); + t1=t1.asprintf("%5.1f * %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); } f[k]=i->fsked; list.append(t1); k++; } + m_ActiveStationsWidget->setClickOK(true); } if(k>0) { @@ -9221,6 +9238,7 @@ void MainWindow::readWidebandDecodes() int j=indx[k]-1; t1=t1.asprintf("%2d ",k+1); t1+=list[j]; + m_ready2call[k]=list[j]; t+=t1; } } From ff56d9fa0b9621db0ad7f30aaf26fd2f56bc2587 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 8 Dec 2022 18:58:10 -0500 Subject: [PATCH 063/251] WIP on Q65W mainwindow. --- q65w/getfile.cpp | 2 +- q65w/mainwindow.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index 3b9ed2fe8..b74ba240c 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -4,7 +4,7 @@ #include #include -extern qint16 id[4*60*96000]; +extern qint16 id[2*60*96000]; void getfile(QString fname, bool xpol, int dbDgrd) { diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index f5f2cd0da..30d6b96b9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -455,6 +455,7 @@ void MainWindow::dataSink(int k) m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } + /* if(nadj == 10) { ui->decodedTextBrowser->append( QString {"Amp: %1 Phase: %1"} @@ -464,6 +465,7 @@ void MainWindow::dataSink(int k) ui->decodedTextBrowser->append(t); m_adjustIQ=0; } +*/ //Average over specified number of spectra if (n==0) { @@ -492,7 +494,9 @@ void MainWindow::dataSink(int k) n=0; } - if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) + qDebug() << "aa" << ihsym << k << px; + + if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; datcom_.nagain=0; @@ -996,7 +1000,7 @@ void MainWindow::decode() //decode() memcpy(datcom_.hiscall, hcall.toLatin1(), 12); memcpy(datcom_.hisgrid, hgrid.toLatin1(), 6); memcpy(datcom_.datetime, m_dateTime.toLatin1(), 17); - datcom_.junk1=1234; + datcom_.junk1=1234; //Cecck for these values in m65 datcom_.junk2=5678; char *to = (char*)mem_m65.data(); @@ -1013,7 +1017,6 @@ void MainWindow::decode() //decode() datcom_.ndiskdat=0; m_map65RxLog=0; m_call3Modified=false; - qDebug() << "aa" << 10.0*log10(m_xavg); QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start lockFile.remove(); From e26b2db9678c1519423208712d298fb1799e6b19 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 9 Dec 2022 19:08:35 -0500 Subject: [PATCH 064/251] Work in progress... Q65 decoding now works when called as a subroutine. --- lib/map65_mmdec.f90 | 5 +---- lib/q65_decode.f90 | 24 +++++++++++------------ lib/qra/q65/q65.f90 | 6 ++---- q65w/commons.h | 40 ++++++++++++++++++++++++++++++++++++++ q65w/libm65/CMakeLists.txt | 1 + q65w/libm65/ftninit.f90 | 13 ++++++++----- q65w/libm65/map65a.f90 | 29 ++++++++++++++------------- q65w/libm65/q65b.f90 | 31 +++++++++++++++-------------- q65w/main.cpp | 10 ++++++++++ q65w/mainwindow.cpp | 27 +++++++++++++++++++------ q65w/mainwindow.h | 5 +++++ 11 files changed, 131 insertions(+), 60 deletions(-) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index e0456b788..dc62e6e7e 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -29,7 +29,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & ! mygrid=transfer(params%mygrid,mygrid) ! hisgrid=transfer(params%hisgrid,hisgrid) datetime=' ' - + my_q65%decoded = 0 ncontest=0 nQSOprogress=0 @@ -43,9 +43,6 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & ndepth=2 !Does this make it too slow? ntrperiod=60 - open(17,file=trim(temp_dir)//'/red.dat',status='unknown') - open(14,file=trim(temp_dir)//'/avemsg.txt',status='unknown') - call timer('dec_q65 ',0) call my_q65%decode(q65_decoded,id2,nqd,nutc,ntrperiod,nsubmode,nfqso, & ntol,ndepth,nfa,nfb,lclearave,single_decode,lagain,max_drift,lnewdat, & diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 04e58eb86..515cdab6e 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -288,8 +288,8 @@ contains 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) +! 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 @@ -302,10 +302,10 @@ contains '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) +! 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 @@ -373,8 +373,8 @@ contains 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) +! 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 @@ -387,10 +387,10 @@ contains '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) +! 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 diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 2133294ef..aa104bbfc 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -217,11 +217,9 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & if(i2.eq.-9999 .and. ccf1(-i).ge.0.5*smax) i2=-i enddo width=df*(i2-i1) - if(ncw.eq.0) ccf1=0. - - call q65_write_red(iz,xdt,ccf2_avg,ccf2) - + call q65_write_red(iz,xdt,ccf2_avg,ccf2) !### Need this call for WSJT-X + if(idec.lt.0 .and. (iavg.eq.0 .or. iavg.eq.2)) then call q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) endif diff --git a/q65w/commons.h b/q65w/commons.h index e8fff92bd..ecea5fb35 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -43,6 +43,46 @@ extern struct { //This is "common/datcom/..." in Fortran int junk1; //Used to test extent of copy to shared memory int junk2; } datcom_; + +extern struct { //This is "common/datcom/..." in Fortran + float d4[4*5760000]; //Raw I/Q data from Linrad + float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol + float savg[4*NFFT]; //Avg spectra at 0,45,90,135 deg pol + double fcenter; //Center freq from Linrad (MHz) + int nutc; //UTC as integer, HHMM + int idphi; //Phase correction for Y pol'n, degrees + int mousedf; //User-selected DF + int mousefqso; //User-selected QSO freq (kHz) + int nagain; //1 ==> decode only at fQSO +/- Tol + int ndepth; //How much hinted decoding to do? + int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int neme; //Hinted decoding tries only for EME calls + int newdat; //1 ==> new data, must do long FFT + int nfa; //Low decode limit (kHz) + int nfb; //High decode limit (kHz) + int nfcal; //Frequency correction, for calibration (Hz) + int nfshift; //Shift of displayed center freq (kHz) + int mcall3; //1 ==> CALL3.TXT has been modified + int ntimeout; //Max for timeouts in Messages and BandMap + int ntol; //+/- decoding range around fQSO (Hz) + int nxant; //1 ==> add 45 deg to measured pol angle + int map65RxLog; //Flags to control log files + int nfsample; //Input sample rate + int nxpol; //1 if using xpol antennas, 0 otherwise + int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 + int ndop00; //EME Self Doppler + int nsave; //Number of s3(64,63) spectra saved + int max_drift; //Maximum Q65 drift: units symbol_rate/TxT + int nhsym; //Number of available JT65 half-symbols + char mycall[12]; + char mygrid[6]; + char hiscall[12]; + char hisgrid[6]; + char datetime[20]; + int junk1; //Used to test extent of copy to shared memory + int junk2; +} datcom2_; + } #endif // COMMONS_H diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index fe5ee170c..6a4e1c841 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -54,6 +54,7 @@ set (libm65_FSRCS jt65code.f90 k2grid.f90 lorentzian.f90 + m65c.f90 map65a.f90 moon2.f90 moondop.f90 diff --git a/q65w/libm65/ftninit.f90 b/q65w/libm65/ftninit.f90 index c55bf04f6..f4217b6a0 100644 --- a/q65w/libm65/ftninit.f90 +++ b/q65w/libm65/ftninit.f90 @@ -1,20 +1,23 @@ -subroutine ftninit(appd) +!subroutine ftninit() +subroutine ftninit use timer_module, only: timer use, intrinsic :: iso_c_binding, only: C_NULL_CHAR use FFTW3 - character*(*) appd +! character*(*) appd + character*1 appd character addpfx*8 character wisfile*256 common/pfxcom/addpfx + appd='.' addpfx=' ' call pfxdump(appd//'/prefixes.txt') open(12,file=appd//'/q65w_decodes.txt',status='unknown') - open(13,file=appd//'/map65.log',status='unknown') + open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') - open(21,file=appd//'/map65_rx.log',status='unknown',access='append',err=950) - open(26,file=appd//'/tmp26.txt',status='unknown') +! open(21,file=appd//'/map65_rx.log',status='unknown',access='append',err=950) +! open(26,file=appd//'/tmp26.txt',status='unknown') ! Import FFTW wisdom, if available: iret=fftwf_init_threads() !Initialize FFTW threading diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 249bbf6e4..657d14269 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -86,7 +86,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & nsum=0 !### Should use AppDir! ### - open(23,file='CALL3.TXT',status='unknown') +! open(23,file='CALL3.TXT',status='unknown') df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz if(nfsample.eq.95238) df=95238.1/NFFT @@ -305,7 +305,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ! Trim the list and produce a sorted index and sizes of groups. ! (Should trimlist remove all but best SNR for given UTC and message content?) -700 call trimlist(sig,km,ftol,indx,nsiz,nz) +700 call trimlist(sig,km,ftol,indx,nsiz,nz) done(1:km)=.false. j=0 ilatest=-1 @@ -373,27 +373,28 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & cmode='#A' if(mode65.eq.2) cmode='#B' if(mode65.eq.4) cmode='#C' - write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & - nsync2,nutc,decoded,cp,cmode -1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) +! write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & +! nsync2,nutc,decoded,cp,cmode +!1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) ndecodes=ndecodes+1 - write(21,1100) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & - cmode(1:1),cmode(2:2) -1100 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) +! write(21,1100) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & +! cmode(1:1),cmode(2:2) +!1100 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) endif endif j=j+nsiz(n) enddo !i=1,km - write(26,1015) nutc -1015 format(37x,i6.4,' ') - call flush(21) - call flush(26) - call display(nkeep,ftol) +! write(26,1015) nutc +!1015 format(37x,i6.4,' ') +! call flush(21) +! call flush(26) +! call display(nkeep,ftol) ndecdone=2 -900 close(23) +900 continue +! close(23) call flush(12) ndphi=0 mcall3b=mcall3a diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 index a45263de6..f65e3b3d7 100644 --- a/q65w/libm65/q65b.f90 +++ b/q65w/libm65/q65b.f90 @@ -40,10 +40,10 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & save if(newdat.eq.1) nutc00=-1 - open(9,file='wsjtx_dir.txt',status='old') - read(9,'(a)') wsjtx_dir !Establish the working directory - close(9) - +! open(9,file='wsjtx_dir.txt',status='old') +! read(9,'(a)') wsjtx_dir !Establish the working directory +! close(9) + if(mycall0(1:1).ne.' ') mycall=mycall0 if(hiscall0(1:1).ne.' ') hiscall=hiscall0 if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) @@ -139,10 +139,10 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & nsnr0=-99 !Default snr for no decode ! NB: Frequency of ipk is now shifted to 1000 Hz. + call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & newdat,nagain,max_drift,mycall,hiscall,hisgrid) - - MHz=fcenter + MHz=fcenter freq0=MHz + 0.001d0*ikhz if(nsnr0.gt.-99) then @@ -172,18 +172,18 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & cmode=': ' cmode(2:2)=char(ichar('A') + mode_q65-1) freq1=freq0 + 0.001d0*(ikhz1-ikhz) - write(26,1014) freq1,ndf,0,0,0,xdt0,npol,0,nsnr0,nutc,msg0(1:22), & - ':',cp,cmode -1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,1x,2a1,2x,a2) +! write(26,1014) freq1,ndf,0,0,0,xdt0,npol,0,nsnr0,nutc,msg0(1:22), & +! ':',cp,cmode +!1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,1x,2a1,2x,a2) ! Suppress writing duplicates (same time, decoded message, and frequency) ! to map65_rx.log if(nutc.ne.nutc00 .or. msg0(1:28).ne.msg00 .or. freq1.ne.freq1_00) then ! Write to file map65_rx.log: ndecodes=ndecodes+1 - write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28), & - cmode(2:2),cq0 -1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': ',a1,2x,a3) +! write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28), & +! cmode(2:2),cq0 +!1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': ',a1,2x,a3) nutc00=nutc msg00=msg0(1:28) freq1_00=freq1 @@ -195,9 +195,10 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & 1121 format('~',i4.4,f9.3,f7.2,i5,2x,a,i6) endif endif - -900 close(13) - close(17) + +900 continue +! close(13) +! close(17) call flush(6) idec=-1 read(cq0(2:2),*) idec diff --git a/q65w/main.cpp b/q65w/main.cpp index a6b612244..eac86216d 100644 --- a/q65w/main.cpp +++ b/q65w/main.cpp @@ -12,11 +12,21 @@ extern "C" { // Fortran procedures we need void four2a_ (_Complex float *, int * nfft, int * ndim, int * isign, int * iform, int len); + + void _gfortran_set_args(int argc, char *argv[]); + void _gfortran_set_convert(int conv); + void ftninit_(void); } int main(int argc, char *argv[]) { QApplication a {argc, argv}; + +// Initialize libgfortran: + _gfortran_set_args(argc, argv); + _gfortran_set_convert(0); + ftninit_(); + // Override programs executable basename as application name. a.setApplicationName ("Q65W"); a.setApplicationVersion ("0.1"); diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 30d6b96b9..d3f42e011 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -180,6 +180,8 @@ MainWindow::MainWindow(QWidget *parent) : watcher2 = new QFutureWatcher; connect(watcher2, SIGNAL(finished()),this,SLOT(diskWriteFinished())); + connect(&watcher3, SIGNAL(finished()),this,SLOT(decoderFinished())); + // Assign input device and start input thread soundInThread.setInputDevice(m_paInDevice); soundInThread.setRate(96000.0); @@ -494,7 +496,7 @@ void MainWindow::dataSink(int k) n=0; } - qDebug() << "aa" << ihsym << k << px; +// qDebug() << "aa" << ihsym << k << px; if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; @@ -849,7 +851,16 @@ void MainWindow::diskWriteFinished() //diskWriteFinished { // qDebug() << "diskWriteFinished"; } - //Delete ../save/*.tf2 + +void MainWindow::decoderFinished() //diskWriteFinished +{ + m_map65RxLog=0; + m_startAnother=m_loopall; + ui->DecodeButton->setStyleSheet(""); + decodeBusy(false); +} + +//Delete ../save/*.tf2 void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() { int i; @@ -1003,7 +1014,8 @@ void MainWindow::decode() //decode() datcom_.junk1=1234; //Cecck for these values in m65 datcom_.junk2=5678; - char *to = (char*)mem_m65.data(); +// char *to = (char*)mem_m65.data(); + char *to = (char*) datcom2_.d4; char *from = (char*) datcom_.d4; int size=sizeof(datcom_); if(datcom_.newdat==0) { @@ -1012,14 +1024,17 @@ void MainWindow::decode() //decode() from += noffset; size -= noffset; } - memcpy(to, from, qMin(mem_m65.size(), size-8)); + memcpy(to, from, qMin(mem_m65.size(), size-4)); datcom_.nagain=0; datcom_.ndiskdat=0; m_map65RxLog=0; m_call3Modified=false; - QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start - lockFile.remove(); +// QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start +// lockFile.remove(); + + watcher3.setFuture(QtConcurrent::run (std::bind (m65c_))); + decodeBusy(true); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index a3beba068..b38cfaa10 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -42,6 +42,7 @@ public slots: void dataSink(int k); void diskDat(); void diskWriteFinished(); + void decoderFinished(); void freezeDecode(int n); void readFromStdout(); void m65_error (QProcess::ProcessError); @@ -173,6 +174,8 @@ private: QFutureWatcher* watcher1; QFutureWatcher* watcher2; + QFutureWatcher watcher3; //For decoder + QProcess proc_m65; QString m_path; @@ -227,6 +230,8 @@ extern "C" { void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, const char* mygrid, int* ndop00, int len1); + + void m65c_(void); } #endif // MAINWINDOW_H From 1a5815f08417a17762252b390cb55901e1022511 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 9 Dec 2022 19:19:59 -0500 Subject: [PATCH 065/251] Add a needed file. --- q65w/libm65/m65c.f90 | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 q65w/libm65/m65c.f90 diff --git a/q65w/libm65/m65c.f90 b/q65w/libm65/m65c.f90 new file mode 100644 index 000000000..3b533d195 --- /dev/null +++ b/q65w/libm65/m65c.f90 @@ -0,0 +1,49 @@ +subroutine m65c + + use timer_module, only: timer + use timer_impl, only: init_timer !, limtrace + use, intrinsic :: iso_c_binding, only: C_NULL_CHAR + use FFTW3 + use q65 + use q65_decode + + parameter (NFFT=32768) + include 'njunk.f90' +! real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768) + real*8 fcenter + integer nparams0(NJUNK+3),nparams(NJUNK+3) + logical ldecoded,first + character*12 mycall,hiscall + character*6 mygrid,hisgrid + character*20 datetime + character*80 cwd + + common/datcom2/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),nparams0 + common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & + mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & + ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & + datetime,junk1,junk2 + common/early/nhsym1,nhsym2,ldecoded(32768) + equivalence (nparams,fcenter) + data first/.true./ + save first,cwd + + lq65w=.true. + lq65w2=.true. + nparams=nparams0 !Copy parameters into common/npar/ + datetime(18:20)=':00' + +! if(first) then +! call getcwd(cwd) +! call ftninit(trim(cwd)) +! call init_timer (trim(cwd)//'/timer.out') +! first=.false. +! endif + + npatience=1 + nstandalone=0 + if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone) + + return +end subroutine m65c From 61d9d45be19722b396ed9892668fb0a3ff164e34 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 09:24:24 -0500 Subject: [PATCH 066/251] Clean up the timer 'init' and 'fini' calls, etc. --- q65w/libm65/decode0.f90 | 2 -- q65w/libm65/ftninit.f90 | 5 ++++- q65w/libm65/m65c.f90 | 24 +++++++++++++++--------- q65w/mainwindow.cpp | 12 ++++++++---- q65w/mainwindow.h | 2 +- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index e3e8c251d..fa66b4bbd 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -20,7 +20,6 @@ subroutine decode0(dd,ss,savg,nstandalone) call sec0(0,tquick) ncand=0 - call timer('decode0 ',0) if(newdat.ne.0) then nz=96000*nhsym/5.3833 hist=0 @@ -59,7 +58,6 @@ subroutine decode0(dd,ss,savg,nstandalone) neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00,ncand) call timer('map65a ',1) - call timer('decode0 ',1) if(nhsym.eq.nhsym2) write(*,1012) ndecodes,ncand 1012 format('',2i4) diff --git a/q65w/libm65/ftninit.f90 b/q65w/libm65/ftninit.f90 index f4217b6a0..d93fe4076 100644 --- a/q65w/libm65/ftninit.f90 +++ b/q65w/libm65/ftninit.f90 @@ -1,7 +1,7 @@ !subroutine ftninit() subroutine ftninit - use timer_module, only: timer + use timer_impl, only: init_timer !,fini_timer, limtrace use, intrinsic :: iso_c_binding, only: C_NULL_CHAR use FFTW3 ! character*(*) appd @@ -10,6 +10,9 @@ subroutine ftninit character wisfile*256 common/pfxcom/addpfx + lu=8 + call init_timer('./timer.out') + appd='.' addpfx=' ' call pfxdump(appd//'/prefixes.txt') diff --git a/q65w/libm65/m65c.f90 b/q65w/libm65/m65c.f90 index 3b533d195..558a9d8ae 100644 --- a/q65w/libm65/m65c.f90 +++ b/q65w/libm65/m65c.f90 @@ -1,7 +1,7 @@ -subroutine m65c +subroutine m65c(itimer) use timer_module, only: timer - use timer_impl, only: init_timer !, limtrace + use timer_impl, only: fini_timer !, limtrace use, intrinsic :: iso_c_binding, only: C_NULL_CHAR use FFTW3 use q65 @@ -29,21 +29,27 @@ subroutine m65c data first/.true./ save first,cwd + if(itimer.ne.0) then +! call timer('q65w ',1) +! call timer('q65w ',101) + call timer('decode0 ',101) + call fini_timer + return + endif + lq65w=.true. lq65w2=.true. nparams=nparams0 !Copy parameters into common/npar/ datetime(18:20)=':00' -! if(first) then -! call getcwd(cwd) -! call ftninit(trim(cwd)) -! call init_timer (trim(cwd)//'/timer.out') -! first=.false. -! endif +! if(first) call timer('q65w ',0) +! first=.false. npatience=1 nstandalone=0 - if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone) + call timer('decode0 ',0) + call decode0(dd,ss,savg,nstandalone) + call timer('decode0 ',1) return end subroutine m65c diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index d3f42e011..547514ca1 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -233,6 +233,9 @@ MainWindow::MainWindow(QWidget *parent) : MainWindow::~MainWindow() { writeSettings(); + int itimer=1; + m65c_(&itimer); + if (soundInThread.isRunning()) { soundInThread.quit(); soundInThread.wait(3000); @@ -751,7 +754,7 @@ void MainWindow::on_stopButton_clicked() //stopButton { m_monitoring=false; soundInThread.setMonitoring(m_monitoring); - m_loopall=false; + m_loopall=false; } void MainWindow::msgBox(QString t) //msgBox @@ -1033,7 +1036,8 @@ void MainWindow::decode() //decode() // QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start // lockFile.remove(); - watcher3.setFuture(QtConcurrent::run (std::bind (m65c_))); + int itimer=0; + watcher3.setFuture(QtConcurrent::run (std::bind (m65c_, &itimer))); decodeBusy(true); } @@ -1067,7 +1071,7 @@ void MainWindow::m65_error (QProcess::ProcessError) } void MainWindow::readFromStdout() //readFromStdout -{ +{ while(proc_m65.canReadLine()) { QByteArray t=proc_m65.readLine(); @@ -1302,7 +1306,7 @@ void MainWindow::on_addButton_clicked() //Add button } while(!s.isNull()); if(hc>hc1 && !m_call3Modified) out << newEntry + "\n"; } - + if(m_call3Modified) { auto const& old_path = m_appDir + "/CALL3.OLD"; QFile f0 {old_path}; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index b38cfaa10..8128acbc7 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -231,7 +231,7 @@ extern "C" { void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, const char* mygrid, int* ndop00, int len1); - void m65c_(void); + void m65c_(int* itimer); } #endif // MAINWINDOW_H From 689d852a49cc6e374cbdfca72fd686028f302082 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 10:52:58 -0500 Subject: [PATCH 067/251] Returd Q65W results to GUI, and some cleanup. --- q65w/commons.h | 6 ++++++ q65w/libm65/decode0.f90 | 9 +++------ q65w/libm65/map65a.f90 | 7 +++---- q65w/libm65/q65b.f90 | 10 +++++++--- q65w/mainwindow.cpp | 23 +++++++++++++++++++---- q65w/mainwindow.h | 3 ++- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index ecea5fb35..801330f06 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -83,6 +83,12 @@ extern struct { //This is "common/datcom/..." in Fortran int junk2; } datcom2_; +extern struct { + int ndecodes; + int ncand; + char result[50][60]; +} decodes_; + } #endif // COMMONS_H diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index fa66b4bbd..7f1ba2855 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -9,17 +9,17 @@ subroutine decode0(dd,ss,savg,nstandalone) logical ldecoded character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 character mycall0*12,hiscall0*12,hisgrid0*6 + character*60 result + common/decodes/ndecodes,ncand,result(50) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime common/early/nhsym1,nhsym2,ldecoded(32768) - common/decodes/ndecodes data neme0/-99/,mcall3b/1/ save call sec0(0,tquick) - ncand=0 if(newdat.ne.0) then nz=96000*nhsym/5.3833 hist=0 @@ -56,11 +56,8 @@ subroutine decode0(dd,ss,savg,nstandalone) mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00,ncand) + ndiskdat,nxpol,nmode,ndop00) call timer('map65a ',1) - - if(nhsym.eq.nhsym2) write(*,1012) ndecodes,ncand -1012 format('',2i4) flush(6) return diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 657d14269..756624e65 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -2,7 +2,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00,ncand) + ndiskdat,nxpol,nmode,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. @@ -30,11 +30,11 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & real short(3,NFFT) !SNR dt ipol for potential shorthands real qphi(12) type(candidate) :: cand(MAX_CANDIDATES) - + character*60 result + common/decodes/ndecodes,ncand,result(50) common/c3com/ mcall3a common/testcom/ifreq common/early/nhsym1,nhsym2,ldecoded(32768) - common/decodes/ndecodes data blank/' '/,cm/'#'/ data shmsg0/'ATT','RO ','RRR','73 '/ @@ -42,7 +42,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & save rewind 12 - ndecodes=0 ! Clean start for Q65 at early decode if(nhsym.eq.nhsym1 .or. nagain.ne.0) ldecoded=.false. diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 index f65e3b3d7..13023047e 100644 --- a/q65w/libm65/q65b.f90 +++ b/q65w/libm65/q65b.f90 @@ -33,9 +33,10 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & character*80 line character*80 wsjtx_dir character*1 cp,cmode*2 + character*60 result + common/decodes/ndecodes,ncand,result(50) common/cacb/ca,cb common/early/nhsym1,nhsym2,ldecoded(32768) - common/decodes/ndecodes data nutc00/-1/,msg00/' '/ save @@ -189,10 +190,13 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & freq1_00=freq1 frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal fsked=frx - 0.001*ndop00/2.0 - 1.5 + write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) 1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) - write(*,1121) nutc,fsked,xdt0,nsnr0,trim(msg0) -1121 format('~',i4.4,f9.3,f7.2,i5,2x,a,i6) +! print*,ndecodes,result(ndecodes) + result(ndecodes)=trim(result(ndecodes))//char(0) +! write(*,1121) nutc,fsked,xdt0,nsnr0,trim(msg0) +!1121 format('~',i4.4,f9.3,f7.2,i5,2x,a,i6) endif endif diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 547514ca1..e137805a0 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -75,7 +75,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(&soundInThread, SIGNAL(status(QString)), this, SLOT(showStatusMessage(QString))); createStatusBar(); - connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); +// connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); connect(&proc_m65, &QProcess::errorOccurred, this, &MainWindow::m65_error); connect(&proc_m65, static_cast (&QProcess::finished), [this] (int exitCode, QProcess::ExitStatus status) { @@ -499,8 +499,6 @@ void MainWindow::dataSink(int k) n=0; } -// qDebug() << "aa" << ihsym << k << px; - if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; @@ -861,6 +859,10 @@ void MainWindow::decoderFinished() //diskWriteFinished m_startAnother=m_loopall; ui->DecodeButton->setStyleSheet(""); decodeBusy(false); + + QString t1; + t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); + lab5->setText(t1); } //Delete ../save/*.tf2 @@ -1036,6 +1038,9 @@ void MainWindow::decode() //decode() // QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start // lockFile.remove(); + decodes_.ndecodes=0; + decodes_.ncand=0; + m_fetched=0; int itimer=0; watcher3.setFuture(QtConcurrent::run (std::bind (m65c_, &itimer))); @@ -1070,6 +1075,7 @@ void MainWindow::m65_error (QProcess::ProcessError) QTimer::singleShot (0, this, SLOT (close ())); } +/* void MainWindow::readFromStdout() //readFromStdout { while(proc_m65.canReadLine()) @@ -1099,6 +1105,7 @@ void MainWindow::readFromStdout() //readFromStdout } } } +*/ void MainWindow::on_EraseButton_clicked() { @@ -1140,8 +1147,16 @@ void MainWindow::guiUpdate() on_actionOpen_next_in_directory_triggered(); } + if(decodes_.ndecodes>m_fetched) { + while(m_fetcheddecodedTextBrowser->append(t.trimmed()); + m_fetched++; + } + } + if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << m_TRperiod; +// qDebug() << "AAA" << nsec%60 << decodes_.ndecodes << decodes_.ncand; soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 8128acbc7..e3042189e 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -44,7 +44,7 @@ public slots: void diskWriteFinished(); void decoderFinished(); void freezeDecode(int n); - void readFromStdout(); +// void readFromStdout(); void m65_error (QProcess::ProcessError); void guiUpdate(); @@ -133,6 +133,7 @@ private: qint32 m_modeQ65; qint32 m_RxState; qint32 m_dB; + qint32 m_fetched=0; double m_fAdd; double m_xavg; From 4b3cc34fa5da397beca23225e1e48667ff5f0e37 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 11:07:47 -0500 Subject: [PATCH 068/251] Get rid of lots of unneeded "second process" stuff. --- q65w/mainwindow.cpp | 102 -------------------------------------------- q65w/mainwindow.h | 6 --- 2 files changed, 108 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index e137805a0..8db83c76f 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -74,17 +74,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(&soundInThread, SIGNAL(error(QString)), this, SLOT(showSoundInError(QString))); connect(&soundInThread, SIGNAL(status(QString)), this, SLOT(showStatusMessage(QString))); createStatusBar(); - -// connect(&proc_m65, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStdout())); - connect(&proc_m65, &QProcess::errorOccurred, this, &MainWindow::m65_error); - connect(&proc_m65, static_cast (&QProcess::finished), - [this] (int exitCode, QProcess::ExitStatus status) { - if (subProcessFailed (&proc_m65, exitCode, status)) - { - QTimer::singleShot (0, this, SLOT (close ())); - } - }); - connect(m_gui_timer, &QTimer::timeout, this, &MainWindow::guiUpdate); m_waterfallAvg = 1; @@ -146,11 +135,6 @@ MainWindow::MainWindow(QWidget *parent) : fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); readSettings(); //Restore user's setup params - QFile lockFile(m_appDir + "/.lock"); //Create .lock so m65 will wait - lockFile.open(QIODevice::ReadWrite); - QFile quitFile(m_appDir + "/.quit"); - quitFile.remove(); - proc_m65.start(QDir::toNativeSeparators(m_appDir + "/m65"), {"-s", }); m_pbdecoding_style1="QPushButton{background-color: cyan; \ border-style: outset; border-width: 1px; border-radius: 5px; \ @@ -241,10 +225,6 @@ MainWindow::~MainWindow() soundInThread.wait(3000); } fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); - if(!m_decoderBusy) { - QFile lockFile(m_appDir + "/.lock"); - lockFile.remove(); - } delete ui; } @@ -724,25 +704,6 @@ void MainWindow::closeEvent (QCloseEvent * e) { if (m_gui_timer) m_gui_timer->stop (); m_wide_graph_window->saveSettings(); - QFile quitFile(m_appDir + "/.quit"); - quitFile.open(QIODevice::ReadWrite); - QFile lockFile(m_appDir + "/.lock"); - lockFile.remove(); // Allow m65 to terminate - - // close pipes - proc_m65.closeReadChannel (QProcess::StandardOutput); - proc_m65.closeReadChannel (QProcess::StandardError); - - // flush all input - proc_m65.setReadChannel (QProcess::StandardOutput); - proc_m65.readAll (); - proc_m65.setReadChannel (QProcess::StandardError); - proc_m65.readAll (); - - proc_m65.disconnect (); - if (!proc_m65.waitForFinished (1000)) proc_m65.kill(); - quitFile.remove(); - mem_m65.detach(); if (m_astro_window) m_astro_window->close (); if (m_wide_graph_window) m_wide_graph_window->close (); QMainWindow::closeEvent (e); @@ -1035,9 +996,6 @@ void MainWindow::decode() //decode() m_map65RxLog=0; m_call3Modified=false; -// QFile lockFile(m_appDir + "/.lock"); // Allow m65 to start -// lockFile.remove(); - decodes_.ndecodes=0; decodes_.ncand=0; m_fetched=0; @@ -1047,66 +1005,6 @@ void MainWindow::decode() //decode() decodeBusy(true); } -bool MainWindow::subProcessFailed (QProcess * process, int exit_code, QProcess::ExitStatus status) -{ - if (exit_code || QProcess::NormalExit != status) - { - QStringList arguments; - for (auto argument: process->arguments ()) - { - if (argument.contains (' ')) argument = '"' + argument + '"'; - arguments << argument; - } - MessageBox::critical_message (this, tr ("Subprocess Error") - , tr ("Subprocess failed with exit code %1") - .arg (exit_code) - , tr ("Running: %1\n%2") - .arg (process->program () + ' ' + arguments.join (' ')) - .arg (QString {process->readAllStandardError()})); - return true; - } - return false; -} - -void MainWindow::m65_error (QProcess::ProcessError) -{ - msgBox("Error starting or running\n" + m_appDir + "/m65 -s\n\n" - + proc_m65.errorString ()); - QTimer::singleShot (0, this, SLOT (close ())); -} - -/* -void MainWindow::readFromStdout() //readFromStdout -{ - while(proc_m65.canReadLine()) - { - QByteArray t=proc_m65.readLine(); - if(t.indexOf("") >= 0) { - QFile lockFile(m_appDir + "/.lock"); - lockFile.open(QIODevice::ReadWrite); - QString t1=t.mid(16,8); - lab5->setText(t1); - m_map65RxLog=0; - m_startAnother=m_loopall; - ui->DecodeButton->setStyleSheet(""); - decodeBusy(false); - return; - } - - if(t.indexOf("~") >= 0) { - int n=t.length(); - int m=2; -#ifdef WIN32 - m=3; -#endif - if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m).trimmed()); - n=ui->decodedTextBrowser->verticalScrollBar()->maximum(); - ui->decodedTextBrowser->verticalScrollBar()->setValue(n); - } - } -} -*/ - void MainWindow::on_EraseButton_clicked() { qint64 ms=QDateTime::currentMSecsSinceEpoch(); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e3042189e..c8617455f 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -7,7 +7,6 @@ #include #include #include -#include #include "getfile.h" #include "soundin.h" #include "signalmeter.h" @@ -44,8 +43,6 @@ public slots: void diskWriteFinished(); void decoderFinished(); void freezeDecode(int n); -// void readFromStdout(); - void m65_error (QProcess::ProcessError); void guiUpdate(); private: @@ -177,8 +174,6 @@ private: QFutureWatcher watcher3; //For decoder - QProcess proc_m65; - QString m_path; QString m_pbdecoding_style1; QString m_pbmonitor_style; @@ -213,7 +208,6 @@ private: void msgBox(QString t); void lookup(); bool isGrid4(QString g); - bool subProcessFailed (QProcess *, int exit_code, QProcess::ExitStatus); }; extern void getfile(QString fname, bool xpol, int idInt); From 1dba0e16020e5d6e714856a2a0b58031d351951b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 13:18:08 -0500 Subject: [PATCH 069/251] Starting to clean up the Q65W WideGraph UI. --- q65w/widegraph.cpp | 58 +--------------------------------------------- q65w/widegraph.ui | 7 +++--- 2 files changed, 4 insertions(+), 61 deletions(-) diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp index 4e3eeba7a..17897aa7f 100644 --- a/q65w/widegraph.cpp +++ b/q65w/widegraph.cpp @@ -299,31 +299,6 @@ void WideGraph::on_fCenterLineEdit_editingFinished() m_dForceCenterFreq=ui->fCenterLineEdit->text().toDouble(); } -/* -void WideGraph::on_pbSetRxHardware_clicked() -{ - int iret=set570(m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq); - if(iret != 0) { - QMessageBox mb; - if(iret==-1) mb.setText("Failed to open Si570."); - if(iret==-2) mb.setText("Frequency out of permitted range."); - mb.exec(); - } -} - -void WideGraph::initIQplus() -{ - int iret=set570(288.0); - if(iret != 0) { - QMessageBox mb; - if(iret==-1) mb.setText("Failed to open Si570."); - if(iret==-2) mb.setText("Frequency out of permitted range."); - mb.exec(); - } else { - on_pbSetRxHardware_clicked(); - } -} -*/ void WideGraph::on_cbSpec2d_toggled(bool b) { ui->widePlot->set2Dspec(b); @@ -344,43 +319,12 @@ void WideGraph::on_cbLockTxRx_stateChanged(int n) m_bLockTxRx = (n!=0); ui->widePlot->setLockTxRx(m_bLockTxRx); } -/* -void WideGraph::rx570() -{ - double f=m_mult570*(1.0+0.000001*m_cal570)*m_dForceCenterFreq; - int iret=set570(f); - if(iret != 0) { - QMessageBox mb; - if(iret==-1) mb.setText("Failed to open Si570."); - if(iret==-2) mb.setText("Frequency out of permitted range."); - mb.exec(); - } -} -void WideGraph::tx570() -{ - if(m_bForceCenterFreq) datcom_.fcenter=m_dForceCenterFreq; - m_bIQxt=true; - double f=ui->widePlot->txFreq(); -// double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * f; - double f1=m_mult570Tx*(1.0+0.000001*m_cal570) * (f - m_TxOffset); - - int iret=set570(f1); - if(iret != 0) { - QMessageBox mb; - if(iret==-1) mb.setText("Failed to open Si570."); - if(iret==-2) mb.setText("Frequency out of permitted range."); - mb.exec(); - } -} -*/ void WideGraph::updateFreqLabel() { auto rxFreq = QString {"%1"}.arg (ui->widePlot->rxFreq (), 10, 'f', 6); - auto txFreq = QString {"%1"}.arg (ui->widePlot->txFreq (), 10, 'f', 6); rxFreq.insert (rxFreq.size () - 3, '.'); - txFreq.insert (txFreq.size () - 3, '.'); - ui->labFreq->setText (QString {"Rx: %1\nTx: %2"}.arg (rxFreq, txFreq)); + ui->labFreq->setText (QString {"Rx: %1"}.arg (rxFreq)); } void WideGraph::enableSetRxHardware(bool b) diff --git a/q65w/widegraph.ui b/q65w/widegraph.ui index 38f90d47d..675b92f92 100644 --- a/q65w/widegraph.ui +++ b/q65w/widegraph.ui @@ -44,9 +44,9 @@ 940 - 230 + 250 211 - 41 + 21 @@ -61,8 +61,7 @@ } - Rx: 144.118.200 -Tx: 144.127.317 + Rx: 1296.065.200 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter From 0e416e5d1fefedce2d09a12fbf616b66062b49c9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 13:45:24 -0500 Subject: [PATCH 070/251] More cleanup of Wide Graph GUI. --- q65w/widegraph.cpp | 60 +------------ q65w/widegraph.h | 5 -- q65w/widegraph.ui | 218 +++++++++++++++++++++------------------------ 3 files changed, 106 insertions(+), 177 deletions(-) diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp index 17897aa7f..f8a9d97c0 100644 --- a/q65w/widegraph.cpp +++ b/q65w/widegraph.cpp @@ -42,14 +42,6 @@ WideGraph::WideGraph (QString const& settings_filename, QWidget * parent) ui->widePlot->setBinsPerPixel(nbpp); m_waterfallAvg = settings.value("WaterfallAvg",10).toInt(); ui->waterfallAvgSpinBox->setValue(m_waterfallAvg); - ui->freqOffsetSpinBox->setValue(settings.value("FreqOffset",0).toInt()); - m_bForceCenterFreq=settings.value("ForceCenterFreqBool",false).toBool(); - m_dForceCenterFreq=settings.value("ForceCenterFreqMHz",144.125).toDouble(); - ui->cbFcenter->setChecked(m_bForceCenterFreq); - ui->cbLockTxRx->setChecked(m_bLockTxRx); - ui->fCenterLineEdit->setText(QString::number(m_dForceCenterFreq)); - m_bLockTxRx=settings.value("LockTxRx",false).toBool(); - ui->cbLockTxRx->setChecked(m_bLockTxRx); } WideGraph::~WideGraph() @@ -80,10 +72,6 @@ void WideGraph::saveSettings() settings.setValue("PlotWidth",ui->widePlot->plotWidth()); settings.setValue("FreqSpan",ui->freqSpanSpinBox->value()); settings.setValue("WaterfallAvg",ui->waterfallAvgSpinBox->value()); - settings.setValue("FreqOffset",ui->widePlot->freqOffset()); - settings.setValue("ForceCenterFreqBool",m_bForceCenterFreq); - settings.setValue("ForceCenterFreqMHz",m_dForceCenterFreq); - settings.setValue("LockTxRx",m_bLockTxRx); } void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, @@ -122,7 +110,7 @@ void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, n=0; int w=ui->widePlot->plotWidth(); - qint64 sf = nkhz + ui->widePlot->freqOffset() - 0.5*w*nbpp*df/1000.0; + qint64 sf = nkhz - 0.5*w*nbpp*df/1000.0; if(sf != ui->widePlot->startFreq()) ui->widePlot->SetStartFreq(sf); int i0=16384.0+(ui->widePlot->startFreq()-nkhz+1.27046+0.001*m_fCal) * 1000.0/df + 0.5; @@ -154,22 +142,6 @@ void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, } } -void WideGraph::on_freqOffsetSpinBox_valueChanged(int f) -{ - ui->widePlot->SetFreqOffset(f); -} - -void WideGraph::on_freqSpanSpinBox_valueChanged(int n) -{ - ui->widePlot->setNSpan(n); - int w = ui->widePlot->plotWidth(); - int nbpp = n * 32768.0/(w*96.0) + 0.5; - if(nbpp < 1) nbpp=1; - if(w > 0) { - ui->widePlot->setBinsPerPixel(nbpp); - } -} - void WideGraph::on_waterfallAvgSpinBox_valueChanged(int n) { m_waterfallAvg = n; @@ -282,23 +254,6 @@ void WideGraph::setMode65(int n) ui->widePlot->setMode65(n); } -void WideGraph::on_cbFcenter_stateChanged(int n) -{ - m_bForceCenterFreq = (n!=0); - if(m_bForceCenterFreq) { - ui->fCenterLineEdit->setEnabled(true); - ui->pbSetRxHardware->setEnabled(true); - } else { - ui->fCenterLineEdit->setDisabled(true); - ui->pbSetRxHardware->setDisabled(true); - } -} - -void WideGraph::on_fCenterLineEdit_editingFinished() -{ - m_dForceCenterFreq=ui->fCenterLineEdit->text().toDouble(); -} - void WideGraph::on_cbSpec2d_toggled(bool b) { ui->widePlot->set2Dspec(b); @@ -314,20 +269,9 @@ void WideGraph::setPeriod(int n) m_TRperiod=n; } -void WideGraph::on_cbLockTxRx_stateChanged(int n) -{ - m_bLockTxRx = (n!=0); - ui->widePlot->setLockTxRx(m_bLockTxRx); -} - void WideGraph::updateFreqLabel() { auto rxFreq = QString {"%1"}.arg (ui->widePlot->rxFreq (), 10, 'f', 6); rxFreq.insert (rxFreq.size () - 3, '.'); - ui->labFreq->setText (QString {"Rx: %1"}.arg (rxFreq)); -} - -void WideGraph::enableSetRxHardware(bool b) -{ - ui->pbSetRxHardware->setEnabled(b); + ui->labFreq->setText (QString {"Center freq: %1"}.arg (rxFreq)); } diff --git a/q65w/widegraph.h b/q65w/widegraph.h index 29739beaa..f826fbeab 100644 --- a/q65w/widegraph.h +++ b/q65w/widegraph.h @@ -51,15 +51,10 @@ protected: private slots: void on_waterfallAvgSpinBox_valueChanged(int arg1); - void on_freqSpanSpinBox_valueChanged(int arg1); - void on_freqOffsetSpinBox_valueChanged(int arg1); void on_zeroSpinBox_valueChanged(int arg1); void on_gainSpinBox_valueChanged(int arg1); void on_autoZeroPushButton_clicked(); - void on_cbFcenter_stateChanged(int arg1); - void on_fCenterLineEdit_editingFinished(); void on_cbSpec2d_toggled(bool checked); - void on_cbLockTxRx_stateChanged(int arg1); private: Ui::WideGraph * ui; diff --git a/q65w/widegraph.ui b/q65w/widegraph.ui index 675b92f92..4e7fc9d54 100644 --- a/q65w/widegraph.ui +++ b/q65w/widegraph.ui @@ -40,33 +40,6 @@ 1 - - - - 940 - 250 - 211 - 21 - - - - - 12 - - - - QLabel { - background-color: rgba(0, 0, 0, 0); - color: yellow; -} - - - Rx: 1296.065.200 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - @@ -74,7 +47,7 @@ - + Qt::Horizontal @@ -86,46 +59,6 @@ - - - - - 0 - 0 - - - - - 60 - 0 - - - - - 16777215 - 16777215 - - - - kHz - - - Offset - - - -24 - - - 24 - - - 1 - - - 0 - - - @@ -166,6 +99,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + @@ -197,6 +146,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + @@ -222,6 +187,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + @@ -247,6 +228,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + @@ -254,6 +251,22 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + @@ -261,6 +274,29 @@ + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + <html><head/><body><p>Center freq: 1296.065.000</p></body></html> + + + @@ -274,52 +310,6 @@ - - - - Lock Tx=Rx Freq - - - - - - - Force Center Freq (MHz) - - - - - - - false - - - - 0 - 0 - - - - - 65 - 16777215 - - - - 1296.065 - - - - - - - false - - - Set Rx Freq - - - From d26f8c1a30f52cf7bfbaff770afa4e25257b337c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 13:50:51 -0500 Subject: [PATCH 071/251] Change Wide Graph title to "Wideband Waterfall". --- q65w/mainwindow.ui | 2 +- q65w/widegraph.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index e84772319..aecd58bc4 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -748,7 +748,7 @@ p, li { white-space: pre-wrap; } - Wide Waterfall + Wideband Waterfall diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp index f8a9d97c0..d2ff50b7a 100644 --- a/q65w/widegraph.cpp +++ b/q65w/widegraph.cpp @@ -12,7 +12,7 @@ WideGraph::WideGraph (QString const& settings_filename, QWidget * parent) m_settings_filename {settings_filename} { ui->setupUi(this); - setWindowTitle("Wide Graph"); + setWindowTitle("Wideband Waterfall"); setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint); installEventFilter(parent); //Installing the filter ui->widePlot->setCursor(Qt::CrossCursor); From 9f1c6164873ef39d22a44902b4c8d7f01ee00825 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 14:12:57 -0500 Subject: [PATCH 072/251] Move Settings to the File menu. --- q65w/devsetup.cpp | 8 -------- q65w/devsetup.h | 6 ------ q65w/devsetup.ui | 4 ++-- q65w/mainwindow.cpp | 2 +- q65w/mainwindow.h | 2 +- q65w/mainwindow.ui | 26 ++++++++++---------------- 6 files changed, 14 insertions(+), 34 deletions(-) diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index dacb82055..f331efa4c 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -48,11 +48,3 @@ void DevSetup::accept() m_dB=ui.sb_dB->value(); QDialog::accept(); } - -void DevSetup::on_soundCardRadioButton_toggled(bool checked) -{ - ui.label_Port->setEnabled(!checked); - ui.sbPort->setEnabled(!checked); - ui.cbIQswap->setEnabled(checked); - ui.sb_dB->setEnabled(checked); -} diff --git a/q65w/devsetup.h b/q65w/devsetup.h index c3fe4b264..888da3a15 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -25,12 +25,9 @@ public: qint32 m_fCal; qint32 m_udpPort; qint32 m_astroFont; - qint32 m_mult570; - qint32 m_mult570Tx; qint32 m_dB; double m_fAdd; - double m_cal570; double m_TxOffset; bool m_network; @@ -48,9 +45,6 @@ public: public slots: void accept(); -private slots: - void on_soundCardRadioButton_toggled(bool checked); - private: int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3; Ui::DialogSndCard ui; diff --git a/q65w/devsetup.ui b/q65w/devsetup.ui index 6d6f798ec..e3be1344e 100644 --- a/q65w/devsetup.ui +++ b/q65w/devsetup.ui @@ -234,7 +234,7 @@ - C:\Users\joe\wsjt\map65\save + @@ -258,7 +258,7 @@ - C:\Users\joe\wsjt\map65 + diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 8db83c76f..d260e1456 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -505,7 +505,7 @@ void MainWindow::showSoundInError(const QString& errorMsg) void MainWindow::showStatusMessage(const QString& statusMsg) {statusBar()->showMessage(statusMsg);} -void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog +void MainWindow::on_actionSettings_triggered() { DevSetup dlg(this); dlg.m_myCall=m_myCall; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index c8617455f..0fc8657b6 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -51,7 +51,6 @@ private: virtual void closeEvent (QCloseEvent *) override; private slots: - void on_actionDeviceSetup_triggered(); void on_monitorButton_clicked(); void on_actionExit_triggered(); void on_actionAbout_triggered(); @@ -80,6 +79,7 @@ private slots: void on_dxGridEntry_textChanged(const QString &arg1); void bumpDF(int n); void on_actionErase_map65_rx_log_triggered(); + void on_actionSettings_triggered(); void on_NBcheckBox_toggled(bool checked); void on_NBslider_valueChanged(int value); void on_actionAFMHot_triggered(); diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index aecd58bc4..a2097e75a 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -627,18 +627,13 @@ p, li { white-space: pre-wrap; } - + + - - - Setup - - - View @@ -691,7 +686,6 @@ p, li { white-space: pre-wrap; } - @@ -712,14 +706,6 @@ p, li { white-space: pre-wrap; } Exit - - - Options - - - F2 - - About Q65W @@ -1138,6 +1124,14 @@ p, li { white-space: pre-wrap; } Release Notes + + + Settings ... + + + F2 + + From d8093cf4dc7c885e3fbfa27175acdd42bedf6114 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 14:15:29 -0500 Subject: [PATCH 073/251] Update the "About" message. --- q65w/about.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/q65w/about.cpp b/q65w/about.cpp index c05b169e2..d77897c38 100644 --- a/q65w/about.cpp +++ b/q65w/about.cpp @@ -10,10 +10,9 @@ CAboutDlg::CAboutDlg(QWidget *parent) : ui->labelTxt->setText("

" + QString {"MAP65 v" + QCoreApplication::applicationVersion () + " " + revision ()}.simplified () + "


" - "MAP65 implements a wideband polarization-matching receiver
" - "for the JT65 protocol, with a matching transmitting facility.
" - "It is primarily intended for amateur radio EME communication.

" - "Copyright 2001-2021 by Joe Taylor, K1JT. Additional
" + "Q65W is a wideband receiver for the Q65 protocol,
" + "intended primarily for amateur radio EME communication.

" + "Copyright 2001-2023 by Joe Taylor, K1JT. Additional
" "acknowledgments are contained in the source code."); } From f83a5c6cbe4f7bf2544a9c503535615b0fe830c4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 14:40:18 -0500 Subject: [PATCH 074/251] Get rid of the shared memory segment. --- q65w/CMakeLists.txt | 2 +- q65w/about.cpp | 2 +- q65w/killbyname.cpp | 282 -------------------------------------------- q65w/mainwindow.cpp | 34 +----- q65w/q65w.pro | 4 - 5 files changed, 4 insertions(+), 320 deletions(-) delete mode 100644 q65w/killbyname.cpp diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index d14d91f47..c36921664 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -14,7 +14,7 @@ set (q65w_CXXSRCS ) if (WIN32) - set (q65w_CXXSRCS ${q65w_CXXSRCS} killbyname.cpp) + set (q65w_CXXSRCS ${q65w_CXXSRCS}) endif (WIN32) set (q65w_UISRCS diff --git a/q65w/about.cpp b/q65w/about.cpp index d77897c38..5ac318129 100644 --- a/q65w/about.cpp +++ b/q65w/about.cpp @@ -7,7 +7,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) : ui(new Ui::CAboutDlg) { ui->setupUi(this); - ui->labelTxt->setText("

" + QString {"MAP65 v" + ui->labelTxt->setText("

" + QString {"Q65W v" + QCoreApplication::applicationVersion () + " " + revision ()}.simplified () + "


" "Q65W is a wideband receiver for the Q65 protocol,
" diff --git a/q65w/killbyname.cpp b/q65w/killbyname.cpp deleted file mode 100644 index 11629e657..000000000 --- a/q65w/killbyname.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include -#include -#include - -int killbyname(const char *szToTerminate) -// Created: 6/23/2000 (Ravi Kochhar) -// Last modified: 3/10/2002 (RK) -// Please report any problems or bugs to kochhar@physiology.wisc.edu -// The latest version of this routine can be found at: -// http://www.neurophys.wisc.edu/ravi/software/killproc/ -// Terminate the process "szToTerminate" if it is currently running -// This works for Win/95/98/ME and also Win/NT/2000/XP -// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE" -// will both work (for szToTerminate) -// Return codes are as follows: -// 0 = Process was successfully terminated -// 602 = Unable to terminate process for some other reason -// 603 = Process was not currently running -// 604 = No permission to terminate process -// 605 = Unable to load PSAPI.DLL -// 606 = Unable to identify system type -// 607 = Unsupported OS -// 632 = Invalid process name -// 700 = Unable to get procedure address from PSAPI.DLL -// 701 = Unable to get process list, EnumProcesses failed -// 702 = Unable to load KERNEL32.DLL -// 703 = Unable to get procedure address from KERNEL32.DLL -// 704 = CreateToolhelp32Snapshot failed - -{ - BOOL bResult,bResultm; - DWORD aiPID[1000],iCb=1000,iNumProc; //,iV2000=0; - DWORD iCbneeded,i,iFound=0; - char szName[MAX_PATH],szToTermUpper[MAX_PATH]; - HANDLE hProc,hSnapShot,hSnapShotm; - OSVERSIONINFO osvi; - HINSTANCE hInstLib; - int iLenP,indx; - HMODULE hMod; - PROCESSENTRY32 procentry; - MODULEENTRY32 modentry; - - // Transfer Process name into "szToTermUpper" and convert to upper case - iLenP=strlen(szToTerminate); - if(iLenP<1 || iLenP>MAX_PATH) return 632; - for(indx=0;indxxMeterFrame); xSignalMeter->resize(50, 160); -#ifdef WIN32 - while(true) { - int iret=killbyname("m65.exe"); - if(iret == 603) break; - if(iret != 0) msgBox("KillByName return code: " + QString::number(iret)); - } -#endif - - if(!mem_m65.attach()) { - if (!mem_m65.create(sizeof(datcom_))) { - msgBox("Unable to create shared memory segment."); - } - } - char *to = (char*)mem_m65.data(); - int size=sizeof(datcom_); - if(datcom_.newdat==0) { - int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; - to += noffset; - size -= noffset; - } - memset(to,0,size); //Zero all decoding params in shared memory - fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); readSettings(); //Restore user's setup params @@ -980,17 +958,9 @@ void MainWindow::decode() //decode() datcom_.junk1=1234; //Cecck for these values in m65 datcom_.junk2=5678; -// char *to = (char*)mem_m65.data(); char *to = (char*) datcom2_.d4; char *from = (char*) datcom_.d4; - int size=sizeof(datcom_); - if(datcom_.newdat==0) { - int noffset = 4*4*5760000 + 4*4*322*32768 + 4*4*32768; - to += noffset; - from += noffset; - size -= noffset; - } - memcpy(to, from, qMin(mem_m65.size(), size-4)); + memcpy(to, from, sizeof(datcom_)); datcom_.nagain=0; datcom_.ndiskdat=0; m_map65RxLog=0; diff --git a/q65w/q65w.pro b/q65w/q65w.pro index 269b09818..8aa2c7fbf 100644 --- a/q65w/q65w.pro +++ b/q65w/q65w.pro @@ -35,10 +35,6 @@ SOURCES += main.cpp mainwindow.cpp plotter.cpp about.cpp \ astro.cpp displaytext.cpp getdev.cpp \ meterwidget.cpp signalmeter.cpp -win32 { -SOURCES += killbyname.cpp set570.cpp -} - HEADERS += mainwindow.h plotter.h soundin.h \ about.h devsetup.h widegraph.h getfile.h \ commons.h sleep.h astro.h displaytext.h \ From 33382c1c8854378305a373fb7eea9af88bae9be9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 17:57:40 -0500 Subject: [PATCH 075/251] Remove stuff related to adjusting IQ amp and phase. --- q65w/devsetup.cpp | 2 -- q65w/devsetup.h | 2 -- q65w/mainwindow.cpp | 44 +++----------------------------------------- q65w/mainwindow.h | 5 ----- q65w/widegraph.cpp | 1 - q65w/widegraph.h | 1 - 6 files changed, 3 insertions(+), 52 deletions(-) diff --git a/q65w/devsetup.cpp b/q65w/devsetup.cpp index f331efa4c..4657d1458 100644 --- a/q65w/devsetup.cpp +++ b/q65w/devsetup.cpp @@ -25,7 +25,6 @@ void DevSetup::initDlg() ui.fCalSpinBox->setValue(m_fCal); ui.faddEntry->setText(QString::number(m_fAdd,'f',3)); ui.sbPort->setValue(m_udpPort); - ui.cbIQswap->setChecked(m_IQswap); ui.sb_dB->setValue(m_dB); } @@ -44,7 +43,6 @@ void DevSetup::accept() m_fCal=ui.fCalSpinBox->value(); m_fAdd=ui.faddEntry->text().toDouble(); m_udpPort=ui.sbPort->value(); - m_IQswap=ui.cbIQswap->isChecked(); m_dB=ui.sb_dB->value(); QDialog::accept(); } diff --git a/q65w/devsetup.h b/q65w/devsetup.h index 888da3a15..5c3fec3a0 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -32,9 +32,7 @@ public: bool m_network; bool m_fs96000; - bool m_IQswap; bool m_restartSoundIn; - bool m_initIQplus; QString m_myCall; QString m_myGrid; diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index f30de8180..d8f50ded1 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -19,8 +19,6 @@ #define NFFT 32768 -int iqAmp; -int iqPhase; qint16 id[2*60*96000]; //QSharedMemory mem_m65("mem_m65"); @@ -98,14 +96,10 @@ MainWindow::MainWindow(QWidget *parent) : m_mode65=2; m_fs96000=true; m_udpPort=50004; - m_adjustIQ=0; - m_applyIQcal=0; m_nsave=0; m_modeJT65=0; m_modeQ65=0; m_TRperiod=60; - iqAmp=0; - iqPhase=0; xSignalMeter = new SignalMeter(ui->xMeterFrame); xSignalMeter->resize(50, 160); @@ -226,9 +220,6 @@ void MainWindow::writeSettings() settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); settings.setValue("Timeout",m_timeout); - settings.setValue("IQamp",iqAmp); - settings.setValue("IQphase",iqPhase); - settings.setValue("ApplyIQcal",m_applyIQcal); settings.setValue("dPhi",m_dPhi); settings.setValue("Fcal",m_fCal); settings.setValue("Fadd",m_fAdd); @@ -236,10 +227,7 @@ void MainWindow::writeSettings() settings.setValue("FSam96000", m_fs96000); settings.setValue("SoundInIndex",m_nDevIn); settings.setValue("paInDevice",m_paInDevice); - settings.setValue("IQswap",m_IQswap); settings.setValue("Scale_dB",m_dB); - settings.setValue("IQxt",m_bIQxt); - settings.setValue("InitIQplus",m_initIQplus); settings.setValue("UDPport",m_udpPort); settings.setValue("PaletteCuteSDR",ui->actionCuteSDR->isChecked()); settings.setValue("PaletteLinrad",ui->actionLinrad->isChecked()); @@ -282,10 +270,6 @@ void MainWindow::readSettings() m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); m_timeout=settings.value("Timeout",20).toInt(); - iqAmp=settings.value("IQamp",0).toInt(); - iqPhase=settings.value("IQphase",0).toInt(); - m_applyIQcal=settings.value("ApplyIQcal",0).toInt(); - ui->actionApply_IQ_Calibration->setChecked(m_applyIQcal!=0); m_dPhi=settings.value("dPhi",0).toInt(); m_fCal=settings.value("Fcal",0).toInt(); m_fAdd=settings.value("FAdd",0).toDouble(); @@ -294,12 +278,9 @@ void MainWindow::readSettings() m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); m_paInDevice = settings.value("paInDevice",0).toInt(); - m_IQswap = settings.value("IQswap",false).toBool(); m_dB = settings.value("Scale_dB",0).toInt(); - m_initIQplus = settings.value("InitIQplus",false).toBool(); - m_bIQxt = settings.value("IQxt",false).toBool(); m_udpPort = settings.value("UDPport",50004).toInt(); - soundInThread.setSwapIQ(m_IQswap); + soundInThread.setSwapIQ(0); //### soundInThread.setScale(m_dB); soundInThread.setPort(m_udpPort); ui->actionCuteSDR->setChecked(settings.value( @@ -363,7 +344,6 @@ void MainWindow::dataSink(int k) static float fgreen; static int ndiskdat; static int nb; - static int nadj=0; static int nxpol=0; static float px=0.0,py=0.0; static uchar lstrong[1024]; @@ -385,10 +365,9 @@ void MainWindow::dataSink(int k) nfsample=96000; if(!m_fs96000) nfsample=95238; fgreen=m_wide_graph_window->fGreen(); - nadj++; - if(m_adjustIQ==0) nadj=0; + int zero=0; symspec_(&k, &nxpol, &ndiskdat, &nb, &m_NBslider, &m_dPhi, - &nfsample, &fgreen, &m_adjustIQ, &m_applyIQcal, + &nfsample, &fgreen, &zero, &zero, &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); @@ -418,18 +397,6 @@ void MainWindow::dataSink(int k) m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } - /* - if(nadj == 10) { - ui->decodedTextBrowser->append( - QString {"Amp: %1 Phase: %1"} - .arg (m_gainx, 6, 'f', 4) - .arg (m_phasex, 6, 'f', 4) - ); - ui->decodedTextBrowser->append(t); - m_adjustIQ=0; - } -*/ - //Average over specified number of spectra if (n==0) { for (int i=0; iwidePlot->setMaximumHeight(800); - m_bIQxt=false; connect(ui->widePlot, SIGNAL(freezeDecode1(int)),this, SLOT(wideFreezeDecode(int))); diff --git a/q65w/widegraph.h b/q65w/widegraph.h index f826fbeab..67614eeb0 100644 --- a/q65w/widegraph.h +++ b/q65w/widegraph.h @@ -67,7 +67,6 @@ public: double m_dForceCenterFreq; double m_TxOffset; private: - bool m_bIQxt; qint32 m_waterfallAvg; qint32 m_fCal; qint32 m_fSample; From dc23772f9ed275fb3c98584becffa17aa0ac768f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 18:13:36 -0500 Subject: [PATCH 076/251] Remove lots more unneeded stuff. --- q65w/devsetup.h | 6 ------ q65w/mainwindow.cpp | 13 ++----------- q65w/soundin.cpp | 28 +--------------------------- q65w/soundin.h | 8 -------- 4 files changed, 3 insertions(+), 52 deletions(-) diff --git a/q65w/devsetup.h b/q65w/devsetup.h index 5c3fec3a0..e3b2e9e0c 100644 --- a/q65w/devsetup.h +++ b/q65w/devsetup.h @@ -14,12 +14,6 @@ public: void initDlg(); qint32 m_idInt; qint32 m_pttPort; - qint32 m_nDevIn; - qint32 m_nDevOut; - qint32 m_inDevList[100]; - qint32 m_outDevList[100]; - qint32 m_paInDevice; - qint32 m_paOutDevice; qint32 m_timeout; qint32 m_dPhi; qint32 m_fCal; diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index d8f50ded1..4989bf40a 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -139,7 +139,6 @@ MainWindow::MainWindow(QWidget *parent) : connect(&watcher3, SIGNAL(finished()),this,SLOT(decoderFinished())); // Assign input device and start input thread - soundInThread.setInputDevice(m_paInDevice); soundInThread.setRate(96000.0); soundInThread.setBufSize(10*7056); soundInThread.setNetwork(m_network); @@ -277,10 +276,8 @@ void MainWindow::readSettings() m_network = settings.value("NetworkInput",true).toBool(); m_fs96000 = settings.value("FSam96000",true).toBool(); m_nDevIn = settings.value("SoundInIndex", 0).toInt(); - m_paInDevice = settings.value("paInDevice",0).toInt(); m_dB = settings.value("Scale_dB",0).toInt(); m_udpPort = settings.value("UDPport",50004).toInt(); - soundInThread.setSwapIQ(0); //### soundInThread.setScale(m_dB); soundInThread.setPort(m_udpPort); ui->actionCuteSDR->setChecked(settings.value( @@ -465,8 +462,6 @@ void MainWindow::on_actionSettings_triggered() dlg.m_fAdd=m_fAdd; dlg.m_network=m_network; dlg.m_fs96000=m_fs96000; - dlg.m_nDevIn=m_nDevIn; - dlg.m_nDevOut=m_nDevOut; dlg.m_udpPort=m_udpPort; dlg.m_dB=m_dB; dlg.initDlg(); @@ -486,9 +481,6 @@ void MainWindow::on_actionSettings_triggered() m_wide_graph_window->setFcal(m_fCal); m_fs96000=dlg.m_fs96000; m_network=dlg.m_network; - m_nDevIn=dlg.m_nDevIn; - m_paInDevice=dlg.m_paInDevice; - m_nDevOut=dlg.m_nDevOut; m_udpPort=dlg.m_udpPort; m_dB=dlg.m_dB; soundInThread.setScale(m_dB); @@ -500,7 +492,6 @@ void MainWindow::on_actionSettings_triggered() soundInThread.setRate(96000.0); soundInThread.setFadd(m_fAdd); soundInThread.setNrx(1); - soundInThread.setInputDevice(m_paInDevice); soundInThread.start(QThread::HighestPriority); } } @@ -987,8 +978,8 @@ void MainWindow::guiUpdate() if(nsec != m_sec0) { //Once per second // qDebug() << "AAA" << nsec%60 << decodes_.ndecodes << decodes_.ncand; - soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); - soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); +// soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); +// soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 1bc02a4ac..c2faf9e48 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -79,11 +79,6 @@ void SoundInThread::run() //SoundInThread::run() } } -void SoundInThread::setSwapIQ(bool b) -{ - m_IQswap=b; -} - void SoundInThread::setScale(qint32 n) { m_dB=n; @@ -94,12 +89,6 @@ void SoundInThread::setPort(int n) //setPort() this->m_udpPort=n; } -void SoundInThread::setInputDevice(int n) //setInputDevice() -{ - if (isRunning()) return; - this->m_nDevIn=n; -} - void SoundInThread::setRate(double rate) //setRate() { if (isRunning()) return; @@ -133,17 +122,6 @@ void SoundInThread::setMonitoring(bool b) //setMonitoring() m_monitoring = b; } -void SoundInThread::setForceCenterFreqBool(bool b) -{ - m_bForceCenterFreq=b; - -} - -void SoundInThread::setForceCenterFreqMHz(double d) -{ - m_dForceCenterFreq=d; -} - void SoundInThread::setNrx(int n) //setNrx() { m_nrx = n; @@ -232,11 +210,7 @@ void SoundInThread::inputUDP() if ((k+iz) <= 60*96000) { int nsam=-1; recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8); - if(m_bForceCenterFreq) { - datcom_.fcenter=m_dForceCenterFreq; - } else { - datcom_.fcenter=b.cfreq + m_fAdd; - } + datcom_.fcenter=b.cfreq + m_fAdd; } m_hsym=(k-2048)*11025.0/(2048.0*m_rate); diff --git a/q65w/soundin.h b/q65w/soundin.h index 78947338f..2773bc9d4 100644 --- a/q65w/soundin.h +++ b/q65w/soundin.h @@ -29,18 +29,14 @@ public: { } - void setSwapIQ(bool b); void setScale(qint32 n); void setPort(qint32 n); - void setInputDevice(qint32 n); void setRate(double rate); void setBufSize(unsigned bufSize); void setNetwork(bool b); void setMonitoring(bool b); void setFadd(double x); void setNrx(int n); - void setForceCenterFreqBool(bool b); - void setForceCenterFreqMHz(double d); void setPeriod(int n); int nrx(); int mhsym(); @@ -60,12 +56,8 @@ private: double m_fAdd; bool m_net; bool m_monitoring; - bool m_bForceCenterFreq; - bool m_IQswap; - double m_dForceCenterFreq; qint32 m_nrx; qint32 m_hsym; - qint32 m_nDevIn; qint32 m_udpPort; qint32 m_TRperiod; qint32 m_TRperiod0; From 6cc2a50aa01deed8ae6986142c3eaa177ac48a0e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 18:44:35 -0500 Subject: [PATCH 077/251] More cleanup of unused variables, etc. --- q65w/commons.h | 4 +-- q65w/mainwindow.cpp | 46 ++++++-------------------- q65w/mainwindow.h | 6 ---- q65w/mainwindow.ui | 78 --------------------------------------------- q65w/map65b.iss | 46 -------------------------- q65w/q65w.pro | 24 ++------------ q65w/soundin.cpp | 2 +- 7 files changed, 15 insertions(+), 191 deletions(-) delete mode 100644 q65w/map65b.iss diff --git a/q65w/commons.h b/q65w/commons.h index 801330f06..a76bc1dd4 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -27,7 +27,7 @@ extern struct { //This is "common/datcom/..." in Fortran int ntimeout; //Max for timeouts in Messages and BandMap int ntol; //+/- decoding range around fQSO (Hz) int nxant; //1 ==> add 45 deg to measured pol angle - int map65RxLog; //Flags to control log files + int junk_1; int nfsample; //Input sample rate int nxpol; //1 if using xpol antennas, 0 otherwise int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 @@ -66,7 +66,7 @@ extern struct { //This is "common/datcom/..." in Fortran int ntimeout; //Max for timeouts in Messages and BandMap int ntol; //+/- decoding range around fQSO (Hz) int nxant; //1 ==> add 45 deg to measured pol angle - int map65RxLog; //Flags to control log files + int junk_1; int nfsample; //Input sample rate int nxpol; //1 if using xpol antennas, 0 otherwise int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 4989bf40a..808ab64c8 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -30,7 +30,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_appDir {QApplication::applicationDirPath ()}, - m_settings_filename {m_appDir + "/map65.ini"}, + m_settings_filename {m_appDir + "/q65w.ini"}, m_astro_window {new Astro {m_settings_filename}}, m_wide_graph_window {new WideGraph {m_settings_filename}}, m_gui_timer {new QTimer {this}} @@ -79,8 +79,8 @@ MainWindow::MainWindow(QWidget *parent) : m_restart=false; m_myCall="K1JT"; m_myGrid="FN20qi"; - m_saveDir="/users/joe/map65/install/save"; - m_azelDir="/users/joe/map65/install/"; + m_saveDir=""; + m_azelDir=""; m_loopall=false; m_startAnother=false; m_saveAll=false; @@ -88,23 +88,20 @@ MainWindow::MainWindow(QWidget *parent) : m_sec0=-1; m_hsym0=-1; m_palette="CuteSDR"; - m_map65RxLog=1; //Write Date and Time to all65.txt m_nutc0=9999; m_kb8rq=false; m_NB=false; - m_mode="JT65B"; - m_mode65=2; + m_mode="Q65"; m_fs96000=true; m_udpPort=50004; m_nsave=0; - m_modeJT65=0; m_modeQ65=0; m_TRperiod=60; xSignalMeter = new SignalMeter(ui->xMeterFrame); xSignalMeter->resize(50, 160); - fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); readSettings(); //Restore user's setup params @@ -195,7 +192,7 @@ MainWindow::~MainWindow() soundInThread.quit(); soundInThread.wait(3000); } - fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("map65_wisdom.dat").toLocal8Bit ()); + fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); delete ui; } @@ -224,7 +221,6 @@ void MainWindow::writeSettings() settings.setValue("Fadd",m_fAdd); settings.setValue("NetworkInput", m_network); settings.setValue("FSam96000", m_fs96000); - settings.setValue("SoundInIndex",m_nDevIn); settings.setValue("paInDevice",m_paInDevice); settings.setValue("Scale_dB",m_dB); settings.setValue("UDPport",m_udpPort); @@ -233,7 +229,6 @@ void MainWindow::writeSettings() settings.setValue("PaletteAFMHot",ui->actionAFMHot->isChecked()); settings.setValue("PaletteBlue",ui->actionBlue->isChecked()); settings.setValue("Mode",m_mode); - settings.setValue("nModeJT65",m_modeJT65); settings.setValue("nModeQ65",m_modeQ65); settings.setValue("SaveNone",ui->actionNone->isChecked()); settings.setValue("SaveAll",ui->actionSave_all->isChecked()); @@ -275,7 +270,6 @@ void MainWindow::readSettings() soundInThread.setFadd(m_fAdd); m_network = settings.value("NetworkInput",true).toBool(); m_fs96000 = settings.value("FSam96000",true).toBool(); - m_nDevIn = settings.value("SoundInIndex", 0).toInt(); m_dB = settings.value("Scale_dB",0).toInt(); m_udpPort = settings.value("UDPport",50004).toInt(); soundInThread.setScale(m_dB); @@ -284,15 +278,8 @@ void MainWindow::readSettings() "PaletteCuteSDR",true).toBool()); ui->actionLinrad->setChecked(settings.value( "PaletteLinrad",false).toBool()); - m_mode=settings.value("Mode","JT65B").toString(); - m_modeJT65=settings.value("nModeJT65",2).toInt(); - if(m_modeJT65==0) ui->actionNoJT65->setChecked(true); - if(m_modeJT65==1) ui->actionJT65A->setChecked(true); - if(m_modeJT65==2) ui->actionJT65B->setChecked(true); - if(m_modeJT65==3) ui->actionJT65C->setChecked(true); m_modeQ65=settings.value("nModeQ65",2).toInt(); - if(m_modeQ65==0) ui->actionNoQ65->setChecked(true); if(m_modeQ65==1) ui->actionQ65A->setChecked(true); if(m_modeQ65==2) ui->actionQ65B->setChecked(true); if(m_modeQ65==3) ui->actionQ65C->setChecked(true); @@ -669,7 +656,7 @@ void MainWindow::on_actionOpen_triggered() //Open File soundInThread.setMonitoring(m_monitoring); QString fname; fname=QFileDialog::getOpenFileName(this, "Open File", m_path, - "MAP65 Files (*.iq)"); + "MAP65/Q65W Files (*.iq)"); if(fname != "") { m_path=fname; int i; @@ -732,7 +719,7 @@ void MainWindow::diskDat() //diskDat() datcom_.fcenter=m_wide_graph_window->m_dForceCenterFreq; } - hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol + hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol for(int i=0; i<304; i++) { // Do the half-symbol FFTs int k = i*hsym + 2048.5; dataSink(k); @@ -747,7 +734,6 @@ void MainWindow::diskWriteFinished() //diskWriteFinished void MainWindow::decoderFinished() //diskWriteFinished { - m_map65RxLog=0; m_startAnother=m_loopall; ui->DecodeButton->setStyleSheet(""); decodeBusy(false); @@ -888,13 +874,12 @@ void MainWindow::decode() //decode() datcom_.ntimeout=m_timeout; datcom_.ntol=m_tol; datcom_.nxant=0; - if(datcom_.nutc < m_nutc0) m_map65RxLog |= 1; //Date and Time to map65_rx.log m_nutc0=datcom_.nutc; - datcom_.map65RxLog=m_map65RxLog; + datcom_.map65RxLog=0; datcom_.nfsample=96000; if(!m_fs96000) datcom_.nfsample=95238; datcom_.nxpol=0; - datcom_.nmode=10*m_modeQ65 + m_modeJT65; + datcom_.nmode=10*m_modeQ65; datcom_.nsave=m_nsave; datcom_.max_drift=ui->sbMaxDrift->value(); @@ -916,7 +901,6 @@ void MainWindow::decode() //decode() memcpy(to, from, sizeof(datcom_)); datcom_.nagain=0; datcom_.ndiskdat=0; - m_map65RxLog=0; m_call3Modified=false; decodes_.ndecodes=0; @@ -1174,16 +1158,6 @@ void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed ui->dxGridEntry->setText(m_hisGrid); } -void MainWindow::on_actionErase_map65_rx_log_triggered() //Erase Rx log -{ - int ret = QMessageBox::warning(this, "Confirm Erase", - "Are you sure you want to erase file map65_rx.log ?", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - if(ret==QMessageBox::Yes) { - m_map65RxLog |= 2; // Rewind map65_rx.log - } -} - void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index f8345c4ff..d67fc579d 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -78,7 +78,6 @@ private slots: void on_dxCallEntry_textChanged(const QString &arg1); void on_dxGridEntry_textChanged(const QString &arg1); void bumpDF(int n); - void on_actionErase_map65_rx_log_triggered(); void on_actionSettings_triggered(); void on_NBcheckBox_toggled(bool checked); void on_NBslider_valueChanged(int value); @@ -98,8 +97,6 @@ private: QScopedPointer m_wide_graph_window; QPointer m_gui_timer; qint64 m_msErase; - qint32 m_nDevIn; - qint32 m_nDevOut; qint32 m_idInt; qint32 m_waterfallAvg; qint32 m_DF; @@ -113,9 +110,7 @@ private: qint32 m_setftx; qint32 m_ndepth; qint32 m_sec0; - qint32 m_map65RxLog; qint32 m_nutc0; - qint32 m_mode65; qint32 m_nrx; qint32 m_hsym0; qint32 m_paInDevice; @@ -124,7 +119,6 @@ private: qint32 m_nsum; qint32 m_nsave; qint32 m_TRperiod; - qint32 m_modeJT65; qint32 m_modeQ65; qint32 m_RxState; qint32 m_dB; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index a2097e75a..ab6328264 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -628,7 +628,6 @@ p, li { white-space: pre-wrap; } - @@ -768,11 +767,6 @@ p, li { white-space: pre-wrap; } Erase Band Map and Messages - - - Erase map65_rx.log - - true @@ -944,59 +938,6 @@ p, li { white-space: pre-wrap; } Available suffixes and add-on-prefixes - - - Erase map65_tx.log - - - - - true - - - JT65A - - - - - true - - - true - - - JT65B - - - - - true - - - JT65C - - - - - I/Q Calibration - - - F7 - - - - - Adjust Rx I/Q Calibration - - - - - true - - - Apply Rx I/Q Calibration - - true @@ -1058,25 +999,6 @@ p, li { white-space: pre-wrap; } Q65B - - - true - - - No JT65 - - - - - true - - - true - - - No Q65 - - true diff --git a/q65w/map65b.iss b/q65w/map65b.iss deleted file mode 100644 index e2fbdf495..000000000 --- a/q65w/map65b.iss +++ /dev/null @@ -1,46 +0,0 @@ -; For Use With JTSDK v2.0.0 -#define MyAppName "MAP65" -#define MyAppVersion "2.7" -#define MyAppPublisher "Joe Taylor, K1JT" -#define MyAppCopyright "Copyright (C) 2001-2017 by Joe Taylor, K1JT" -#define MyAppURL "http://physics.princeton.edu/pulsar/k1jt/map65.html" -#define WsjtGroupURL "https://groups.yahoo.com/neo/groups/wsjtgroup/info" - -[Setup] -AppName={#MyAppName} -AppVersion={#MyAppVersion} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -DisableReadyPage=yes -DefaultDirName=C:\WSJT\MAP65 -DefaultGroupName=WSJT -DisableProgramGroupPage=yes -LicenseFile=C:\JTSDK\common-licenses\GPL-3 -OutputDir=C:\JTSDK\map65\package -OutputBaseFilename={#MyAppName}-{#MyAppVersion}-Win32 -SetupIconFile=C:\JTSDK\icons\wsjt.ico -Compression=lzma -SolidCompression=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Files] -Source: "c:\JTSDK\map65\install\Release\bin\*"; DestDir: "{app}"; Excludes: CALL3.TXT; Flags: ignoreversion recursesubdirs createallsubdirs -Source: "C:\JTSDK\src\map65\resources\*"; DestDir: "{app}"; Flags: ignoreversion onlyifdoesntexist - -[Icons] -Name: "{group}\{#MyAppName}\Documentation\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}" -Name: "{group}\{#MyAppName}\Resources\{cm:ProgramOnTheWeb,WSJT Group}"; Filename: "{#WsjtGroupURL}" -Name: "{group}\{#MyAppName}\Tools\Wisdom-1"; Filename: "{app}\wisdom1.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" -Name: "{group}\{#MyAppName}\Tools\Wisdom-2"; Filename: "{app}\wisdom2.bat"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" -Name: "{group}\{#MyAppName}\Uninstall\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Comment: "Uninstall MAP65"; -Name: "{group}\{#MyAppName}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" -Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\map65.exe"; WorkingDir: {app}; IconFileName: "{app}\wsjt.ico" - -[Run] -Filename: "{app}\wisdom1.bat"; Description: "Optimize plans for FFTs (takes a few minutes)"; Flags: postinstall -Filename: "{app}\wisdom2.bat"; Description: "Patiently optimize plans for FFTs (up to one hour)"; Flags: postinstall unchecked -Filename: "{app}\map65.exe"; Description: "Launch MAP65"; Flags: postinstall nowait unchecked diff --git a/q65w/q65w.pro b/q65w/q65w.pro index 8aa2c7fbf..4dbd96ab6 100644 --- a/q65w/q65w.pro +++ b/q65w/q65w.pro @@ -9,11 +9,10 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += thread #CONFIG += console -TARGET = map65 -VERSION = 2.5.0 +TARGET = q65w +VERSION = 0.1 TEMPLATE = app DEFINES = QT5 -DESTDIR = /MAP65_2.9 F90 = gfortran gfortran.output = ${QMAKE_FILE_BASE}.o @@ -43,22 +42,3 @@ HEADERS += mainwindow.h plotter.h soundin.h \ FORMS += mainwindow.ui about.ui devsetup.ui widegraph.ui \ astro.ui txtune.ui -RC_FILE = map65.rc - -unix { -LIBS += ../map65/libm65/libm65.a -LIBS += -lfftw3f -lgfortran -} - -win32 { -LIBS += ../map65/libm65/libm65.a -LIBS += ../map65/libfftw3f_win.a -LIBS += ../map65/palir-02.dll -LIBS += libwsock32 -#LIBS += C:/MinGW/lib/libf95.a -LIBS += -lgfortran -#LIBS += -lusb -LIBS += ../map65/libusb.a -#LIBS += -lQt5Concurrent -#LIBS += c:\JTSDK-QT\Qt5\Tools\mingw48_32\i686-w64-mingw32\lib\libmingwex.a -} diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index c2faf9e48..33a9740b4 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -35,7 +35,7 @@ extern "C" int ntimeout; //Max for timeouts in Messages and BandMap int ntol; //+/- decoding range around fQSO (Hz) int nxant; //1 ==> add 45 deg to measured pol angle - int map65RxLog; //Flags to control log files + int junk_1; //Flags to control log files int nfsample; //Input sample rate int nxpol; //1 if using xpol antennas, 0 otherwise int mode65; //JT65 sub-mode: A=1, B=2, C=4 From 74c3d55e7f254d4d5adf0b85b0f3cf78d5a9e02d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 10 Dec 2022 19:21:19 -0500 Subject: [PATCH 078/251] Fix the Decode menu to read "Fast /Normal / Deep". --- q65w/libm65/m65c.f90 | 13 +++++++------ q65w/mainwindow.cpp | 10 +++++----- q65w/mainwindow.ui | 11 +++++++---- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/q65w/libm65/m65c.f90 b/q65w/libm65/m65c.f90 index 558a9d8ae..7853ec507 100644 --- a/q65w/libm65/m65c.f90 +++ b/q65w/libm65/m65c.f90 @@ -16,30 +16,31 @@ subroutine m65c(itimer) character*12 mycall,hiscall character*6 mygrid,hisgrid character*20 datetime - character*80 cwd common/datcom2/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),nparams0 + +!### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & datetime,junk1,junk2 +!### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### + common/early/nhsym1,nhsym2,ldecoded(32768) equivalence (nparams,fcenter) data first/.true./ - save first,cwd + save first + nparams=nparams0 !Copy parameters into common/npar/ if(itimer.ne.0) then -! call timer('q65w ',1) -! call timer('q65w ',101) call timer('decode0 ',101) call fini_timer return endif - + lq65w=.true. lq65w2=.true. - nparams=nparams0 !Copy parameters into common/npar/ datetime(18:20)=':00' ! if(first) call timer('q65w ',0) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 808ab64c8..fdd0b0bad 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -289,7 +289,7 @@ void MainWindow::readSettings() ui->actionNone->setChecked(settings.value("SaveNone",true).toBool()); ui->actionSave_all->setChecked(settings.value("SaveAll",false).toBool()); m_saveAll=ui->actionSave_all->isChecked(); - m_ndepth=settings.value("NDepth",0).toInt(); + m_ndepth=settings.value("NDepth",2).toInt(); m_onlyEME=settings.value("NEME",false).toBool(); ui->actionOnly_EME_calls->setChecked(m_onlyEME); m_kb8rq=settings.value("KB8RQ",false).toBool(); @@ -766,17 +766,17 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() } } -void MainWindow::on_actionNo_Deep_Search_triggered() //No Deep Search +void MainWindow::on_actionNo_Deep_Search_triggered() { m_ndepth=0; } -void MainWindow::on_actionNormal_Deep_Search_triggered() //Normal DS +void MainWindow::on_actionNormal_Deep_Search_triggered() { m_ndepth=1; } -void MainWindow::on_actionAggressive_Deep_Search_triggered() //Aggressive DS +void MainWindow::on_actionAggressive_Deep_Search_triggered() { m_ndepth=2; } @@ -875,7 +875,7 @@ void MainWindow::decode() //decode() datcom_.ntol=m_tol; datcom_.nxant=0; m_nutc0=datcom_.nutc; - datcom_.map65RxLog=0; + datcom_.junk_1=0; datcom_.nfsample=96000; if(!m_fs96000) datcom_.nfsample=95238; datcom_.nxpol=0; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index ab6328264..1c9b5d9ed 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -823,18 +823,21 @@ p, li { white-space: pre-wrap; } true - true + false - No Deep Search + Fast true + + true + - Normal Deep Search + Normal @@ -842,7 +845,7 @@ p, li { white-space: pre-wrap; } true - Aggressive Deep Search + Deep From d0ea4613552198fc19fefde2eb4475795b8fed41 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 11 Dec 2022 08:35:28 -0500 Subject: [PATCH 079/251] Remove most references to ".tf2". --- q65w/commons.h | 4 ++-- q65w/getfile.cpp | 4 +--- q65w/mainwindow.cpp | 7 ++----- q65w/mainwindow.h | 2 +- q65w/mainwindow.ui | 6 +++--- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index a76bc1dd4..4f2b0dbda 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -16,7 +16,7 @@ extern struct { //This is "common/datcom/..." in Fortran int mousefqso; //User-selected QSO freq (kHz) int nagain; //1 ==> decode only at fQSO +/- Tol int ndepth; //How much hinted decoding to do? - int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int ndiskdat; //1 ==> data read from *.iq file int neme; //Hinted decoding tries only for EME calls int newdat; //1 ==> new data, must do long FFT int nfa; //Low decode limit (kHz) @@ -55,7 +55,7 @@ extern struct { //This is "common/datcom/..." in Fortran int mousefqso; //User-selected QSO freq (kHz) int nagain; //1 ==> decode only at fQSO +/- Tol int ndepth; //How much hinted decoding to do? - int ndiskdat; //1 ==> data read from *.tf2 or *.iq file + int ndiskdat; //1 ==> data read from *.iq file int neme; //Hinted decoding tries only for EME calls int newdat; //1 ==> new data, must do long FFT int nfa; //Low decode limit (kHz) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index b74ba240c..01b17469d 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -44,7 +44,7 @@ void getfile(QString fname, bool xpol, int dbDgrd) datcom_.ndiskdat=1; int nfreq=(int)datcom_.fcenter; - if(nfreq!=144 and nfreq != 432 and nfreq != 1296) datcom_.fcenter=144.125; + if(nfreq!=144 and nfreq != 432 and nfreq != 1296) datcom_.fcenter=1296.080; int i0=fname.indexOf(".tf2"); if(i0<0) i0=fname.indexOf(".iq"); datcom_.nutc=0; @@ -78,8 +78,6 @@ void savetf2(QString fname, bool xpol) free(buf); } -//#define MAX_RANDOM 0x7fffffff - /* Generate gaussian random float with mean=0 and std_dev=1 */ float gran() { diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index fdd0b0bad..edb645e55 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -743,13 +743,12 @@ void MainWindow::decoderFinished() //diskWriteFinished lab5->setText(t1); } -//Delete ../save/*.tf2 -void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() +void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() { int i; QString fname; int ret = QMessageBox::warning(this, "Confirm Delete", - "Are you sure you want to delete all *.tf2 and *.iq files in\n" + + "Are you sure you want to delete all *.iq files in\n" + QDir::toNativeSeparators(m_saveDir) + " ?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if(ret==QMessageBox::Yes) { @@ -758,8 +757,6 @@ void MainWindow::on_actionDelete_all_tf2_files_in_SaveDir_triggered() QList::iterator f; for(f=files.begin(); f!=files.end(); ++f) { fname=*f; - i=(fname.indexOf(".tf2")); - if(i==11) dir.remove(fname); i=(fname.indexOf(".iq")); if(i==11) dir.remove(fname); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index d67fc579d..3cd57bf9c 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -63,7 +63,7 @@ private slots: void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); - void on_actionDelete_all_tf2_files_in_SaveDir_triggered(); + void on_actionDelete_all_iq_files_in_SaveDir_triggered(); void on_actionNo_Deep_Search_triggered(); void on_actionNormal_Deep_Search_triggered(); void on_actionAggressive_Deep_Search_triggered(); diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 1c9b5d9ed..acce2af65 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -627,7 +627,7 @@ p, li { white-space: pre-wrap; } - + @@ -757,9 +757,9 @@ p, li { white-space: pre-wrap; } Shift+F6 - + - Delete all *.tf2 and *.iq files in SaveDir + Delete all *.iq files in SaveDir From 994e9ca929fb1bfda61ca0fa7353ea80d935f151 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 11 Dec 2022 09:18:14 -0500 Subject: [PATCH 080/251] Remove some xpol stuff from wideband_sync.f90. --- q65w/libm65/wideband_sync.f90 | 51 +++++++++++------------------------ 1 file changed, 15 insertions(+), 36 deletions(-) diff --git a/q65w/libm65/wideband_sync.f90 b/q65w/libm65/wideband_sync.f90 index 7d6373a14..d99391cd3 100644 --- a/q65w/libm65/wideband_sync.f90 +++ b/q65w/libm65/wideband_sync.f90 @@ -124,7 +124,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) real ss(4,322,NFFT) real savg(4,NFFT) real savg_med(4) - real ccf4(4),ccf4best(4),a(3) + real a(3) logical first,xpol integer isync(22) integer jsync0(63),jsync1(63) @@ -163,16 +163,8 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ib=nint(1000*nfb/df3) + 1 if(ia.lt.1) ia=1 if(ib.gt.NFFT-1) ib=NFFT-1 - npol=1 - if(xpol) npol=4 - do i=1,npol - call pctile(savg(i,ia:ib),ib-ia+1,50,savg_med(i)) - enddo -! do i=ia,ib -! write(14,3014) 0.001*(i-1)*df3,savg(1:npol,i) -!3014 format(5f10.3) -! enddo + call pctile(savg(1,ia:ib),ib-ia+1,50,savg_med(1)) lagbest=0 ipolbest=1 @@ -186,13 +178,12 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,22 !Test for Q65 sync k=isync(j) + lag - ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + & - ss(1:npol,k+1,i+1) + ss(1:npol,k+2,i+1) + ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) & + + ss(1,k+2,i+1) enddo - ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*3*22/float(jz) - ccf=maxval(ccf4) - ip=maxloc(ccf4) - ipol=ip(1) + ccf4=ccf4 - savg(1,i+1)*3*22/float(jz) + ccf=ccf4 + ipol=1 if(ccf.gt.ccfmax) then ipolbest=ipol lagbest=lag @@ -205,12 +196,11 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,63 !Test for JT65 sync, std msg k=jsync0(j) + lag - ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + ss(1:npol,k+1,i+1) + ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) enddo - ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*2*63/float(jz) - ccf=maxval(ccf4) - ip=maxloc(ccf4) - ipol=ip(1) + ccf4=ccf4 - savg(1,i+1)*2*63/float(jz) + ccf=ccf4 + ipol=1 if(ccf.gt.ccfmax) then ipolbest=ipol lagbest=lag @@ -223,12 +213,11 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,63 !Test for JT65 sync, OOO msg k=jsync1(j) + lag - ccf4(1:npol)=ccf4(1:npol) + ss(1:npol,k,i+1) + ss(1:npol,k+1,i+1) + ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) enddo - ccf4(1:npol)=ccf4(1:npol) - savg(1:npol,i+1)*2*63/float(jz) - ccf=maxval(ccf4) - ip=maxloc(ccf4) - ipol=ip(1) + ccf4=ccf4 - savg(1,i+1)*2*63/float(jz) + ccf=ccf4 + ipol=1 if(ccf.gt.ccfmax) then ipolbest=ipol lagbest=lag @@ -240,10 +229,6 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) enddo ! lag poldeg=0. - if(xpol .and. ccfmax.ge.SNR1_THRESHOLD) then - call polfit(ccf4best,4,a) - poldeg=a(3) - endif sync(i)%ccfmax=ccfmax sync(i)%xdt=lagbest*tstep-1.0 sync(i)%pol=poldeg @@ -251,12 +236,6 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) sync(i)%iflip=flip sync(i)%birdie=.false. if(ccfmax/(savg(ipolbest,i)/savg_med(ipolbest)).lt.3.0) sync(i)%birdie=.true. -! if(sync(i)%iflip.eq.0 .and. sync(i)%ccfmax .gt. 20.0) then -! write(50,3050) i,lagbest,sync(i)%ccfmax,sync(i)%xdt,sync(i)%ipol, & -! sync(i)%birdie,ccf4best -!3050 format(2i5,f10.3,f8.2,i5,1x,L3,4f7.1) -! endif - enddo ! i (frequency bin) call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) From fed64b6d9fe38cc3ecdbf32d9d7afae57b476235 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 11 Dec 2022 09:30:01 -0500 Subject: [PATCH 081/251] Remove some xpol stuff from filbig and q65b. --- q65w/libm65/filbig.f90 | 11 ++--------- q65w/libm65/q65b.f90 | 28 ++++++---------------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/q65w/libm65/filbig.f90 b/q65w/libm65/filbig.f90 index ada8ccc0c..82c27ee83 100644 --- a/q65w/libm65/filbig.f90 +++ b/q65w/libm65/filbig.f90 @@ -7,7 +7,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) parameter (MAXFFT1=5376000,MAXFFT2=77175) real*4 dd(4,nmax) !Input data complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of input - complex c4a(MAXFFT2),c4b(MAXFFT2) !Output data + complex c4a(MAXFFT2) !Output data real*8 df real halfpulse(8) !Impulse response of filter (one sided) complex cfilt(MAXFFT2) !Filter (complex; imag = 0) @@ -15,7 +15,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) integer*8 plan1,plan2,plan3,plan4,plan5 logical first,xpol include 'fftw3.f' - common/cacb/ca,cb + common/cacb/ca equivalence (rfilt,cfilt) data first/.true./,npatience/1/ data halfpulse/114.97547150,36.57879257,-20.93789101, & @@ -76,18 +76,15 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) nz=min(nmax,nfft1) do i=1,nz ca(i)=cmplx(dd(1,i),dd(2,i)) - if(xpol) cb(i)=cmplx(dd(3,i),dd(4,i)) enddo if(nmax.lt.nfft1) then do i=nmax+1,nfft1 ca(i)=0. - if(xpol) cb(i)=0. enddo endif call timer('FFTbig ',0) call sfftw_execute(plan1) - if(xpol) call sfftw_execute(plan2) call timer('FFTbig ',1) newdat=0 endif @@ -101,23 +98,19 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) j=i0+i-1 !and apply the filter function if(j.ge.1 .and. j.le.nfft1) then c4a(i)=rfilt(i)*ca(j) - if(xpol) c4b(i)=rfilt(i)*cb(j) else c4a(i)=0. - if(xpol) c4b(i)=0. endif enddo do i=nh+1,nfft2 j=i0+i-1-nfft2 if(j.lt.1) j=j+nfft1 !nfft1 was nfft2 c4a(i)=rfilt(i)*ca(j) - if(xpol) c4b(i)=rfilt(i)*cb(j) enddo ! Do the short reverse transform, to go back to time domain. call timer('FFTsmall',0) call sfftw_execute(plan3) - if(xpol) call sfftw_execute(plan4) call timer('FFTsmall',1) n4=min(nmax/64,nfft2) go to 999 diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 index 13023047e..5175abd1f 100644 --- a/q65w/libm65/q65b.f90 +++ b/q65w/libm65/q65b.f90 @@ -21,7 +21,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & ! type(hdr) h !Header for the .wav file integer*2 iwave(60*12000) complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of raw x,y data - complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1),cz(0:MAXFFT2) + complex cx(0:MAXFFT2-1),cz(0:MAXFFT2) logical xpol,ldecoded integer ipk1(1) real*8 fcenter,freq0,freq1 @@ -35,7 +35,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & character*1 cp,cmode*2 character*60 result common/decodes/ndecodes,ncand,result(50) - common/cacb/ca,cb + common/cacb/ca common/early/nhsym1,nhsym2,ldecoded(32768) data nutc00/-1/,msg00/' '/ save @@ -59,7 +59,6 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & if(ldecoded(ipk)) go to 900 snr1=sync(ipk)%ccfmax ipol=1 - if(xpol) ipol=sync(ipk)%ipol nfft1=MAXFFT1 nfft2=MAXFFT2 @@ -81,12 +80,8 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & fac=1.0/nfft2 cx(0:nfft2-1)=ca(k0:k0+nfft2-1) cx=fac*cx - if(xpol) then - cy(0:nfft2-1)=cb(k0:k0+nfft2-1) - cy=fac*cy - endif -! Here cx and cy (if xpol) are frequency-domain data around the selected +! Here cx is frequency-domain data around the selected ! QSO frequency, taken from the full-length FFT computed in filbig(). ! Values for fsample, nfft1, nfft2, df, and the downsampled data rate ! are as follows: @@ -98,12 +93,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & ! 95238 5120000 0.018601172 322560 5999.994 poldeg=0. - if(xpol) then - poldeg=sync(ipk)%pol - cz(0:MAXFFT2-1)=cos(poldeg/RAD)*cx + sin(poldeg/RAD)*cy - else - cz(0:MAXFFT2-1)=cx - endif + cz(0:MAXFFT2-1)=cx cz(MAXFFT2)=0. ! Roll off below 500 Hz and above 2500 Hz. @@ -151,20 +141,14 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal nq65df=nq65df + nfreq0 - 1000 npol=nint(poldeg) - if(nxant.ne.0) then - npol=npol-45 - if(npol.lt.0) npol=npol+180 - endif - call txpol(xpol,msg0(1:22),mygrid,npol,nxant,ntxpol,cp) ikhz1=ikhz ndf=nq65df if(ndf.gt.500) ikhz1=ikhz + (nq65df+500)/1000 if(ndf.lt.-500) ikhz1=ikhz + (nq65df-500)/1000 ndf=nq65df - 1000*(ikhz1-ikhz) if(nqd.eq.1 .and. abs(nq65df-mousedf).lt.ntol) then - write(line,1020) ikhz1,ndf,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0, & - ntxpol,cp -1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3,i4,1x,a1) + write(line,1020) ikhz1,ndf,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0 +1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3) write(*,1100) trim(line) 1100 format(a) endif From 6ccd2a290b5027df3747f9f9691b511a556933b5 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 11 Dec 2022 17:10:40 -0500 Subject: [PATCH 082/251] Convert savg(4,NFFT) to one-dimensional savg(NFFT). --- q65w/commons.h | 4 +- q65w/libm65/decode0.f90 | 2 +- q65w/libm65/m65.f90 | 195 ---------------------------------- q65w/libm65/m65a.f90 | 107 ------------------- q65w/libm65/m65c.f90 | 3 +- q65w/libm65/map65a.f90 | 14 +-- q65w/libm65/recvpkt.f90 | 2 +- q65w/libm65/symspec.f90 | 37 +------ q65w/libm65/wideband_sync.f90 | 16 +-- q65w/soundin.cpp | 2 +- 10 files changed, 24 insertions(+), 358 deletions(-) delete mode 100644 q65w/libm65/m65.f90 delete mode 100644 q65w/libm65/m65a.f90 diff --git a/q65w/commons.h b/q65w/commons.h index 4f2b0dbda..792a8adaf 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -8,7 +8,7 @@ extern "C" { extern struct { //This is "common/datcom/..." in Fortran float d4[4*5760000]; //Raw I/Q data from Linrad float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol - float savg[4*NFFT]; //Avg spectra at 0,45,90,135 deg pol + float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM int idphi; //Phase correction for Y pol'n, degrees @@ -47,7 +47,7 @@ extern struct { //This is "common/datcom/..." in Fortran extern struct { //This is "common/datcom/..." in Fortran float d4[4*5760000]; //Raw I/Q data from Linrad float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol - float savg[4*NFFT]; //Avg spectra at 0,45,90,135 deg pol + float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM int idphi; //Phase correction for Y pol'n, degrees diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index 7f1ba2855..b3c017a33 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -3,7 +3,7 @@ subroutine decode0(dd,ss,savg,nstandalone) use timer_module, only: timer parameter (NSMAX=60*96000) - real*4 dd(4,NSMAX),ss(4,322,NFFT),savg(4,NFFT) + real*4 dd(4,NSMAX),ss(4,322,NFFT),savg(NFFT) real*8 fcenter integer hist(0:32768) logical ldecoded diff --git a/q65w/libm65/m65.f90 b/q65w/libm65/m65.f90 deleted file mode 100644 index c93357c7e..000000000 --- a/q65w/libm65/m65.f90 +++ /dev/null @@ -1,195 +0,0 @@ -program m65 - -! Decoder for map65. Can run stand-alone, reading data from *.tf2 files; -! or as the back end of map65, with data placed in a shared memory region. - -! Fortran logical units -! -! 10 binary input data, *.tf2 files -! 11 prefixes.txt -! 12 wb_w65.txt -! 13 map65.log -! 14 -! 15 -! 16 tquick log -! 17 saved *.tf2 files -! 18 test file to be transmitted (wsjtgen.f90) -! 19 livecq.txt -! 20 -! 21 map65_rx.log -! 22 -! 23 CALL3.TXT -! 24 -! 25 -! 26 tmp26.txt - - use timer_module, only: timer - use timer_impl, only: init_timer, fini_timer - - include 'njunk.f90' - parameter (NFFT=32768) - parameter (NSMAX=60*96000) - parameter (NREAD=2048) - integer*2 i2(NREAD) - real*8 hsym - real*4 ssz5a(NFFT) - logical*1 lstrong(0:1023),ldecoded,eof - real*8 fc0,fcenter - character*80 arg,infile - character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fc0,nutc0,junk(NJUNK) - common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & - ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & - mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime - common/early/nhsym1,nhsym2,ldecoded(32768) - - nargs=iargc() - if(nargs.ne.1 .and. nargs.lt.5) then - print*,'Usage: m65 Jsub Qsub Xpol <95238|96000> file1 [file2 ...]' - print*,'Examples: m65 B A X 96000 *.tf2' - print*,' m65 C C N 96000 *.iq' - print*,'' - print*,' m65 -s' - print*,' (Gets data from MAP65, via shared memory region.)' - go to 999 - endif - nstandalone=1 - nhsym1=280 - nhsym2=302 - call getarg(1,arg) - if(arg(1:2).eq.'-s') then - call m65a - go to 999 - endif - n=1 - if(arg(1:1).eq.'0') n=0 - if(arg(1:1).eq.'A') n=1 - if(arg(1:1).eq.'B') n=2 - if(arg(1:1).eq.'C') n=3 - - call getarg(2,arg) - m=1 - if(arg(1:1).eq.'0') m=0 - if(arg(1:1).eq.'A') m=1 - if(arg(1:1).eq.'B') m=2 - if(arg(1:1).eq.'C') m=3 - if(arg(1:1).eq.'D') m=4 - if(arg(1:1).eq.'E') m=5 - nmode=10*m + n - - call getarg(3,arg) - nxpol=0 - if(arg(1:1).eq.'X') nxpol=1 - - call getarg(4,arg) - nfsample=96000 - if(arg.eq.'95238') nfsample=95238 - - ifile1=5 - -! Some default parameters for command-line execution, in early testing. - mycall='K1JT' - mygrid='FN20QI' - hiscall='K9AN' - hisgrid='EN50' - nfa=100 !144.100 - nfb=162 !144.162 - ntol=100 - nkeep=10 !??? - mousefqso=140 !For IK4WLV in 210220_1814.tf2 - mousedf=0 - nfcal=0 - nkhz_center=125 - - if(nxpol.eq.0) then - nfa=55 !For KA1GT files - nfb=143 - mousefqso=69 !W2HRO signal - nkhz_center=100 - endif - - call ftninit('.') - call init_timer('timer.out') - call timer('m65 ',0) - - do ifile=ifile1,nargs - call getarg(ifile,infile) - open(10,file=infile,access='stream',status='old',err=998) - i1=index(infile,'.tf2') - if(i1.lt.1) i1=index(infile,'.iq') - read(infile(i1-4:i1-1),*,err=1) nutc0 - go to 2 -1 nutc0=0 -2 hsym=2048.d0*96000.d0/11025.d0 !Samples per half symbol - read(10) fcenter - newdat=1 - nhsym0=-999 - k=0 - - nch=2 - if(nxpol.eq.1) nch=4 - eof=.false. - do irec=1,9999999 - if(.not.eof) read(10,end=4) i2 - go to 6 -4 eof=.true. -6 if(eof) i2=0 - do i=1,NREAD,nch - k=k+1 - if(k.gt.60*96000) exit - dd(1,k)=i2(i) - dd(2,k)=i2(i+1) - if(nxpol.eq.1) then - dd(3,k)=i2(i+2) - dd(4,k)=i2(i+3) - endif - enddo - nhsym=(k-2048)/hsym - if(nhsym.ge.1 .and. nhsym.ne.nhsym0) then - ndiskdat=1 - nb=0 -! Emit signal readyForFFT - fgreen=-13.0 - iqadjust=0 - iqapply=0 - nbslider=100 - gainx=0.9962 - gainy=1.0265 - phasex=0.01426 - phasey=-0.01195 - call timer('symspec ',0) - call symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & - fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx, & - rejecty,pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) - call timer('symspec ',1) - nhsym0=nhsym - - nutc=nutc0 - if(nhsym.eq.nhsym1) call decode0(dd,ss,savg,nstandalone) - if(nhsym.eq.nhsym2) then - call decode0(dd,ss,savg,nstandalone) - exit - endif - endif - enddo ! irec - - if(iqadjust.ne.0) write(*,3002) rejectx,rejecty -3002 format('Image rejection:',2f7.1,' dB') - enddo ! ifile - - call timer('m65 ',1) - call timer('m65 ',101) - go to 999 - -998 print*,'Cannot open file:' - print*,infile - -999 call fini_timer() - if(arg(1:2).eq.'-s') then - write(21,1999) datetime(:17) -1999 format('Subprocess m65 terminated normally at UTC ',a17) - close(21) - endif - -end program m65 diff --git a/q65w/libm65/m65a.f90 b/q65w/libm65/m65a.f90 deleted file mode 100644 index ffeb176a3..000000000 --- a/q65w/libm65/m65a.f90 +++ /dev/null @@ -1,107 +0,0 @@ -subroutine m65a - - use timer_module, only: timer - use timer_impl, only: init_timer !, limtrace - use, intrinsic :: iso_c_binding, only: C_NULL_CHAR - use FFTW3 - - interface - function address_m65() - integer*1, pointer :: address_m65 - end function address_m65 - end interface - - integer*1 attach_m65 - integer size_m65 - integer*1, pointer :: p_m65 - character*80 cwd - character wisfile*256 - logical fileExists - - call getcwd(cwd) - call ftninit(trim(cwd)) - call init_timer (trim(cwd)//'/timer.out') - - limtrace=0 - lu=12 - i1=attach_m65() - -10 inquire(file=trim(cwd)//'/.lock',exist=fileExists) - if(fileExists) then - call sleep_msec(100) - go to 10 - endif - - inquire(file=trim(cwd)//'/.quit',exist=fileExists) - if(fileExists) then - call timer('decode0 ',101) - i=detach_m65() - ! Save FFTW wisdom and free memory - wisfile=trim(cwd)//'/m65_wisdom.dat'// C_NULL_CHAR - if(len(trim(wisfile)).gt.0) iret=fftwf_export_wisdom_to_filename(wisfile) - call four2a(a,-1,1,1,1) - call filbig(a,-1,1,0.0,0,0,0,0,0) !used for FFT plans - call fftwf_cleanup_threads() - call fftwf_cleanup() - go to 999 - endif - - nbytes=size_m65() - if(nbytes.le.0) then - print*,'m65a: Shared memory mem_m65 does not exist.' - print*,'Program m65a should be started automatically from within map65.' - go to 999 - endif - p_m65=>address_m65() - call m65b(p_m65,nbytes) - call sleep_msec(500) ! wait for .lock to be recreated - go to 10 - -999 return -end subroutine m65a - -subroutine m65b(m65com,nbytes) - integer*1 m65com(0:nbytes-1) - kss=4*4*60*96000 - ksavg=kss+4*4*322*32768 - kfcenter=ksavg+4*4*32768 - call m65c(m65com(0),m65com(kss),m65com(ksavg),m65com(kfcenter)) - return -end subroutine m65b - -subroutine m65c(dd,ss,savg,nparams0) - - include 'njunk.f90' - real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768) - real*8 fcenter - integer nparams0(NJUNK+2),nparams(NJUNK+2) - logical ldecoded - character*12 mycall,hiscall - character*6 mygrid,hisgrid - character*20 datetime - common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & - ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & - mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & - datetime,junk1,junk2 - common/early/nhsym1,nhsym2,ldecoded(32768) - equivalence (nparams,fcenter) - - nparams=nparams0 !Copy parameters into common/npar/ - npatience=1 - if(nhsym.eq.nhsym1 .and. iand(nrxlog,1).ne.0) then - write(21,1000) datetime(:17) -1000 format(/'UTC Date: 'a17/78('-')) - flush(21) - endif - if(iand(nrxlog,2).ne.0) rewind(21) - if(iand(nrxlog,4).ne.0) then - if(nhsym.eq.nhsym1) rewind(26) - if(nhsym.eq.nhsym2) backspace(26) - endif - - nstandalone=0 - if(sum(nparams).ne.0) call decode0(dd,ss,savg,nstandalone) - - return -end subroutine m65c diff --git a/q65w/libm65/m65c.f90 b/q65w/libm65/m65c.f90 index 7853ec507..be3914bc1 100644 --- a/q65w/libm65/m65c.f90 +++ b/q65w/libm65/m65c.f90 @@ -9,7 +9,6 @@ subroutine m65c(itimer) parameter (NFFT=32768) include 'njunk.f90' -! real*4 dd(4,5760000),ss(4,322,32768),savg(4,32768) real*8 fcenter integer nparams0(NJUNK+3),nparams(NJUNK+3) logical ldecoded,first @@ -17,7 +16,7 @@ subroutine m65c(itimer) character*6 mygrid,hisgrid character*20 datetime - common/datcom2/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),nparams0 + common/datcom2/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),nparams0 !### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 756624e65..e33cff612 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -12,7 +12,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & parameter (MAXMSG=1000) !Size of decoded message list parameter (NSMAX=60*96000) real dd(4,NSMAX) - real*4 ss(4,322,NFFT),savg(4,NFFT) + real*4 ss(4,322,NFFT),savg(NFFT) real tavg(-50:50) !Temp for finding local base level real base(4) !Local basel level at 4 pol'ns real sig(MAXMSG,30) !Parameters of detected signals @@ -119,7 +119,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ntry=0 short=0. !Zero the whole short array jpz=1 - if(xpol) jpz=4 +! if(xpol) jpz=4 ! First steps for JT65 decoding do i=ia,ib !Search over freq range @@ -130,7 +130,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & do ii=-50,50 iii=i+ii if(iii.ge.1 .and. iii.le.32768) then - tavg(ii)=savg(jp,iii) + tavg(ii)=savg(iii) else write(13,*) 'Error in iii:',iii,ia,ib,fa,fb flush(13) @@ -144,8 +144,8 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ! Find max signal at this frequency smax=0. do jp=1,jpz - if(savg(jp,i)/base(jp).gt.smax) then - smax=savg(jp,i)/base(jp) + if(savg(i)/base(jp).gt.smax) then + smax=savg(i)/base(jp) jpmax=jp endif enddo @@ -197,7 +197,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & sig(km,9)=0 sig(km,10)=0 ! sig(km,11)=rms0 - sig(km,12)=savg(ipol2,i) + sig(km,12)=savg(i) sig(km,13)=0 sig(km,14)=0 sig(km,15)=0 @@ -257,7 +257,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & sig(km,9)=nkv sig(km,10)=qual ! sig(km,11)=idphi - sig(km,12)=savg(ipol,i) + sig(km,12)=savg(i) sig(km,13)=a(1) sig(km,14)=a(2) sig(km,15)=a(3) diff --git a/q65w/libm65/recvpkt.f90 b/q65w/libm65/recvpkt.f90 index 88d51cc59..031ac8652 100644 --- a/q65w/libm65/recvpkt.f90 +++ b/q65w/libm65/recvpkt.f90 @@ -12,7 +12,7 @@ subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) integer*2 jd(4),kd(2),nblock2 real*4 xd(4),yd(2) real*8 fcenter - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc, & + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) equivalence (kd,d4) equivalence (jd,d8,yd) diff --git a/q65w/libm65/symspec.f90 b/q65w/libm65/symspec.f90 index e4160cfd1..55aa3110c 100644 --- a/q65w/libm65/symspec.f90 +++ b/q65w/libm65/symspec.f90 @@ -23,7 +23,7 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & parameter (NFFT=32768) !Length of FFTs real*8 ts,hsym real*8 fcenter - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fcenter,nutc, & + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) complex z,zfac @@ -181,42 +181,11 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & do i=1,NFFT sx=real(cx(i))**2 + aimag(cx(i))**2 ss(1,n,i)=sx ! Pol = 0 - savg(1,i)=savg(1,i) + sx - - if(nxpol.ne.0) then - z=cx(i) + cy(i) - s45=0.5*(real(z)**2 + aimag(z)**2) - ss(2,n,i)=s45 ! Pol = 45 - savg(2,i)=savg(2,i) + s45 - - sy=real(cy(i))**2 + aimag(cy(i))**2 - ss(3,n,i)=sy ! Pol = 90 - savg(3,i)=savg(3,i) + sy - - z=cx(i) - cy(i) - s135=0.5*(real(z)**2 + aimag(z)**2) - ss(4,n,i)=s135 ! Pol = 135 - savg(4,i)=savg(4,i) + s135 - - z=cx(i)*conjg(cy(i)) - q=sx - sy - u=2.0*real(z) - ssz5a(i)=0.707*sqrt(q*q + u*u) !Spectrum of linear polarization -! Leif's formula: -! ssz5a(i)=0.5*(sx+sy) + (real(z)**2 + aimag(z)**2 - sx*sy)/(sx+sy) - else - ssz5a(i)=sx - endif + savg(i)=savg(i) + sx + ssz5a(i)=sx enddo enddo - if(ihsym.eq.278) then - if(iqadjust.ne.0 .and. ipkx.ne.0 .and. ipky.ne.0) then - rejectx=10.0*log10(savg(1,1+nfft-ipkx)/savg(1,1+ipkx)) - rejecty=10.0*log10(savg(3,1+nfft-ipky)/savg(3,1+ipky)) - endif - endif - nkhz=nint(1000.d0*(fcenter-int(fcenter))) if(fcenter.eq.0.d0) nkhz=125 diff --git a/q65w/libm65/wideband_sync.f90 b/q65w/libm65/wideband_sync.f90 index d99391cd3..bdbdef326 100644 --- a/q65w/libm65/wideband_sync.f90 +++ b/q65w/libm65/wideband_sync.f90 @@ -34,7 +34,7 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) ! excised. Candidates are returned in the structure array cand(). parameter (MAX_PEAKS=100) - real ss(4,322,NFFT),savg(4,NFFT) + real ss(4,322,NFFT),savg(NFFT) real pavg(-20:20) integer indx(NFFT) logical xpol,skip,ldecoded @@ -122,8 +122,8 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) parameter (NFFT=32768) parameter (LAGMAX=30) real ss(4,322,NFFT) - real savg(4,NFFT) - real savg_med(4) + real savg(NFFT) + real savg_med real a(3) logical first,xpol integer isync(22) @@ -164,7 +164,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) if(ia.lt.1) ia=1 if(ib.gt.NFFT-1) ib=NFFT-1 - call pctile(savg(1,ia:ib),ib-ia+1,50,savg_med(1)) + call pctile(savg(ia:ib),ib-ia+1,50,savg_med) lagbest=0 ipolbest=1 @@ -181,7 +181,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) & + ss(1,k+2,i+1) enddo - ccf4=ccf4 - savg(1,i+1)*3*22/float(jz) + ccf4=ccf4 - savg(i+1)*3*22/float(jz) ccf=ccf4 ipol=1 if(ccf.gt.ccfmax) then @@ -198,7 +198,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) k=jsync0(j) + lag ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) enddo - ccf4=ccf4 - savg(1,i+1)*2*63/float(jz) + ccf4=ccf4 - savg(i+1)*2*63/float(jz) ccf=ccf4 ipol=1 if(ccf.gt.ccfmax) then @@ -215,7 +215,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) k=jsync1(j) + lag ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) enddo - ccf4=ccf4 - savg(1,i+1)*2*63/float(jz) + ccf4=ccf4 - savg(i+1)*2*63/float(jz) ccf=ccf4 ipol=1 if(ccf.gt.ccfmax) then @@ -235,7 +235,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) sync(i)%ipol=ipolbest sync(i)%iflip=flip sync(i)%birdie=.false. - if(ccfmax/(savg(ipolbest,i)/savg_med(ipolbest)).lt.3.0) sync(i)%birdie=.true. + if(ccfmax/(savg(i)/savg_med).lt.3.0) sync(i)%birdie=.true. enddo ! i (frequency bin) call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 33a9740b4..42d473fd1 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -16,7 +16,7 @@ extern "C" { double d8[2*60*96000]; //This is "common/datcom/..." in fortran float ss[4*322*NFFT]; - float savg[4*NFFT]; + float savg[NFFT]; double fcenter; int nutc; int idphi; //Phase correction for Y pol'n, degrees From 4b4a6162d6e1696feefe0ab38f49661aa1c942fd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 09:05:56 -0500 Subject: [PATCH 083/251] Update CMakeLists.txt: we're not building m65.exe any more. --- q65w/libm65/CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index 6a4e1c841..0275fb5c5 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -131,9 +131,6 @@ set_property (SOURCE ${libm65_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CM add_library (m65impl STATIC ${libm65_FSRCS} ${libm65_CSRCS} ${libm65_CXXSRCS}) target_link_libraries (m65impl wsjt_fort wsjt_cxx Qt5::Core) -add_executable (m65 m65.f90 m65a.f90) -target_link_libraries (m65 m65impl ${FFTW3_LIBRARIES}) - add_executable (mapsim mapsim.f90) target_link_libraries (mapsim m65impl ${FFTW3_LIBRARIES}) @@ -142,7 +139,7 @@ target_link_libraries (mapsim m65impl ${FFTW3_LIBRARIES}) if (WIN32) install ( - TARGETS m65 mapsim + TARGETS mapsim RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION . COMPONENT runtime ) From e7b5db7b8eca9811474f4fd63dfd646ffd00ce32 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 09:34:13 -0500 Subject: [PATCH 084/251] No need for polfit.f90. --- q65w/libm65/CMakeLists.txt | 2 - q65w/libm65/Makefile | 130 ------------------------------------- q65w/libm65/Makefile.0 | 114 -------------------------------- q65w/libm65/Makefile.MinGW | 105 ------------------------------ q65w/libm65/Makefile.jtsdk | 129 ------------------------------------ q65w/libm65/Makefile.linux | 96 --------------------------- q65w/libm65/polfit.f90 | 87 ------------------------- 7 files changed, 663 deletions(-) delete mode 100644 q65w/libm65/Makefile delete mode 100644 q65w/libm65/Makefile.0 delete mode 100644 q65w/libm65/Makefile.MinGW delete mode 100644 q65w/libm65/Makefile.jtsdk delete mode 100644 q65w/libm65/Makefile.linux delete mode 100644 q65w/libm65/polfit.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index 0275fb5c5..b37f596e4 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -62,7 +62,6 @@ set (libm65_FSRCS noisegen.f90 packjt.f90 pfxdump.f90 - polfit.f90 recvpkt.f90 rfile3a.f90 s3avg.f90 @@ -74,7 +73,6 @@ set (libm65_FSRCS smo.f90 sun.f90 symspec.f90 -# timer.f90 timf2.f90 tm2.f90 toxyz.f90 diff --git a/q65w/libm65/Makefile b/q65w/libm65/Makefile deleted file mode 100644 index 810f09e1f..000000000 --- a/q65w/libm65/Makefile +++ /dev/null @@ -1,130 +0,0 @@ -# Makefile for MinGW on Windows -CC = c:/JTSDK/Qt55/Tools/mingw492_32/bin/gcc -FC = c:/JTSDK/Qt55/Tools/mingw492_32/bin/gfortran -CXX = c:/JTSDK/Qt55/Tools/mingw492_32/bin/g++ - -FFLAGS = -O2 -fbounds-check -Wall -Wno-conversion -Wno-precision-loss \ - -fno-second-underscore -fbacktrace \ - -ffpe-summary=none -# -ffpe-trap=invalid,zero,overflow,underflow,denormal -CFLAGS = -I. -fbounds-check - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: packjt.o wavhdr.o libm65.a m65.exe mapsim.exe libastro.a - -OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ - decode1a.o sort.o filbig.o fil6521.o afc65b.o \ - twkfreq.o decode65b.o indexx.o ssort.o fchisq.o setup65.o \ - extract.o deep65.o ccf2.o demod64a.o chkhist.o graycode.o \ - interleave63.o encode65.o igray.o set.o shell.o qra64_subs.o \ - grid2k.o getpfx2.o q65b.o qra64c.o twkfreq_xy.o qra64zap.o \ - deg2grid.o getpfx1.o k2grid.o ftrsd2.o graycode65.o \ - wrapkarn.o nchar.o init_rs.o encode_rs.o decode_rs.o \ - four2a.o rfile3a.o grid2deg.o pfxdump.o dpol.o sync64.o spec64.o \ - astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \ - geocentric.o moon2.o toxyz.o dot.o dcoord.o f77_wisdom.o \ - gen65.o chkmsg.o ptt.o astrosub.o astro0.o recvpkt.o symspec.o \ - iqcal.o iqfix.o timf2.o s3avg.o packjt.o badmsg.o fmtmsg.o \ - qracodes.o qra64.o smo.o averms.o lorentzian.o npfwht.o pdmath.o \ - qra13_64_64_irr_e.o fchisq0.o gen_q65_wave.o wavhdr.o - -packjt.o: packjt.f90 - $(FC) -c packjt.f90 - -libm65.a: $(OBJS1) - ar cr libm65.a $(OBJS1) - ranlib libm65.a - -qra64_subs.o: ./qra64/qra64_subs.c - gcc -c -O2 -o qra64_subs.o ./qra64/qra64_subs.c - -qracodes.o: qracodes/qracodes.c - gcc -c -O2 -o qracodes.o qracodes/qracodes.c - -qra64.o: qra64/qra64.c - gcc -c -O2 -o qra64.o qra64/qra64.c - -qra13_64_64_irr_e.o: qracodes/qra13_64_64_irr_e.c - gcc -c -O2 -o qra13_64_64_irr_e.o \ - qracodes/qra13_64_64_irr_e.c - -npfwht.o: qracodes/npfwht.c - gcc -c -O2 -o npfwht.o qracodes/npfwht.c - -pdmath.o: qracodes/pdmath.c - gcc -c -O2 -o pdmath.o qracodes/pdmath.c - -OBJS3 = m65.o m65a.o map65a.o symspec.o decode0.o ftninit.o ftnquit.o \ - timer.o ipcomm.o sec_midn.o usleep.o -# cutil.o - -LIBS3 = -L'C:/JTSDK/Qt55/5.5/mingw492_32/lib' -lQt5Core - -m65.exe: $(OBJS3) libm65.a - $(CXX) -o m65.exe $(OBJS3) $(LIBS3) libm65.a ../libfftw3f_win.a \ - -lgfortran -# cp m65.exe ../../map65_install - cp m65.exe /c/MAP65_2.9 - -OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \ - coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \ - dcoord.o - -libastro.a: $(OBJS7) - ar cr libastro.a $(OBJS7) - ranlib libastro.a - -OBJS6 = mapsim.o cgen65.o noisegen.o gran.o -mapsim.exe: $(OBJS6) libm65.a - $(FC) -o mapsim.exe $(OBJS6) libm65.a - -INCPATH = -I'C:/JTSDK/Qt55/5.5/mingw492_32/include/QtCore' \ - -I'C:/JTSDK/Qt55/5.5/mingw492_32/include' - -ipcomm.o: ipcomm.cpp - $(CXX) -c $(INCPATH) ipcomm.cpp - -#m65a.o: m65a.f90 -# $(FC) -c -fno-second-underscore -cpp m65a.f90 - -sec_midn.o: sec_midn.f90 - $(FC) -c -fno-second-underscore sec_midn.f90 - -#symspec.o: ../symspec.f90 -# $(FC) -c $(FFLAGS) -o symspec.o ../symspec.f90 - -OBJS4 = tastro.o astro0.o libm65.a -tastro.exe: $(OBJS4) - $(FC) $(FFLAGS) -o tastro.exe $(OBJS4) libm65.a - -OBJS5 = t1.o timer.o libm65.a -t1.exe: $(OBJS5) - $(FC) $(FFLAGS) -o t1.exe $(OBJS5) libm65.a - -#astro0.o: ../astro0.f90 -# $(FC) -c $(FFLAGS) -o astro0.o ../astro0.f90 - -init_rs.o: init_rs.c - $(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c - -encode_rs.o: encode_rs.c - $(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c - -decode_rs.o: decode_rs.c - $(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c - -.PHONY : clean - -clean: - rm -f *.o *.mod libm65.a m65.exe diff --git a/q65w/libm65/Makefile.0 b/q65w/libm65/Makefile.0 deleted file mode 100644 index 7ff2357ff..000000000 --- a/q65w/libm65/Makefile.0 +++ /dev/null @@ -1,114 +0,0 @@ -# Makefile for Linux -CC = gcc -FC = gfortran -CXX = g++ - -FFLAGS = -O2 -fbounds-check -Wall -Wno-precision-loss -fno-second-underscore -# For ptt_unix: -CFLAGS = -I. -fbounds-check -DHAVE_STDLIB_H=1 -DHAVE_STDIO_H=1 \ - -DHAVE_FCNTL_H=1 -DHAVE_SYS_IOCTL_H=1 - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: packjt.o libm65.a m65 mapsim libastro.a - -OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ - decode1a.o sort.o filbig.o fil6521.o afc65b.o \ - twkfreq.o decode65b.o indexx.o ssort.o fchisq.o setup65.o \ - extract.o deep65.o ccf2.o demod64a.o chkhist.o graycode.o \ - interleave63.o encode65.o igray.o set.o shell.o qra64_subs.o \ - grid2k.o getpfx2.o qra64b.o qra64c.o twkfreq_xy.o qra64zap.o \ - deg2grid.o getpfx1.o k2grid.o ftrsd2.o graycode65.o \ - wrapkarn.o nchar.o init_rs.o encode_rs.o decode_rs.o \ - four2a.o rfile3a.o grid2deg.o pfxdump.o dpol.o sync64.o spec64.o \ - astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \ - geocentric.o moon2.o toxyz.o dot.o dcoord.o f77_wisdom.o \ - gen65.o chkmsg.o astrosub.o astro0.o recvpkt.o symspec.o \ - iqcal.o iqfix.o timf2.o s3avg.o packjt.o badmsg.o fmtmsg.o \ - qracodes.o qra64.o smo.o averms.o lorentzian.o npfwht.o pdmath.o \ - qra13_64_64_irr_e.o fchisq0.o genqra64a.o ptt_unix.o - -packjt.o: packjt.f90 - $(FC) -c packjt.f90 - -libm65.a: $(OBJS1) - ar cr libm65.a $(OBJS1) - ranlib libm65.a - -qra64_subs.o: ./qra64/qra64_subs.c - gcc -c -O2 -o qra64_subs.o ./qra64/qra64_subs.c - -qracodes.o: ./qracodes/qracodes.c - gcc -c -O2 -o qracodes.o ./qracodes/qracodes.c - -qra64.o: ./qra64/qra64.c - gcc -c -O2 -o qra64.o ./qra64/qra64.c - -qra13_64_64_irr_e.o: ./qracodes/qra13_64_64_irr_e.c - gcc -c -O2 -o qra13_64_64_irr_e.o ./qracodes/qra13_64_64_irr_e.c - -npfwht.o: ./qracodes/npfwht.c - gcc -c -O2 -o npfwht.o ./qracodes/npfwht.c - -pdmath.o: ./qracodes/pdmath.c - gcc -c -O2 -o pdmath.o ./qracodes/pdmath.c - -OBJS3 = m65.o m65a.o map65a.o symspec.o decode0.o ftninit.o ftnquit.o \ - timer.o ipcomm.o sec_midn.o usleep.o - -m65: $(OBJS3) libm65.a - $(CXX) -o m65 $(OBJS3) libm65.a -lfftw3f -lQt5Core -lfftw3f -lgfortran - cp m65 ../../map65_install - -OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \ - coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \ - dcoord.o - -libastro.a: $(OBJS7) - ar cr libastro.a $(OBJS7) - ranlib libastro.a - -OBJS6 = mapsim.o cgen65.o noisegen.o gran.o -mapsim: $(OBJS6) libm65.a - $(FC) -o mapsim $(OBJS6) libm65.a - -INCPATH = -I. -I'/usr/include/x86_64-linux-gnu/qt5' \ - -I'/usr/include/x86_64-linux-gnu/qt5/QtCore' - -ipcomm.o: ipcomm.cpp - $(CXX) -c $(INCPATH) -fPIC ipcomm.cpp - -sec_midn.o: sec_midn.f90 - $(FC) -c -fno-second-underscore sec_midn.f90 - -OBJS4 = tastro.o astro0.o libm65.a -tastro: $(OBJS4) - $(FC) $(FFLAGS) -o tastro $(OBJS4) libm65.a - -OBJS5 = t1.o timer.o libm65.a -t1: $(OBJS5) - $(FC) $(FFLAGS) -o t1 $(OBJS5) libm65.a - -init_rs.o: init_rs.c - $(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c - -encode_rs.o: encode_rs.c - $(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c - -decode_rs.o: decode_rs.c - $(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c - -.PHONY : clean - -clean: - rm -f *.o *.mod libm65.a m65 diff --git a/q65w/libm65/Makefile.MinGW b/q65w/libm65/Makefile.MinGW deleted file mode 100644 index 52b0ace03..000000000 --- a/q65w/libm65/Makefile.MinGW +++ /dev/null @@ -1,105 +0,0 @@ -# Makefile for MinGW on Windows -CC = gcc -FC = g95 -CXX = c:/wsjt-env/Qt5/Tools/mingw48_32/bin/g++ - -FFLAGS = -O2 -fbounds-check -Wall -Wno-precision-loss -fno-second-underscore -CFLAGS = -I. -fbounds-check - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: libm65.a m65.exe JT65code.exe mapsim.exe libastro.a - -OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ - decode1a.o sort.o filbig.o fil6521.o afc65b.o \ - twkfreq.o decode65b.o indexx.o ssort.o fchisq.o setup65.o \ - extract.o deep65.o ccf2.o demod64a.o chkhist.o graycode.o \ - interleave63.o unpackmsg.o encode65.o igray.o set.o unpackcall.o \ - unpackgrid.o grid2k.o unpacktext.o getpfx2.o packmsg.o \ - deg2grid.o packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \ - wrapkarn.o nchar.o init_rs.o encode_rs.o decode_rs.o \ - four2a.o rfile3a.o grid2deg.o pfxdump.o dpol.o \ - astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \ - geocentric.o moon2.o toxyz.o dot.o dcoord.o f77_wisdom.o \ - gen65.o chkmsg.o ptt.o astrosub.o astro0.o recvpkt.o symspec.o \ - iqcal.o iqfix.o timf2.o s3avg.o - -libm65.a: $(OBJS1) - ar cr libm65.a $(OBJS1) - ranlib libm65.a - -OBJS3 = m65.o m65a.o map65a.o symspec.o decode0.o ftninit.o ftnquit.o \ - timer.o ipcomm.o sec_midn.o cutil.o - -LIBS3 = -L'C:/wsjt-env/Qt5/5.2.1/mingw48_32/lib' -lQt5Core - -m65.exe: $(OBJS3) libm65.a - $(CXX) -o m65.exe $(OBJS3) $(LIBS3) libm65.a ../libfftw3f_win.a \ - c:/MinGW/lib/libf95.a - cp m65.exe ../../map65_install - -OBJS2 = JT65code.o -JT65code.exe: $(OBJS2) libm65.a - $(FC) -o JT65code.exe $(OBJS2) libm65.a - -OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \ - coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \ - dcoord.o - -libastro.a: $(OBJS7) - ar cr libastro.a $(OBJS7) - ranlib libastro.a - -OBJS6 = mapsim.o cgen65.o noisegen.o gran.o -mapsim.exe: $(OBJS6) libm65.a - $(FC) -o mapsim.exe $(OBJS6) libm65.a - -INCPATH = -I'C:/wsjt-env/Qt5/5.2.1/mingw48_32/include/QtCore' \ - -I'C:/wsjt-env/Qt5/5.2.1/mingw48_32/include' - -ipcomm.o: ipcomm.cpp - $(CXX) -c $(INCPATH) ipcomm.cpp - -#m65a.o: m65a.f90 -# $(FC) -c -fno-second-underscore -cpp m65a.f90 - -sec_midn.o: sec_midn.f90 - $(FC) -c -fno-second-underscore sec_midn.f90 - -#symspec.o: ../symspec.f90 -# $(FC) -c $(FFLAGS) -o symspec.o ../symspec.f90 - -OBJS4 = tastro.o astro0.o libm65.a -tastro.exe: $(OBJS4) - $(FC) $(FFLAGS) -o tastro.exe $(OBJS4) libm65.a - -OBJS5 = t1.o timer.o libm65.a -t1.exe: $(OBJS5) - $(FC) $(FFLAGS) -o t1.exe $(OBJS5) libm65.a - -#astro0.o: ../astro0.f90 -# $(FC) -c $(FFLAGS) -o astro0.o ../astro0.f90 - -init_rs.o: init_rs.c - $(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c - -encode_rs.o: encode_rs.c - $(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c - -decode_rs.o: decode_rs.c - $(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c - -.PHONY : clean - -clean: - rm -f *.o libm65.a m65.exe jt65code.exe diff --git a/q65w/libm65/Makefile.jtsdk b/q65w/libm65/Makefile.jtsdk deleted file mode 100644 index 77d97f597..000000000 --- a/q65w/libm65/Makefile.jtsdk +++ /dev/null @@ -1,129 +0,0 @@ -# Makefile for MinGW on Windows -CC = c:/JTSDK/Qt55/Tools/mingw492_32/bin/gcc -FC = c:/JTSDK/Qt55/Tools/mingw492_32/bin/gfortran -CXX = c:/JTSDK/Qt55/Tools/mingw492_32/bin/g++ - -FFLAGS = -O2 -fbounds-check -Wall -Wno-conversion -Wno-precision-loss \ - -fno-second-underscore -fbacktrace \ - -ffpe-summary=none -# -ffpe-trap=invalid,zero,overflow,underflow,denormal -CFLAGS = -I. -fbounds-check - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: packjt.o wavhdr.o libm65.a m65.exe mapsim.exe libastro.a - -OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ - decode1a.o sort.o filbig.o fil6521.o afc65b.o \ - twkfreq.o decode65b.o indexx.o ssort.o fchisq.o setup65.o \ - extract.o deep65.o ccf2.o demod64a.o chkhist.o graycode.o \ - interleave63.o encode65.o igray.o set.o shell.o qra64_subs.o \ - grid2k.o getpfx2.o q65b.o qra64c.o twkfreq_xy.o qra64zap.o \ - deg2grid.o getpfx1.o k2grid.o ftrsd2.o graycode65.o \ - wrapkarn.o nchar.o init_rs.o encode_rs.o decode_rs.o \ - four2a.o rfile3a.o grid2deg.o pfxdump.o dpol.o sync64.o spec64.o \ - astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \ - geocentric.o moon2.o toxyz.o dot.o dcoord.o f77_wisdom.o \ - gen65.o chkmsg.o ptt.o astrosub.o astro0.o recvpkt.o symspec.o \ - iqcal.o iqfix.o timf2.o s3avg.o packjt.o badmsg.o fmtmsg.o \ - qracodes.o qra64.o smo.o averms.o lorentzian.o npfwht.o pdmath.o \ - qra13_64_64_irr_e.o fchisq0.o genqra64a.o wavhdr.o - -packjt.o: packjt.f90 - $(FC) -c packjt.f90 - -libm65.a: $(OBJS1) - ar cr libm65.a $(OBJS1) - ranlib libm65.a - -qra64_subs.o: ./qra64/qra64_subs.c - gcc -c -O2 -o qra64_subs.o ./qra64/qra64_subs.c - -qracodes.o: qracodes/qracodes.c - gcc -c -O2 -o qracodes.o qracodes/qracodes.c - -qra64.o: qra64/qra64.c - gcc -c -O2 -o qra64.o qra64/qra64.c - -qra13_64_64_irr_e.o: qracodes/qra13_64_64_irr_e.c - gcc -c -O2 -o qra13_64_64_irr_e.o \ - qracodes/qra13_64_64_irr_e.c - -npfwht.o: qracodes/npfwht.c - gcc -c -O2 -o npfwht.o qracodes/npfwht.c - -pdmath.o: qracodes/pdmath.c - gcc -c -O2 -o pdmath.o qracodes/pdmath.c - -OBJS3 = m65.o m65a.o map65a.o symspec.o decode0.o ftninit.o ftnquit.o \ - timer.o ipcomm.o sec_midn.o usleep.o -# cutil.o - -LIBS3 = -L'C:/JTSDK/Qt55/5.5/mingw492_32/lib' -lQt5Core - -m65.exe: $(OBJS3) libm65.a - $(CXX) -o m65.exe $(OBJS3) $(LIBS3) libm65.a ../libfftw3f_win.a \ - -lgfortran - cp m65.exe ../../map65_install - -OBJS7 = astrosub.o astro0.o astro.o tm2.o grid2deg.o sun.o moondop.o \ - coord.o dot.o moon2.o tmoonsub.o toxyz.o geocentric.o \ - dcoord.o - -libastro.a: $(OBJS7) - ar cr libastro.a $(OBJS7) - ranlib libastro.a - -OBJS6 = mapsim.o cgen65.o noisegen.o gran.o -mapsim.exe: $(OBJS6) libm65.a - $(FC) -o mapsim.exe $(OBJS6) libm65.a - -INCPATH = -I'C:/JTSDK/Qt55/5.5/mingw492_32/include/QtCore' \ - -I'C:/JTSDK/Qt55/5.5/mingw492_32/include' - -ipcomm.o: ipcomm.cpp - $(CXX) -c $(INCPATH) ipcomm.cpp - -#m65a.o: m65a.f90 -# $(FC) -c -fno-second-underscore -cpp m65a.f90 - -sec_midn.o: sec_midn.f90 - $(FC) -c -fno-second-underscore sec_midn.f90 - -#symspec.o: ../symspec.f90 -# $(FC) -c $(FFLAGS) -o symspec.o ../symspec.f90 - -OBJS4 = tastro.o astro0.o libm65.a -tastro.exe: $(OBJS4) - $(FC) $(FFLAGS) -o tastro.exe $(OBJS4) libm65.a - -OBJS5 = t1.o timer.o libm65.a -t1.exe: $(OBJS5) - $(FC) $(FFLAGS) -o t1.exe $(OBJS5) libm65.a - -#astro0.o: ../astro0.f90 -# $(FC) -c $(FFLAGS) -o astro0.o ../astro0.f90 - -init_rs.o: init_rs.c - $(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c - -encode_rs.o: encode_rs.c - $(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c - -decode_rs.o: decode_rs.c - $(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c - -.PHONY : clean - -clean: - rm -f *.o *.mod libm65.a m65.exe diff --git a/q65w/libm65/Makefile.linux b/q65w/libm65/Makefile.linux deleted file mode 100644 index 4b96f215b..000000000 --- a/q65w/libm65/Makefile.linux +++ /dev/null @@ -1,96 +0,0 @@ -CC = gcc -FC = gfortran - -FFLAGS = -O2 -fbounds-check -Wall -# For ptt_unix: -CFLAGS = -I. -fbounds-check -DHAVE_STDLIB_H=1 -DHAVE_STDIO_H=1 \ - -DHAVE_FCNTL_H=1 -DHAVE_SYS_IOCTL_H=1 - -# Default rules -%.o: %.c - ${CC} ${CFLAGS} -c $< -%.o: %.f - ${FC} ${FFLAGS} -c $< -%.o: %.F - ${FC} ${FFLAGS} -c $< -%.o: %.f90 - ${FC} ${FFLAGS} -c $< -%.o: %.F90 - ${FC} ${FFLAGS} -c $< - -all: libm65.a m65 - -OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ - decode1a.o sort.o filbig.o fil6521.o afc65b.o \ - twkfreq.o decode65b.o indexx.o ssort.o fchisq.o setup65.o \ - extract.o deep65.o ccf2.o demod64a.o chkhist.o graycode.o \ - interleave63.o unpackmsg.o encode65.o igray.o set.o unpackcall.o \ - unpackgrid.o grid2k.o unpacktext.o getpfx2.o packmsg.o \ - deg2grid.o packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \ - wrapkarn.o nchar.o init_rs.o encode_rs.o decode_rs.o \ - four2a.o rfile3a.o grid2deg.o pfxdump.o dpol.o \ - astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \ - geocentric.o moon2.o toxyz.o dot.o dcoord.o f77_wisdom.o \ - gen65.o chkmsg.o ptt_unix.o astrosub.o astro0.o recvpkt.o \ - symspec.o iqcal.o iqfix.o timf2.o s3avg.o - -libm65.a: $(OBJS1) - ar cr libm65.a $(OBJS1) - ranlib libm65.a - -OBJS3 = m65.o m65a.o map65a.o symspec.o decode0.o ftninit.o ftnquit.o \ - timer.o ipcomm.o sec_midn.o cutil.o - -m65: $(OBJS3) libm65.a - g++ -o m65 $(OBJS3) libm65.a -lfftw3f -lQtCore -lfftw3f -lgfortran - -OBJS2 = m65a.o ipcomm.o sec_midn.o cutil.o decode0.o map65a.o \ - timer.o ftninit.o ftnquit.o -LIBS2 = -lQtCore -lfftw3f -lgfortran - -m65a: $(OBJS2) libm65.a - g++ -o m65a $(OBJS2) libm65.a -lQtCore -lfftw3f -lgfortran - -OBJS6 = t3.o ipcomm.o -LIBS2 = -lQtCore -lgfortran - -t3: $(OBJS6) - g++ -o t3 $(OBJS6) $(LIBS2) - -t3: - -INCPATH = -I. -I'/usr/include/qt4' -I'/usr/include/qt4/QtCore' - -ipcomm.o: ipcomm.cpp - g++ -c $(INCPATH) ipcomm.cpp - -m65a.o: m65a.F90 - $(FC) -c -fno-second-underscore -DUNIX m65a.F90 - -extract.o: extract.F - $(FC) -c -fno-second-underscore -DUNIX extract.F - -sec_midn.o: sec_midn.f90 - $(FC) -c -fno-second-underscore sec_midn.f90 - -OBJS4 = tastro.o astro0.o libm65.a -tastro: $(OBJS4) - $(FC) $(FFLAGS) -o tastro $(OBJS4) libm65.a - -OBJS5 = t1.o timer.o libm65.a -t1: $(OBJS5) - $(FC) $(FFLAGS) -o t1 $(OBJS5) libm65.a - -init_rs.o: init_rs.c - $(CC) -c -DBIGSYM=1 -o init_rs.o init_rs.c - -encode_rs.o: encode_rs.c - $(CC) -c -DBIGSYM=1 -o encode_rs.o encode_rs.c - -decode_rs.o: decode_rs.c - $(CC) -c -DBIGSYM=1 -o decode_rs.o decode_rs.c - -.PHONY : clean - -clean: - rm -f *.o libm65.a m65 m65a diff --git a/q65w/libm65/polfit.f90 b/q65w/libm65/polfit.f90 deleted file mode 100644 index 33e8d44ed..000000000 --- a/q65w/libm65/polfit.f90 +++ /dev/null @@ -1,87 +0,0 @@ -subroutine polfit(y,npts,a) - -! Input: y(npts) !Expect npts=4 -! Output: a(1) = baseline -! a(2) = amplitude -! a(3) = theta (deg) - - real y(npts) - real a(3) - real deltaa(3) - integer ipk(1) - save - -! Set starting values: - a(1)=minval(y) - a(2)=maxval(y)-a(1) - ipk=maxloc(y) - a(3)=(ipk(1)-1)*45.0 - - deltaa(1:2)=0.1*a(2) - deltaa(3)=10.0 - nterms=3 - -! Start the iteration - chisqr=0. - chisqr0=1.e6 - iters=10 - - do iter=1,iters - do j=1,nterms - chisq1=fchisq_pol(y,npts,a) - fn=0. - delta=deltaa(j) -10 a(j)=a(j)+delta - chisq2=fchisq_pol(y,npts,a) - if(chisq2.eq.chisq1) go to 10 - if(chisq2.gt.chisq1) then - delta=-delta !Reverse direction - a(j)=a(j)+delta - tmp=chisq1 - chisq1=chisq2 - chisq2=tmp - endif -20 fn=fn+1.0 - a(j)=a(j)+delta - chisq3=fchisq_pol(y,npts,a) - if(chisq3.lt.chisq2) then - chisq1=chisq2 - chisq2=chisq3 - go to 20 - endif - -! Find minimum of parabola defined by last three points - delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) - a(j)=a(j)-delta - deltaa(j)=deltaa(j)*fn/3. -! write(*,4000) iter,j,a,deltaa,chisq2 -!4000 format(2i2,2(2x,3f8.2),f12.5) - enddo ! j=1,nterms - chisqr=fchisq_pol(y,npts,a) -! write(*,4000) 0,0,a,chisqr - if(chisqr.lt.1.0) exit - if(deltaa(1).lt.0.01*(a(2)-a(1)) .and. deltaa(2).lt.0.01*(a(2)-a(1)) & - .and. deltaa(3).lt.1.0) exit - if(chisqr/chisqr0.gt.0.99) exit - chisqr0=chisqr - enddo ! iter - a(3)=mod(a(3)+360.0,180.0) - - return -end subroutine polfit - -real function fchisq_pol(y,npts,a) - - real y(npts),a(3) - data rad/57.2957795/ - - chisq = 0. - do i=1,npts - theta=(i-1)*45.0 - yfit=a(1) + a(2)*cos((theta-a(3))/rad)**2 - chisq=chisq + (y(i) - yfit)**2 - enddo - fchisq_pol=chisq - - return -end function fchisq_pol From bac3198f7fa2ebe4ad15236808d3aec18aace4af Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 10:20:39 -0500 Subject: [PATCH 085/251] WIP on simplifying map65a.f90. --- q65w/libm65/ftninit.f90 | 3 +- q65w/libm65/map65a.f90 | 68 +++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 45 deletions(-) diff --git a/q65w/libm65/ftninit.f90 b/q65w/libm65/ftninit.f90 index d93fe4076..c25c04f57 100644 --- a/q65w/libm65/ftninit.f90 +++ b/q65w/libm65/ftninit.f90 @@ -19,8 +19,7 @@ subroutine ftninit open(12,file=appd//'/q65w_decodes.txt',status='unknown') open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') -! open(21,file=appd//'/map65_rx.log',status='unknown',access='append',err=950) -! open(26,file=appd//'/tmp26.txt',status='unknown') + open(71,file=appd//'/debug.tmp',status='unknown') ! Import FFTW wisdom, if available: iret=fftwf_init_threads() !Initialize FFTW threading diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index e33cff612..f550456b5 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -103,14 +103,14 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & nqd=0 fa=-1000*0.5*(nfb-nfa) + 1000*nfshift fb= 1000*0.5*(nfb-nfa) + 1000*nfshift - ia=nint(fa/df) + 16385 - ib=nint(fb/df) + 16385 - ia=max(51,ia) - ib=min(32768-51,ib) - if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia + ia=nint(fa/df) + 16385 + ib=nint(fb/df) + 16385 + ia=max(51,ia) + ib=min(32768-51,ib) + if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia - km=0 - nkm=1 + km=0 + nkm=1 nz=n/8 freq0=-999. sync10=-999. @@ -119,10 +119,18 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & ntry=0 short=0. !Zero the whole short array jpz=1 + + print*,'AAA',mode65 + ! if(xpol) jpz=4 ! First steps for JT65 decoding - do i=ia,ib !Search over freq range +! do i=ia,ib !Search over freq range + do i=ia,ia + if(mode65.eq.0) then + print*,'BBB' + go to 68 + endif freq=0.001*(i-16385)*df ! Find the local base level for each polarization; update every 10 bins. if(mod(i-ia,10).eq.0) then @@ -233,55 +241,29 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & f00=(i-1)*df !Freq of detected sync tone (0-96000 Hz) ntry=ntry+1 +68 print*,'CCC' call timer('decode1a',0) ifreq=i ikhz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift))) + + rewind 71 + write(71,*)newdat,f00,nflip,mode65,nfsample, & + xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & + ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & + a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded + call decode1a(dd,newdat,f00,nflip,mode65,nfsample, & xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded) call timer('decode1a',1) - -! The case sync1=2.0 is just to make sure decode1a is called and bigfft done. - if(mode65.ne.0 .and. sync1.ne.2.000000) then - if(km.lt.MAXMSG) km=km+1 - sig(km,1)=nfile - sig(km,2)=nutc - sig(km,3)=freq + 0.5*(nfa+nfb) - sig(km,4)=sync1 - sig(km,5)=dt - sig(km,6)=pol - sig(km,7)=flipk - sig(km,8)=sync2 - sig(km,9)=nkv - sig(km,10)=qual -! sig(km,11)=idphi - sig(km,12)=savg(i) - sig(km,13)=a(1) - sig(km,14)=a(2) - sig(km,15)=a(3) - sig(km,16)=a(4) -! sig(km,17)=a(5) - sig(km,18)=nhist - msg(km)=decoded - freq0=freq - sync10=sync1 - nkm=1 - endif + if(mode65.eq.0) exit !### JHT ### endif endif endif enddo !i=ia,ib - if(ndphi.eq.1 .and.iloop.lt.12) then - iloop=iloop+1 - go to 2 - endif - - if(ndphi.eq.1 .and.iloop.eq.12) call getdphi(qphi) - if(nhsym.eq.nhsym1 .and. tsec0.gt.3.0) go to 700 - if(nqd.eq.0 .and. bq65) then ! Do the wideband Q65 decode do icand=1,ncand From 97b58a387b918ac6f2d52cbe79c36da24f432eea Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 10:33:32 -0500 Subject: [PATCH 086/251] Don't need decode1a.f90, any more. --- q65w/libm65/CMakeLists.txt | 1 - q65w/libm65/map65a.f90 | 146 +------------------------------------ 2 files changed, 4 insertions(+), 143 deletions(-) diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index b37f596e4..a49f46535 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -17,7 +17,6 @@ set (libm65_FSRCS coord.f90 dcoord.f90 decode0.f90 - decode1a.f90 decode65b.f90 deep65.f90 deg2grid.f90 diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index f550456b5..1ddc624e9 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -11,6 +11,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & parameter (MAXMSG=1000) !Size of decoded message list parameter (NSMAX=60*96000) + complex cx(NSMAX/64), cy(NSMAX/64) !Data at 1378.125 samples/s real dd(4,NSMAX) real*4 ss(4,322,NFFT),savg(NFFT) real tavg(-50:50) !Temp for finding local base level @@ -121,148 +122,9 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & jpz=1 print*,'AAA',mode65 - -! if(xpol) jpz=4 - -! First steps for JT65 decoding -! do i=ia,ib !Search over freq range - do i=ia,ia - if(mode65.eq.0) then - print*,'BBB' - go to 68 - endif - freq=0.001*(i-16385)*df -! Find the local base level for each polarization; update every 10 bins. - if(mod(i-ia,10).eq.0) then - do jp=1,jpz - do ii=-50,50 - iii=i+ii - if(iii.ge.1 .and. iii.le.32768) then - tavg(ii)=savg(iii) - else - write(13,*) 'Error in iii:',iii,ia,ib,fa,fb - flush(13) - go to 900 - endif - enddo - call pctile(tavg,101,50,base(jp)) - enddo - endif - -! Find max signal at this frequency - smax=0. - do jp=1,jpz - if(savg(i)/base(jp).gt.smax) then - smax=savg(i)/base(jp) - jpmax=jp - endif - enddo - - if(smax.gt.1.1 .or. ia.eq.ib) then -! Look for JT65 sync patterns and shorthand square-wave patterns. - call timer('ccf65 ',0) - ssmax=1.e30 - call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt, & - flipk,syncshort,snr2,ipol2,dt2) - call timer('ccf65 ',1) - if(mode65.eq.0) syncshort=-99.0 !If "No JT65", don't waste time - -! ########################### Search for Shorthand Messages ################# -! Is there a shorthand tone above threshold? - thresh0=1.0 -! Use lower thresh0 at fQSO - if(syncshort.gt.thresh0) then -! ### Do shorthand AFC here (or maybe after finding a pair?) ### - short(1,i)=syncshort - short(2,i)=dt2 - short(3,i)=ipol2 - -! Check to see if lower tone of shorthand pair was found. - do j=2,4 - i0=i-nint(j*mode65*10.0*(11025.0/4096.0)/df) -! Should this be i0 +/- 1, or just i0? -! Should we also insist that difference in DT be either 1.5 or -1.5 s? - if(short(1,i0).gt.thresh0) then - fshort=0.001*(i0-16385)*df - noffset=0 - if(abs(noffset).le.ntol) then -! Keep only the best candidate within ftol. -!### NB: sync2 was not defined here! -! sync2=syncshort !### try this ??? - if(fshort-fshort0.le.ftol .and. & - syncshort.gt.syncshort0 .and. nkm.eq.2) km=km-1 - if(fshort-fshort0.gt.ftol .or. & - syncshort.gt.syncshort0) then - if(km.lt.MAXMSG) km=km+1 - sig(km,1)=nfile - sig(km,2)=nutc - sig(km,3)=fshort + 0.5*(nfa+nfb) - sig(km,4)=syncshort - sig(km,5)=dt2 - sig(km,6)=45*(ipol2-1)/57.2957795 - sig(km,7)=0 - sig(km,8)=snr2 - sig(km,9)=0 - sig(km,10)=0 -! sig(km,11)=rms0 - sig(km,12)=savg(i) - sig(km,13)=0 - sig(km,14)=0 - sig(km,15)=0 - sig(km,16)=0 -! sig(km,17)=0 - sig(km,18)=0 - msg(km)=shmsg0(j) - fshort0=fshort - syncshort0=syncshort - nkm=2 - endif - endif - endif - enddo - endif - -! ########################### Search for Normal Messages ########### -! Is sync1 above threshold? - thresh1=1.0 -! Use lower thresh1 at fQSO - noffset=0 - if(newdat.eq.1 .and. sync1.gt.-99.0) then - sync1=thresh1+1.0 - noffset=0 - endif - if(sync1.gt.thresh1 .and. abs(noffset).le.ntol) then -! Keep only the best candidate within ftol. -! (Am I deleting any good decodes by doing this?) - if(freq-freq0.le.ftol .and. sync1.gt.sync10 .and. & - nkm.eq.1) km=km-1 - if(freq-freq0.gt.ftol .or. sync1.gt.sync10) then - nflip=nint(flipk) - f00=(i-1)*df !Freq of detected sync tone (0-96000 Hz) - ntry=ntry+1 - -68 print*,'CCC' - call timer('decode1a',0) - ifreq=i - ikhz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift - idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift))) - - rewind 71 - write(71,*)newdat,f00,nflip,mode65,nfsample, & - xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & - ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & - a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded - - call decode1a(dd,newdat,f00,nflip,mode65,nfsample, & - xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, & - ndphi,nutc,ikHz,idf,ipol,ntol,sync2, & - a,dt,pol,nkv,nhist,nsum,nsave,qual,decoded) - call timer('decode1a',1) - if(mode65.eq.0) exit !### JHT ### - endif - endif - endif - enddo !i=ia,ib + call timer('filbig ',0) + call filbig(dd,NSMAX,f0,newdat,nfsample,xpol,cx,cy,n5) + call timer('filbig ',1) if(nqd.eq.0 .and. bq65) then ! Do the wideband Q65 decode From ecaa0b88615f1b1ee7acceab13e857dfbacc43ef Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 11:14:58 -0500 Subject: [PATCH 087/251] Major prund files from Q65W source tree. --- q65w/libm65/CMakeLists.txt | 38 -- q65w/libm65/afc65b.f90 | 70 --- q65w/libm65/averms.f90 | 20 - q65w/libm65/badmsg.f90 | 46 -- q65w/libm65/ccf2.f90 | 45 -- q65w/libm65/ccf65.f90 | 128 ----- q65w/libm65/cgen65.f90 | 99 ---- q65w/libm65/decode1a.f90 | 145 ----- q65w/libm65/decode65b.f90 | 48 -- q65w/libm65/deep65.f90 | 170 ------ q65w/libm65/demod64a.f90 | 77 --- q65w/libm65/display.f90 | 183 ------- q65w/libm65/dpol.f90 | 41 -- q65w/libm65/encode65.f90 | 14 - q65w/libm65/extract.f90 | 136 ----- q65w/libm65/fchisq.f90 | 77 --- q65w/libm65/fil6521.f90 | 44 -- q65w/libm65/fmtmsg.f90 | 21 - q65w/libm65/gen65.f90 | 99 ---- q65w/libm65/gen_q65_cwave.f90 | 52 -- q65w/libm65/gen_q65_wave.f90 | 54 -- q65w/libm65/graycode65.f90 | 9 - q65w/libm65/jt65code.f90 | 47 -- q65w/libm65/map65a.f90 | 2 - q65w/libm65/mapsim.f90 | 229 -------- q65w/libm65/noisegen.f90 | 13 - q65w/libm65/packjt.f90 | 996 ---------------------------------- q65w/libm65/setup65.f90 | 96 ---- 28 files changed, 2999 deletions(-) delete mode 100644 q65w/libm65/afc65b.f90 delete mode 100644 q65w/libm65/averms.f90 delete mode 100644 q65w/libm65/badmsg.f90 delete mode 100644 q65w/libm65/ccf2.f90 delete mode 100644 q65w/libm65/ccf65.f90 delete mode 100644 q65w/libm65/cgen65.f90 delete mode 100644 q65w/libm65/decode1a.f90 delete mode 100644 q65w/libm65/decode65b.f90 delete mode 100644 q65w/libm65/deep65.f90 delete mode 100644 q65w/libm65/demod64a.f90 delete mode 100644 q65w/libm65/display.f90 delete mode 100644 q65w/libm65/dpol.f90 delete mode 100644 q65w/libm65/encode65.f90 delete mode 100644 q65w/libm65/extract.f90 delete mode 100644 q65w/libm65/fchisq.f90 delete mode 100644 q65w/libm65/fil6521.f90 delete mode 100644 q65w/libm65/fmtmsg.f90 delete mode 100644 q65w/libm65/gen65.f90 delete mode 100644 q65w/libm65/gen_q65_cwave.f90 delete mode 100644 q65w/libm65/gen_q65_wave.f90 delete mode 100644 q65w/libm65/graycode65.f90 delete mode 100644 q65w/libm65/jt65code.f90 delete mode 100644 q65w/libm65/mapsim.f90 delete mode 100644 q65w/libm65/noisegen.f90 delete mode 100644 q65w/libm65/packjt.f90 delete mode 100644 q65w/libm65/setup65.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index a49f46535..cda8cb193 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -3,54 +3,33 @@ set (libm65_FSRCS wideband_sync.f90 # Non-module Fortran routines: - afc65b.f90 astro.f90 astro0.f90 astrosub.f90 - averms.f90 - badmsg.f90 - ccf2.f90 - ccf65.f90 - cgen65.f90 chkhist.f90 chkmsg.f90 coord.f90 dcoord.f90 decode0.f90 - decode65b.f90 - deep65.f90 deg2grid.f90 - demod64a.f90 - display.f90 dot.f90 - dpol.f90 - encode65.f90 - extract.f90 - fchisq.f90 fchisq0.f90 - fil6521.f90 filbig.f90 - fmtmsg.f90 four2a.f90 ftninit.f90 ftnquit.f90 q65b.f90 - gen65.f90 - gen_q65_cwave.f90 - gen_q65_wave.f90 geocentric.f90 getdphi.f90 getpfx1.f90 getpfx2.f90 graycode.f90 - graycode65.f90 grid2deg.f90 grid2k.f90 indexx.f90 interleave63.f90 iqcal.f90 iqfix.f90 - jt65code.f90 k2grid.f90 lorentzian.f90 m65c.f90 @@ -58,15 +37,12 @@ set (libm65_FSRCS moon2.f90 moondop.f90 nchar.f90 - noisegen.f90 - packjt.f90 pfxdump.f90 recvpkt.f90 rfile3a.f90 s3avg.f90 sec_midn.f90 set.f90 - setup65.f90 shell.f90 sleep_msec.f90 smo.f90 @@ -78,7 +54,6 @@ set (libm65_FSRCS trimlist.f90 twkfreq.f90 twkfreq_xy.f90 - txpol.f90 wavhdr.f90 f77_wisdom.f @@ -128,16 +103,3 @@ set_property (SOURCE ${libm65_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CM add_library (m65impl STATIC ${libm65_FSRCS} ${libm65_CSRCS} ${libm65_CXXSRCS}) target_link_libraries (m65impl wsjt_fort wsjt_cxx Qt5::Core) -add_executable (mapsim mapsim.f90) -target_link_libraries (mapsim m65impl ${FFTW3_LIBRARIES}) - -#add_executable (synctest synctest.f90) -#target_link_libraries (synctest m65impl ${FFTW3_LIBRARIES}) - -if (WIN32) - install ( - TARGETS mapsim - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime - BUNDLE DESTINATION . COMPONENT runtime - ) -endif () diff --git a/q65w/libm65/afc65b.f90 b/q65w/libm65/afc65b.f90 deleted file mode 100644 index 53f61ea44..000000000 --- a/q65w/libm65/afc65b.f90 +++ /dev/null @@ -1,70 +0,0 @@ -subroutine afc65b(cx,cy,npts,fsample,nflip,ipol,xpol,ndphi,a,ccfbest,dtbest) - - logical xpol - complex cx(npts) - complex cy(npts) - real a(5),deltaa(5) - - a(1)=0. - a(2)=0. - a(3)=0. - a(4)=45.0*(ipol-1.0) - deltaa(1)=2.0 - deltaa(2)=2.0 - deltaa(3)=2.0 - deltaa(4)=22.5 - deltaa(5)=0.05 - nterms=3 - if(xpol) nterms=4 - -! Don't fit polarization when solving for dphi - if(ndphi.ne.0) nterms=3 - -! Start the iteration - chisqr=0. - chisqr0=1.e6 - do iter=1,3 !One iteration is enough? - do j=1,nterms - chisq1=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax) - fn=0. - delta=deltaa(j) -10 a(j)=a(j)+delta - chisq2=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax) - if(chisq2.eq.chisq1) go to 10 - if(chisq2.gt.chisq1) then - delta=-delta !Reverse direction - a(j)=a(j)+delta - tmp=chisq1 - chisq1=chisq2 - chisq2=tmp - endif -20 fn=fn+1.0 - a(j)=a(j)+delta - chisq3=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax) - if(chisq3.lt.chisq2) then - chisq1=chisq2 - chisq2=chisq3 - go to 20 - endif - -! Find minimum of parabola defined by last three points - delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) - a(j)=a(j)-delta - deltaa(j)=deltaa(j)*fn/3. - enddo - chisqr=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax) - if(chisqr/chisqr0.gt.0.9999) go to 30 - chisqr0=chisqr - enddo - -30 ccfbest=ccfmax * (1378.125/fsample)**2 - dtbest=dtmax - - if(a(4).lt.0.0) a(4)=a(4)+180.0 - if(a(4).ge.180.0) a(4)=a(4)-180.0 - if(nint(a(4)).eq.180) a(4)=0. - ipol=nint(a(4)/45.0) + 1 - if(ipol.gt.4) ipol=ipol-4 - - return -end subroutine afc65b diff --git a/q65w/libm65/averms.f90 b/q65w/libm65/averms.f90 deleted file mode 100644 index 904004c81..000000000 --- a/q65w/libm65/averms.f90 +++ /dev/null @@ -1,20 +0,0 @@ -subroutine averms(x,n,nskip,ave,rms) - real x(n) - integer ipk(1) - - ns=0 - s=0. - sq=0. - ipk=maxloc(x) - do i=1,n - if(abs(i-ipk(1)).gt.nskip) then - s=s + x(i) - sq=sq + x(i)**2 - ns=ns+1 - endif - enddo - ave=s/ns - rms=sqrt(sq/ns - ave*ave) - - return -end subroutine averms diff --git a/q65w/libm65/badmsg.f90 b/q65w/libm65/badmsg.f90 deleted file mode 100644 index 007da8a85..000000000 --- a/q65w/libm65/badmsg.f90 +++ /dev/null @@ -1,46 +0,0 @@ -subroutine badmsg(irc,dat,nc1,nc2,ng2) - -! Get rid of a few QRA64 false decodes that cannot be correct messages. - - integer dat(12) !Decoded message (as 12 integers) - - ic1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+ & - ishft(dat(4),4) + iand(ishft(dat(5),-2),15) - -! Test for "......" or "CQ 000" - if(ic1.eq.262177560 .or. ic1.eq.262177563) then - irc=-1 - return - endif - - ic2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) + & - ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) + & - iand(ishft(dat(10),-4),3) - - ig=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12) - -! Test for blank, -01 to -30, R-01 to R-30, RO, RRR, 73 - if(ig.ge.32401 .and. ig.le.32464) return - - if(ig.ge.14220 .and. ig.le.14229) return !-41 to -50 - if(ig.ge.14040 .and. ig.le.14049) return !-31 to -40 - - if(ig.ge.13320 .and. ig.le.13329) return !+00 to +09 - if(ig.ge.13140 .and. ig.le.13149) return !+10 to +19 - if(ig.ge.12960 .and. ig.le.12969) return !+20 to +29 - if(ig.ge.12780 .and. ig.le.12789) return !+30 to +39 - if(ig.ge.12600 .and. ig.le.12609) return !+40 to +49 - - if(ig.ge.12420 .and. ig.le.12429) return !R-41 to R-50 - if(ig.ge.12240 .and. ig.le.12249) return !R-31 to R-40 - - if(ig.ge.11520 .and. ig.le.11529) return !R+00 to R+09 - if(ig.ge.11340 .and. ig.le.11349) return !R+10 to R+19 - if(ig.ge.11160 .and. ig.le.11169) return !R+20 to R+29 - if(ig.ge.10980 .and. ig.le.10989) return !R+30 to R+39 - if(ig.ge.10800 .and. ig.le.10809) return !R+40 to R+49 - - if(ic1.eq.nc1 .and. ic2.eq.nc2 .and. ng2.ne.32401 .and. ig.ne.ng2) irc=-1 - - return -end subroutine badmsg diff --git a/q65w/libm65/ccf2.f90 b/q65w/libm65/ccf2.f90 deleted file mode 100644 index 287e70ffb..000000000 --- a/q65w/libm65/ccf2.f90 +++ /dev/null @@ -1,45 +0,0 @@ -subroutine ccf2(ss,nz,nflip,ccfbest,lagpk) - -! parameter (LAGMAX=60) - parameter (LAGMAX=200) - real ss(nz) - real ccf(-LAGMAX:LAGMAX) - integer npr(126) - -! The JT65 pseudo-random sync pattern: - data npr/ & - 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & - 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & - 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & - 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & - 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & - 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & - 1,1,1,1,1,1/ - save - - ccfbest=0. - lag1=-LAGMAX - lag2=LAGMAX - do lag=lag1,lag2 - s0=0. - s1=0. - do i=1,126 - j=2*(8*i + 43) + lag - if(j.ge.1 .and. j.le.nz-8) then - x=ss(j)+ss(j+8) !Add two half-symbol contributions - if(npr(i).eq.0) then - s0=s0 + x - else - s1=s1 + x - endif - endif - enddo - ccf(lag)=nflip*(s1-s0) - if(ccf(lag).gt.ccfbest) then - ccfbest=ccf(lag) - lagpk=lag - endif - enddo - - return -end subroutine ccf2 diff --git a/q65w/libm65/ccf65.f90 b/q65w/libm65/ccf65.f90 deleted file mode 100644 index 592fe95ed..000000000 --- a/q65w/libm65/ccf65.f90 +++ /dev/null @@ -1,128 +0,0 @@ -subroutine ccf65(ss,nhsym,ssmax,sync1,ipol1,jpz,dt1,flipk, & - syncshort,snr2,ipol2,dt2) - - parameter (NFFT=512,NH=NFFT/2) - real ss(4,322) !Input: half-symbol powers, 4 pol'ns - real s(NFFT) !CCF = ss*pr - complex cs(0:NH) !Complex FT of s - real s2(NFFT) !CCF = ss*pr2 - complex cs2(0:NH) !Complex FT of s2 - real pr(NFFT) !JT65 pseudo-random sync pattern - complex cpr(0:NH) !Complex FT of pr - real pr2(NFFT) !JT65 shorthand pattern - complex cpr2(0:NH) !Complex FT of pr2 - real tmp1(322) - real ccf(-11:54,4) - logical first - integer npr(126) - data first/.true./ - equivalence (s,cs),(pr,cpr),(s2,cs2),(pr2,cpr2) - save - -! The JT65 pseudo-random sync pattern: - data npr/ & - 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & - 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & - 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & - 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & - 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & - 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & - 1,1,1,1,1,1/ - - if(first) then -! Initialize pr, pr2; compute cpr, cpr2. - fac=1.0/NFFT - do i=1,NFFT - pr(i)=0. - pr2(i)=0. - k=2*mod((i-1)/8,2)-1 - if(i.le.NH) pr2(i)=fac*k - enddo - do i=1,126 - j=2*i - pr(j)=fac*(2*npr(i)-1) -! Not sure why, but it works significantly better without the following line: -! pr(j-1)=pr(j) - enddo - call four2a(cpr,NFFT,1,-1,0) - call four2a(cpr2,NFFT,1,-1,0) - first=.false. - endif - syncshort=0. - snr2=0. - -! Look for JT65 sync pattern and shorthand square-wave pattern. - ccfbest=0. - ccfbest2=0. - ipol1=1 - ipol2=1 - do ip=1,jpz !Do jpz polarizations - do i=1,nhsym-1 -! s(i)=ss(ip,i)+ss(ip,i+1) - s(i)=min(ssmax,ss(ip,i)+ss(ip,i+1)) - enddo - call pctile(s,nhsym-1,50,base) - s(1:nhsym-1)=s(1:nhsym-1)-base - s(nhsym:NFFT)=0. - call four2a(cs,NFFT,1,-1,0) !Real-to-complex FFT - do i=0,NH - cs2(i)=cs(i)*conjg(cpr2(i)) !Mult by complex FFT of pr2 - cs(i)=cs(i)*conjg(cpr(i)) !Mult by complex FFT of pr - enddo - call four2a(cs,NFFT,1,1,-1) !Complex-to-real inv-FFT - call four2a(cs2,NFFT,1,1,-1) !Complex-to-real inv-FFT - - do lag=-11,54 !Check for best JT65 sync - j=lag - if(j.lt.1) j=j+NFFT - ccf(lag,ip)=s(j) - if(abs(ccf(lag,ip)).gt.ccfbest) then - ccfbest=abs(ccf(lag,ip)) - lagpk=lag - ipol1=ip - flipk=1.0 - if(ccf(lag,ip).lt.0.0) flipk=-1.0 - endif - enddo - -!### Not sure why this is ever true??? - if(sum(ccf).eq.0.0) return -!### - do lag=-11,54 !Check for best shorthand - ccf2=s2(lag+28) - if(ccf2.gt.ccfbest2) then - ccfbest2=ccf2 - lagpk2=lag - ipol2=ip - endif - enddo - - enddo - -! Find rms level on baseline of "ccfblue", for normalization. - sumccf=0. - do lag=-11,54 - if(abs(lag-lagpk).gt.1) sumccf=sumccf + ccf(lag,ipol1) - enddo - base=sumccf/50.0 - sq=0. - do lag=-11,54 - if(abs(lag-lagpk).gt.1) sq=sq + (ccf(lag,ipol1)-base)**2 - enddo - rms=sqrt(sq/49.0) - sync1=-4.0 - if(rms.gt.0.0) sync1=ccfbest/rms - 4.0 - dt1=lagpk*(2048.0/11025.0) - 2.5 - -! Find base level for normalizing snr2. - do i=1,nhsym - tmp1(i)=ss(ipol2,i) - enddo - call pctile(tmp1,nhsym,40,base) - snr2=0.01 - if(base.gt.0.0) snr2=0.398107*ccfbest2/base !### empirical - syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms? - dt2=2.5 + lagpk2*(2048.0/11025.0) - - return -end subroutine ccf65 diff --git a/q65w/libm65/cgen65.f90 b/q65w/libm65/cgen65.f90 deleted file mode 100644 index 096e9790d..000000000 --- a/q65w/libm65/cgen65.f90 +++ /dev/null @@ -1,99 +0,0 @@ -subroutine cgen65(message,mode65,samfac,nsendingsh,msgsent,cwave,nwave) - -! Encodes a JT65 message into a wavefile. -! Executes in 17 ms on opti-745. - - use packjt - - parameter (NMAX=60*96000) !Max length of wave file - character*22 message !Message to be generated - character*22 msgsent !Message as it will be received - character*3 cok !' ' or 'OOO' - real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,samfac,tsymbol - complex cwave(NMAX) !Generated complex wave file - integer dgen(12) - integer sent(63) - logical first - integer nprc(126) - real pr(126) - data nprc/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & - 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & - 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & - 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & - 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & - 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & - 1,1,1,1,1,1/ - data twopi/6.283185307179586476d0/,first/.true./ - save - - if(first) then - do i=1,126 - pr(i)=2*nprc(i)-1 - enddo - first=.false. - endif - - call chkmsg(message,cok,nspecial,flip) !See if it's a shorthand - if(nspecial.eq.0) then - call packmsg(message,dgen,itype) !Pack message into 72 bits - nsendingsh=0 - if(iand(dgen(10),8).ne.0) nsendingsh=-1 !Plain text flag - - call rs_encode(dgen,sent) - call interleave63(sent,1) !Apply interleaving - call graycode(sent,63,1) !Apply Gray code - nsym=126 !Symbols per transmission - tsymbol=4096.d0/11025.d0 !Time per symbol - else - nsendingsh=1 !Flag for shorthand message - nsym=32 - tsymbol=16384.d0/11025.d0 - endif - -! Set up necessary constants - dt=1.d0/(samfac*96000.d0) - f0=118*11025.d0/1024 - dfgen=mode65*11025.d0/4096.d0 - t=0.d0 - phi=0.d0 - k=0 - j0=0 - ndata=nsym*96000.d0*samfac*tsymbol - - do i=1,ndata - t=t+dt - j=int(t/tsymbol) + 1 !Symbol number, 1-126 - if(j.ne.j0) then - f=f0 - if(nspecial.ne.0 .and. mod(j,2).eq.0) f=f0+10*nspecial*dfgen - if(nspecial.eq.0 .and. flip*pr(j).lt.0.0) then - k=k+1 - f=f0+(sent(k)+2)*dfgen - endif - dphi=twopi*dt*f - j0=j - endif - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - cwave(i)=cmplx(cos(xphi),-sin(xphi)) - enddo - - cwave(ndata+1:)=0 - nwave=ndata + 48000 - call unpackmsg(dgen,msgsent) - if(flip.lt.0.0) then - do i=22,1,-1 - if(msgsent(i:i).ne.' ') goto 10 - enddo -10 msgsent=msgsent(1:i)//' OOO' - endif - - if(nsendingsh.eq.1) then - if(nspecial.eq.2) msgsent='RO' - if(nspecial.eq.3) msgsent='RRR' - if(nspecial.eq.4) msgsent='73' - endif - - return -end subroutine cgen65 diff --git a/q65w/libm65/decode1a.f90 b/q65w/libm65/decode1a.f90 deleted file mode 100644 index 4219c0043..000000000 --- a/q65w/libm65/decode1a.f90 +++ /dev/null @@ -1,145 +0,0 @@ -subroutine decode1a(dd,newdat,f0,nflip,mode65,nfsample,xpol, & - mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi, & - nutc,nkhz,ndf,ipol,ntol,sync2,a,dt,pol,nkv,nhist,nsum,nsave, & - qual,decoded) - -! Apply AFC corrections to a candidate JT65 signal, then decode it. - - use timer_module, only: timer - parameter (NMAX=60*96000) !Samples per 60 s - real*4 dd(4,NMAX) !92 MB: raw data from Linrad timf2 - complex cx(NMAX/64), cy(NMAX/64) !Data at 1378.125 samples/s - complex c5x(NMAX/256),c5y(NMAX/256) !Data at 344.53125 Hz - complex c5a(512) - complex z - real s2(66,126) - real s3(64,63),sy(63) - real a(5) - logical first,xpol - character decoded*22 - character mycall*12,hiscall*12,hisgrid*6 - data first/.true./,jjjmin/1000/,jjjmax/-1000/ - data nutc0/-999/,nhz0/-9999999/ - save - -! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz - dt00=dt - call timer('filbig ',0) - call filbig(dd,NMAX,f0,newdat,nfsample,xpol,cx,cy,n5) -! NB: cx, cy have sample rate 96000*77125/5376000 = 1378.125 Hz - call timer('filbig ',1) - if(mode65.eq.0) goto 900 - sqa=0. - sqb=0. - do i=1,n5 - sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2 - if(xpol) sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2 - enddo - sqa=sqa/n5 - sqb=sqb/n5 - -! Find best DF, f1, f2, DT, and pol. Start by downsampling to 344.53125 Hz - if(xpol) then - z=cmplx(cos(dphi),sin(dphi)) - cy(:n5)=z*cy(:n5) !Adjust for cable length difference - endif -! Add some zeros at start of c5 arrays -- empirical fix for negative DT's - nadd=1089 - c5x(:nadd)=0. - call fil6521(cx,n5,c5x(nadd+1),n6) - if(xpol) then - c5y(:nadd)=0. - call fil6521(cy,n5,c5y(nadd+1),n6) - endif - n6=n6+nadd - - fsample=1378.125/4. - a(5)=dt00 - i0=nint((a(5)+0.5)*fsample) - 2 + nadd - if(i0.lt.1) then - write(13,*) 'i0 too small in decode1a:',i0,f0 - flush(13) - i0=1 - endif - nz=n6+1-i0 - -! We're looking only at sync tone here... so why not downsample by another -! factor of 1/8, say? Should be a significant execution speed-up. -! Best fit for DF, f1, f2, pol - call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,xpol,ndphi,a,ccfbest,dtbest) - - pol=a(4)/57.2957795 - aa=cos(pol) - bb=sin(pol) - sq0=aa*aa*sqa + bb*bb*sqb - sync2=3.7*ccfbest/sq0 - -! Apply AFC corrections to the time-domain signal -! Now we are back to using the 1378.125 Hz sample rate, enough to -! accommodate the full JT65C bandwidth. - - call twkfreq_xy(cx,cy,n5,a) - -! Compute spectrum at best polarization for each half symbol. -! Adding or subtracting a small number (e.g., 5) to j may make it decode.\ -! NB: might want to try computing full-symbol spectra (nfft=512, even for -! submodes B and C). - - nsym=126 - nfft=512 - j=(dt00+dtbest+2.685)*1378.125 - if(j.lt.0) j=0 - - -! Perhaps should try full-symbol-length FFTs even in B, C sub-modes? -! (Tried this, found no significant difference in decodes.) - - do k=1,nsym -! do n=1,mode65 - do n=1,1 - do i=1,nfft - j=min(j+1,NMAX/64) - c5a(i)=aa*cx(j) + bb*cy(j) - enddo - call four2a(c5a,nfft,1,1,1) - if(n.eq.1) then - do i=1,66 -! s2(i,k)=real(c5a(i))**2 + aimag(c5a(i))**2 - jj=i - if(mode65.eq.2) jj=2*i-1 - if(mode65.eq.4) jj=4*i-3 - s2(i,k)=real(c5a(jj))**2 + aimag(c5a(jj))**2 - enddo - else - do i=1,66 - s2(i,k)=s2(i,k) + real(c5a(i))**2 + aimag(c5a(i))**2 - enddo - endif - enddo - enddo - - flip=nflip - call timer('dec65b ',0) - call decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & - nqd,nkv,nhist,qual,decoded,s3,sy) - dt=dt00 + dtbest + 1.7 - call timer('dec65b ',1) - - if(nqd.eq.1 .and. decoded.eq.' ') then - nhz=1000*nkhz + ndf - ihzdiff=min(500,ntol) - if(nutc.ne.nutc0 .or. abs(nhz-nhz0).ge.ihzdiff) syncbest=0. - if(sync2.gt.0.99999*syncbest) then - nsave=nsave+1 - nsave=mod(nsave-1,64)+1 - npol=nint(57.296*pol) - - call s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) - syncbest=sync2 - nhz0=nhz - endif - nutc0=nutc - endif - -900 return -end subroutine decode1a diff --git a/q65w/libm65/decode65b.f90 b/q65w/libm65/decode65b.f90 deleted file mode 100644 index 9b3ebccda..000000000 --- a/q65w/libm65/decode65b.f90 +++ /dev/null @@ -1,48 +0,0 @@ -subroutine decode65b(s2,flip,mycall,hiscall,hisgrid,mode65,neme,ndepth, & - nqd,nkv,nhist,qual,decoded,s3,sy) - - real s2(66,126) - real s3(64,63),sy(63) - logical first,ltext - character decoded*22,deepmsg*22 - character mycall*12,hiscall*12,hisgrid*6 - common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) - data first/.true./ - save - - if(first) call setup65 - first=.false. - - do j=1,63 - k=mdat(j) !Points to data symbol - if(flip.lt.0.0) k=mdat2(j) - do i=1,64 - s3(i,j)=s2(i+2,k) - enddo - k=mdat2(j) !Points to data symbol - if(flip.lt.0.0) k=mdat(j) - sy(j)=s2(1,k) - enddo - - nadd=mode65 - call extract(s3,nadd,ncount,nhist,decoded,ltext) !Extract the message -! Suppress "birdie messages" and other garbage decodes: - if(decoded(1:7).eq.'000AAA ') ncount=-1 - if(decoded(1:7).eq.'0L6MWK ') ncount=-1 - if(flip.lt.0.0 .and. ltext) ncount=-1 - nkv=1 - if(ncount.lt.0) then - nkv=0 - decoded=' ' - endif - - qual=0. - if(ndepth.ge.1 .and. (nqd.eq.1 .or. flip.eq.1.0)) then - call deep65(s3,mode65,neme,flip,mycall,hiscall,hisgrid,deepmsg,qual) - if(nqd.ne.1 .and. qual.lt.10.0) qual=0.0 - if(ndepth.lt.2 .and. qual.lt.6.0) qual=0.0 - endif - if(nkv.eq.0 .and. qual.ge.1.0) decoded=deepmsg - - return -end subroutine decode65b diff --git a/q65w/libm65/deep65.f90 b/q65w/libm65/deep65.f90 deleted file mode 100644 index d684cd15a..000000000 --- a/q65w/libm65/deep65.f90 +++ /dev/null @@ -1,170 +0,0 @@ -subroutine deep65(s3,mode65,neme,flip,mycall,hiscall,hisgrid,decoded,qual) - - use timer_module, only: timer - parameter (MAXCALLS=10000,MAXRPT=63) - real s3(64,63) - character callsign*12,grid*4,message*22,hisgrid*6,c*1,ceme*3 - character*12 mycall,hiscall - character*22 decoded,bestmsg - character*22 testmsg(2*MAXCALLS + 2 + MAXRPT) - character*15 callgrid(MAXCALLS) - character*180 line - character*4 rpt(MAXRPT) - integer ncode(63,2*MAXCALLS + 2 + MAXRPT) - real pp(2*MAXCALLS + 2 + MAXRPT) - common/mrscom/ mrs(63),mrs2(63) - common/c3com/ mcall3a - data rpt/'-01','-02','-03','-04','-05', & - '-06','-07','-08','-09','-10', & - '-11','-12','-13','-14','-15', & - '-16','-17','-18','-19','-20', & - '-21','-22','-23','-24','-25', & - '-26','-27','-28','-29','-30', & - 'R-01','R-02','R-03','R-04','R-05', & - 'R-06','R-07','R-08','R-09','R-10', & - 'R-11','R-12','R-13','R-14','R-15', & - 'R-16','R-17','R-18','R-19','R-20', & - 'R-21','R-22','R-23','R-24','R-25', & - 'R-26','R-27','R-28','R-29','R-30', & - 'RO','RRR','73'/ - save - - if(mcall3a.eq.0) go to 30 - - call timer('deep65a ',0) - mcall3a=0 - rewind 23 - k=0 - icall=0 - do n=1,MAXCALLS - if(n.eq.1) then - callsign=hiscall - do i=4,12 - if(ichar(callsign(i:i)).eq.0) callsign(i:i)=' ' - enddo - grid=hisgrid(1:4) - if(ichar(grid(3:3)).eq.0) grid(3:3)=' ' - if(ichar(grid(4:4)).eq.0) grid(4:4)=' ' - else - read(23,1002,end=20) line -1002 format (A80) - if(line(1:4).eq.'ZZZZ') go to 20 - if(line(1:2).eq.'//') go to 10 - i1=index(line,',') - if(i1.lt.4) go to 10 - i2=index(line(i1+1:),',') - if(i2.lt.5) go to 10 - i2=i2+i1 - i3=index(line(i2+1:),',') - if(i3.lt.1) i3=index(line(i2+1:),' ') - i3=i2+i3 - callsign=line(1:i1-1) - grid=line(i1+1:i2-1) - ceme=line(i2+1:i3-1) - if(neme.eq.1 .and. ceme.ne.'EME') go to 10 - endif - - icall=icall+1 - j1=index(mycall,' ') - 1 - if(j1.le.-1) j1=12 - if(j1.lt.3) j1=6 - j2=index(callsign,' ') - 1 - if(j2.le.-1) j2=12 - if(j2.lt.3) j2=6 - j3=index(mycall,'/') ! j3>0 means compound mycall - j4=index(callsign,'/') ! j4>0 means compound hiscall - callgrid(icall)=callsign(1:j2) - - mz=1 -! Allow MyCall + HisCall + rpt (?) - if(n.eq.1 .and. j3.lt.1 .and. j4.lt.1 .and. callsign(1:6).ne.' ') & - mz=MAXRPT+1 - do m=1,mz - if(m.gt.1) grid=rpt(m-1) - if(j3.lt.1 .and.j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid - message=mycall(1:j1)//' '//callgrid(icall) - k=k+1 - testmsg(k)=message - call encode65(message,ncode(1,k)) - -! Insert CQ message - if(j4.lt.1) callgrid(icall)=callsign(1:j2)//' '//grid - message='CQ '//callgrid(icall) - k=k+1 - testmsg(k)=message - call encode65(message,ncode(1,k)) - enddo -10 continue - enddo - -20 continue - ntot=k - call timer('deep65a ',1) - -30 continue - call timer('deep65b ',0) - ref0=0. - do j=1,63 - ref0=ref0 + s3(mrs(j),j) - enddo - - p1=-1.e30 - do k=1,ntot - pp(k)=0. - if(k.ge.2 .and. k.le.64 .and. flip.lt.0.0) cycle -! Test all messages if flip=+1; skip the CQ messages if flip=-1. - if(flip.gt.0.0 .or. testmsg(k)(1:3).ne.'CQ ') then - sum=0. - ref=ref0 - do j=1,63 - i=ncode(j,k)+1 - sum=sum + s3(i,j) - if(i.eq.mrs(j)) ref=ref - s3(i,j) + s3(mrs2(j),j) - enddo - p=sum/ref - pp(k)=p - if(p.gt.p1) then - p1=p - ip1=k - bestmsg=testmsg(k) - endif - endif - enddo - - p2=-1.e30 - do i=1,ntot - if(pp(i).gt.p2 .and. testmsg(i).ne.bestmsg) p2=pp(i) - enddo - - if(mode65.eq.1) bias=max(1.12*p2,0.335) - if(mode65.eq.2) bias=max(1.08*p2,0.405) - if(mode65.ge.4) bias=max(1.04*p2,0.505) - - if(p2.eq.p1 .and. p1.ne.-1.e30) then - open(77,file='error.log',status='unknown',access='append') - write(77,*) p1,p2,ip1,bestmsg - close(77) - endif - - qual=100.0*(p1-bias) - - decoded=' ' - c=' ' - - if(qual.gt.1.0) then - if(qual.lt.6.0) c='?' - decoded=testmsg(ip1) - else - qual=0. - endif - decoded(22:22)=c - -! Make sure everything is upper case. - do i=1,22 - if(decoded(i:i).ge.'a' .and. decoded(i:i).le.'z') & - decoded(i:i)=char(ichar(decoded(i:i))-32) - enddo - call timer('deep65b ',1) - - return -end subroutine deep65 diff --git a/q65w/libm65/demod64a.f90 b/q65w/libm65/demod64a.f90 deleted file mode 100644 index 3b8ee03ce..000000000 --- a/q65w/libm65/demod64a.f90 +++ /dev/null @@ -1,77 +0,0 @@ -subroutine demod64a(s3,nadd,mrsym,mrprob,mr2sym,mr2prob,ntest,nlow) - -! Demodulate the 64-bin spectra for each of 63 symbols in a frame. - -! Parameters -! nadd number of spectra already summed -! mrsym most reliable symbol value -! mr2sym second most likely symbol value -! mrprob probability that mrsym was the transmitted value -! mr2prob probability that mr2sym was the transmitted value - - implicit real*8 (a-h,o-z) - real*4 s3(64,63) - real*8 fs(64) - integer mrsym(63),mrprob(63),mr2sym(63),mr2prob(63) - common/mrscom/ mrs(63),mrs2(63) - - afac=1.1 * float(nadd)**0.64 - scale=255.999 - -! Compute average spectral value - sum=0. - do j=1,63 - do i=1,64 - sum=sum+s3(i,j) - enddo - enddo - ave=sum/(64.*63.) - i1=1 !Silence warning - i2=1 - -! Compute probabilities for most reliable symbol values - do j=1,63 - s1=-1.e30 - fsum=0. - psum=0. - do i=1,64 - x=min(afac*s3(i,j)/ave,50.d0) - fs(i)=exp(x) - fsum=fsum+fs(i) - psum=psum + s3(i,j) - if(s3(i,j).gt.s1) then - s1=s3(i,j) - i1=i !Most reliable - endif - enddo - - s2=-1.e30 - do i=1,64 - if(i.ne.i1 .and. s3(i,j).gt.s2) then - s2=s3(i,j) - i2=i !Second most reliable - endif - enddo -! p1=fs(i1)/fsum !Normalized probabilities -! p2=fs(i2)/fsum - p1=s1/psum - p2=s2/psum - mrsym(j)=i1-1 - mr2sym(j)=i2-1 - mrprob(j)=scale*p1 - mr2prob(j)=scale*p2 - mrs(j)=i1 - mrs2(j)=i2 - enddo - - sum=0. - nlow=0 - do j=1,63 - sum=sum+mrprob(j) - if(mrprob(j).le.5) nlow=nlow+1 - enddo -! ntest=sum/63 - ntest=sum - - return -end subroutine demod64a diff --git a/q65w/libm65/display.f90 b/q65w/libm65/display.f90 deleted file mode 100644 index 158b57c53..000000000 --- a/q65w/libm65/display.f90 +++ /dev/null @@ -1,183 +0,0 @@ -subroutine display(nkeep,ftol) - - parameter (MAXLINES=400,MX=400,MAXCALLS=500) - integer indx(MAXLINES),indx2(MX) - character*83 line(MAXLINES),line2(MX),line3(MAXLINES) - character out*52,out0*52,cfreq0*3,livecq*58 - character*6 callsign,callsign0 - character*12 freqcall(MAXCALLS) - real freqkHz(MAXLINES) - integer utc(MAXLINES),utc2(MX),utcz - real*8 f0 - save - - out0=' ' - rewind(26) - - do i=1,MAXLINES - read(26,1010,end=10) line(i) -1010 format(a77) - read(line(i),1020) f0,ndf,nh,nm -1020 format(f8.3,i5,25x,i3,i2) - utc(i)=60*nh + nm - freqkHz(i)=1000.d0*(f0-144.d0) + 0.001d0*ndf - enddo - -10 backspace(26) - nz=i-1 - utcz=utc(nz) - nz=nz-1 - if(nz.lt.1) go to 999 - nquad=max(nkeep/4,3) - do i=1,nz - nage=utcz-utc(i) - if(nage.lt.0) nage=nage+1440 - iage=nage/nquad - write(line(i)(73:74),1021) iage -1021 format(i2) - enddo - - nage=utcz-utc(1) - if(nage.lt.0) nage=nage+1440 - if(nage.gt.nkeep) then - do i=1,nz - nage=utcz-utc(i) - if(nage.lt.0) nage=nage+1440 - if(nage.le.nkeep) go to 20 - enddo -20 i0=i - nz=nz-i0+1 - rewind(26) - if(nz.lt.1) go to 999 - do i=1,nz - j=i+i0-1 - line(i)=line(j) - utc(i)=utc(j) - freqkHz(i)=freqkHz(j) - write(26,1022) line(i) -1022 format(a77) - enddo - endif - - call flush(26) - call indexx(freqkHz,nz,indx) - - nstart=1 - k3=0 - k=1 - m=indx(1) - if(m.lt.1 .or. m.gt.MAXLINES) then - print*,'Error in display.f90: ',nz,m - m=1 - endif - line2(1)=line(m) - utc2(1)=utc(m) - do i=2,nz - j0=indx(i-1) - j=indx(i) - if(freqkHz(j)-freqkHz(j0).gt.2.0*ftol) then - if(nstart.eq.0) then - k=k+1 - line2(k)="" - utc2(k)=-1 - endif - kz=k - if(nstart.eq.1) then - call indexx(float(utc2(1:kz)),kz,indx2) - k3=0 - do k=1,kz - k3=min(k3+1,400) - line3(k3)=line2(indx2(k)) - enddo - nstart=0 - else - call indexx(float(utc2(1:kz)),kz,indx2) - do k=1,kz - k3=min(k3+1,400) - line3(k3)=line2(indx2(k)) - enddo - endif - k=0 - endif - if(i.eq.nz) then - k=k+1 - line2(k)="" - utc2(k)=-1 - endif - k=k+1 - line2(k)=line(j) - utc2(k)=utc(j) - j0=j - enddo - kz=k - call indexx(float(utc2(1:kz)),kz,indx2) - do k=1,kz - k3=min(k3+1,400) - line3(k3)=line2(indx2(k)) - enddo - - rewind 19 - rewind 20 - cfreq0=' ' - nc=0 - callsign0=' ' - do k=1,k3 - out=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & - line3(k)(35:38)//line3(k)(46:74) - if(out(1:3).ne.' ') then - cfreq0=out(1:3) - livecq=line3(k)(6:13)//line3(k)(28:31)//line3(k)(39:45)// & - line3(k)(23:27)//line3(k)(35:38)//line3(k)(46:70)// & - line3(k)(73:77) - if(livecq(56:56).eq.':') livecq(56:58)=' '//livecq(56:57) - if(index(livecq,' CQ ').gt.0 .or. index(livecq,' QRZ ').gt.0 .or. & - index(livecq,' QRT ').gt.0 .or. index(livecq,' CQV ').gt.0 .or. & - index(livecq,' CQH ').gt.0) write(19,1029) livecq -1029 format(a58) - -! Suppress listing duplicate (same time, decoded message, and frequency) - if(out(14:17).ne.out0(14:17) .or. out(26:50).ne.out0(26:50) .or. & - out(1:3).ne.out0(1:3)) then -!### -! write(*,1030) out !Messages -!1030 format('@',a52) -!### - out0=out - endif - - i1=index(out(26:),' ') - callsign=out(i1+26:) - i2=index(callsign,' ') - if(i2.gt.1) callsign(i2:)=' ' - if(callsign.ne.' ' .and. callsign.ne.callsign0) then - len=i2-1 - if(len.lt.0) len=6 - if(len.ge.4) then !Omit short "callsigns" - if(nc.lt.MAXCALLS) nc=nc+1 - freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) - callsign0=callsign - endif - endif - if(callsign.ne.' ' .and. callsign.eq.callsign0) then - freqcall(nc)=cfreq0//' '//callsign//line3(k)(73:74) - endif - endif - enddo - flush(19) - if(nc.lt.MAXCALLS) nc=nc+1 - freqcall(nc)=' ' - if(nc.lt.MAXCALLS) nc=nc+1 - freqcall(nc)=' ' - freqcall(nc+1)=' ' - freqcall(nc+2)=' ' - -!### -! do i=1,nc -! write(*,1042) freqcall(i) !Band Map -!1042 format('&',a12) -! enddo -!### - -999 continue - return -end subroutine display diff --git a/q65w/libm65/dpol.f90 b/q65w/libm65/dpol.f90 deleted file mode 100644 index 3f8085c0a..000000000 --- a/q65w/libm65/dpol.f90 +++ /dev/null @@ -1,41 +0,0 @@ -real function dpol(mygrid,hisgrid) - -! Compute spatial polartzation offset in degrees for the present -! time, between two specified grid locators. - - character*6 MyGrid,HisGrid - real lat,lon,LST - character cdate*8,ctime2*10,czone*5 - integer it(8) - data rad/57.2957795/ - - call date_and_time(cdate,ctime2,czone,it) - nyear=it(1) - month=it(2) - nday=it(3) - nh=it(5)-it(4)/60 - nm=it(6) - ns=it(7) - uth=nh + nm/60.0 + ns/3600.0 - - call grid2deg(MyGrid,lon,lat) - call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & - LST,HA,AzMoon,ElMoon,vr,dist) - xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & - cos(AzMoon/rad)*sin(ElMoon/rad) - yy=cos(lat/rad)*sin(AzMoon/rad) - poloffset1=rad*atan2(yy,xx) - - call grid2deg(hisGrid,lon,lat) - call MoonDop(nyear,month,nday,uth,-lon,lat,RAMoon,DecMoon, & - LST,HA,AzMoon,ElMoon,vr,dist) - xx=sin(lat/rad)*cos(ElMoon/rad) - cos(lat/rad)* & - cos(AzMoon/rad)*sin(ElMoon/rad) - yy=cos(lat/rad)*sin(AzMoon/rad) - poloffset2=rad*atan2(yy,xx) - - dpol=mod(poloffset2-poloffset1+720.0,180.0) - if(dpol.gt.90.0) dpol=dpol-180.0 - - return -end function dpol diff --git a/q65w/libm65/encode65.f90 b/q65w/libm65/encode65.f90 deleted file mode 100644 index 920d9c841..000000000 --- a/q65w/libm65/encode65.f90 +++ /dev/null @@ -1,14 +0,0 @@ -subroutine encode65(message,sent) - - use packjt - character message*22 - integer dgen(12) - integer sent(63) - - call packmsg(message,dgen,itype) - call rs_encode(dgen,sent) - call interleave63(sent,1) - call graycode(sent,63,1) - - return -end subroutine encode65 diff --git a/q65w/libm65/extract.f90 b/q65w/libm65/extract.f90 deleted file mode 100644 index 4d8af58a9..000000000 --- a/q65w/libm65/extract.f90 +++ /dev/null @@ -1,136 +0,0 @@ -subroutine extract(s3,nadd,ncount,nhist,decoded,ltext) - - use packjt - use timer_module, only: timer - real s3(64,63) - character decoded*22 - integer dat4(12) - integer mrsym(63),mr2sym(63),mrprob(63),mr2prob(63) - logical first,ltext - integer correct(63),itmp(63) - integer param(0:8) - integer h0(0:11),d0(0:11) - real r0(0:11) - common/test001/s3a(64,63),mrs(63),mrs2(63) !### TEST ONLY ### - -! 0 1 2 3 4 5 6 7 8 9 10 11 - data h0/41,42,43,43,44,45,46,47,48,48,49,49/ - data d0/71,72,73,74,76,77,78,80,81,82,83,83/ -! 0 1 2 3 4 5 6 7 8 9 10 11 - data r0/0.70,0.72,0.74,0.76,0.78,0.80,0.82,0.84,0.86,0.88,0.90,0.90/ - - data first/.true./,nsec1/0/ - save - - nfail=0 - call pctile(s3,4032,50,base) ! ### or, use ave from demod64a - s3=s3/base - s3a=s3 -1 call demod64a(s3,nadd,mrsym,mrprob,mr2sym,mr2prob,ntest,nlow) -! if(ntest.lt.50 .or. nlow.gt.20) then -! ncount=-999 !Flag bad data -! go to 900 -! endif - call chkhist(mrsym,nhist,ipk) - - if(nhist.ge.20) then - nfail=nfail+1 - call pctile(s3,4032,50,base) ! ### or, use ave from demod64a - s3(ipk,1:63)=base - if(nfail.gt.30) then - decoded=' ' - ncount=-1 - go to 900 - endif - go to 1 - endif - - mrs=mrsym - mrs2=mr2sym - - call graycode(mrsym,63,-1) - call interleave63(mrsym,-1) - call interleave63(mrprob,-1) - - call graycode(mr2sym,63,-1) - call interleave63(mr2sym,-1) - call interleave63(mr2prob,-1) - - ntrials=10000 - naggressive=10 - - ntry=0 - param=0 - - call timer('ftrsd ',0) - call ftrsd2(mrsym,mrprob,mr2sym,mr2prob,ntrials,correct,param,ntry) - call timer('ftrsd ',1) - ncandidates=param(0) - nhard=param(1) - nsoft=param(2) - nerased=param(3) - rtt=0.001*param(4) - ntotal=param(5) - qual=0.001*param(7) - nd0=81 - r00=0.87 - if(naggressive.eq.10) then - nd0=83 - r00=0.90 - endif - if(ntotal.le.nd0 .and. rtt.le.r00) nft=1 - n=naggressive - if(nhard.gt.50) nft=0 - if(nhard.gt.h0(n)) nft=0 - if(ntotal.gt.d0(n)) nft=0 - if(rtt.gt.r0(n)) nft=0 - - ncount=-1 - decoded=' ' - ltext=.false. - if(nft.gt.0) then -! Turn the corrected symbol array into channel symbols for subtraction; -! pass it back to jt65a via common block "chansyms65". - do i=1,12 - dat4(i)=correct(13-i) - enddo - do i=1,63 - itmp(i)=correct(64-i) - enddo - correct(1:63)=itmp(1:63) - call interleave63(correct,1) - call graycode65(correct,63,1) - call unpackmsg(dat4,decoded) !Unpack the user message - ncount=0 - if(iand(dat4(10),8).ne.0) ltext=.true. - endif -900 continue - if(nft.eq.1 .and. nhard.lt.0) decoded=' ' -! write(81,3001) naggressive,ncandidates,nhard,ntotal,rtt,qual,decoded -!3001 format(i2,i6,i3,i4,2f8.2,2x,a22) - - return -end subroutine extract - -subroutine getpp(workdat,p) - - integer workdat(63) - integer a(63) - common/test001/s3a(64,63),mrs(63),mrs2(63) - - a(1:63)=workdat(63:1:-1) - call interleave63(a,1) - call graycode(a,63,1) - - psum=0. - do j=1,63 - i=a(j)+1 - x=s3a(i,j) - s3a(i,j)=0. - psum=psum + x - s3a(i,j)=x - enddo - p=psum/63.0 - - return -end subroutine getpp diff --git a/q65w/libm65/fchisq.f90 b/q65w/libm65/fchisq.f90 deleted file mode 100644 index 7d0305831..000000000 --- a/q65w/libm65/fchisq.f90 +++ /dev/null @@ -1,77 +0,0 @@ -real function fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax) - - use timer_module, only: timer - parameter (NMAX=60*96000) !Samples per 60 s - complex cx(npts),cy(npts) - real a(5) - complex w,wstep,za,zb,z - real ss(3000) - complex csx(0:NMAX/64),csy(0:NMAX/64) - data twopi/6.283185307/a1,a2,a3/99.,99.,99./ - save - - call timer('fchisq ',0) - baud=11025.0/4096.0 - nsps=nint(fsample/baud) !Samples per symbol - nsph=nsps/2 !Samples per half-symbol - ndiv=16 !Output ss() steps per symbol - nout=ndiv*npts/nsps - dtstep=1.0/(ndiv*baud) !Time per output step - - if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then - a1=a(1) - a2=a(2) - a3=a(3) - -! Mix and integrate the complex X and Y signals - csx(0)=0. - csy(0)=0. - w=1.0 - x0=0.5*(npts+1) - s=2.0/npts - do i=1,npts - x=s*(i-x0) - if(mod(i,100).eq.1) then - p2=1.5*x*x - 0.5 -! p3=2.5*(x**3) - 1.5*x -! p4=4.375*(x**4) - 3.75*(x**2) + 0.375 - dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) - wstep=cmplx(cos(dphi),sin(dphi)) - endif - w=w*wstep - csx(i)=csx(i-1) + w*cx(i) - csy(i)=csy(i-1) + w*cy(i) - enddo - endif - -! Compute 1/2-symbol powers at 1/16-symbol steps. - fac=1.e-4 - pol=a(4)/57.2957795 - aa=cos(pol) - bb=sin(pol) - - do i=1,nout - j=i*nsps/ndiv - k=j-nsph - ss(i)=0. - if(k.ge.1) then - za=csx(j)-csx(k) - zb=csy(j)-csy(k) - z=aa*za + bb*zb - ss(i)=fac*(real(z)**2 + aimag(z)**2) - endif - enddo - - ccfmax=0. - call timer('ccf2 ',0) - call ccf2(ss,nout,nflip,ccf,lagpk) - call timer('ccf2 ',1) - if(ccf.gt.ccfmax) then - ccfmax=ccf - dtmax=lagpk*dtstep - endif - fchisq=-ccfmax - call timer('fchisq ',1) - - return -end function fchisq diff --git a/q65w/libm65/fil6521.f90 b/q65w/libm65/fil6521.f90 deleted file mode 100644 index f588d0c15..000000000 --- a/q65w/libm65/fil6521.f90 +++ /dev/null @@ -1,44 +0,0 @@ -subroutine fil6521(c1,n1,c2,n2) - -! FIR lowpass filter designed using ScopeFIR - -! Pass #1 Pass #2 -!----------------------------------------------- -! fsample (Hz) 1378.125 Input sample rate -! Ntaps 21 Number of filter taps -! fc (Hz) 40 Cutoff frequency -! fstop (Hz) 172.266 Lower limit of stopband -! Ripple (dB) 0.1 Ripple in passband -! Stop Atten (dB) 38 Stopband attenuation -! fout (Hz) 344.531 Output sample rate - - parameter (NTAPS=21) - parameter (NH=(NTAPS-1)/2) - parameter (NDOWN=4) !Downsample ratio = 1/4 - complex c1(n1) - complex c2(n1/NDOWN) - -! Filter coefficients: - real a(-NH:NH) - data a/ & - -0.011958606980,-0.013888627387,-0.015601306443,-0.010602249570, & - 0.003804023436, 0.028320058273, 0.060903935217, 0.096841904411, & - 0.129639871228, 0.152644580853, 0.160917511283, 0.152644580853, & - 0.129639871228, 0.096841904411, 0.060903935217, 0.028320058273, & - 0.003804023436,-0.010602249570,-0.015601306443,-0.013888627387, & - -0.011958606980/ - - n2=(n1-NTAPS+NDOWN)/NDOWN - k0=NH-NDOWN+1 - -! Loop over all output samples - do i=1,n2 - c2(i)=0. - k=k0 + NDOWN*i - do j=-NH,NH - c2(i)=c2(i) + c1(j+k)*a(j) - enddo - enddo - - return -end subroutine fil6521 diff --git a/q65w/libm65/fmtmsg.f90 b/q65w/libm65/fmtmsg.f90 deleted file mode 100644 index 2ceb81554..000000000 --- a/q65w/libm65/fmtmsg.f90 +++ /dev/null @@ -1,21 +0,0 @@ -subroutine fmtmsg(msg,iz) - - character*22 msg - -! Convert all letters to upper case - iz=22 - do i=1,22 - if(msg(i:i).ge.'a' .and. msg(i:i).le.'z') & - msg(i:i)= char(ichar(msg(i:i))+ichar('A')-ichar('a')) - if(msg(i:i).ne.' ') iz=i - enddo - - do iter=1,5 !Collapse multiple blanks into one - ib2=index(msg(1:iz),' ') - if(ib2.lt.1) go to 100 - msg=msg(1:ib2)//msg(ib2+2:) - iz=iz-1 - enddo - -100 return -end subroutine fmtmsg diff --git a/q65w/libm65/gen65.f90 b/q65w/libm65/gen65.f90 deleted file mode 100644 index f09d0868a..000000000 --- a/q65w/libm65/gen65.f90 +++ /dev/null @@ -1,99 +0,0 @@ -subroutine gen65(message,mode65,samfac,nsendingsh,msgsent,iwave,nwave) - -! Encodes a JT65 message into a wavefile. -! Executes in 17 ms on opti-745. - - use packjt - - parameter (NMAX=2*60*11025) !Max length of wave file - character*22 message !Message to be generated - character*22 msgsent !Message as it will be received - character*3 cok !' ' or 'OOO' - real*8 dt,phi,f,f0,dfgen,dphi,twopi,samfac - integer*2 iwave(NMAX) !Generated wave file - integer dgen(12) - integer sent(63) - logical first - integer nprc(126) - real pr(126) - data nprc/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & - 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & - 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & - 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & - 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & - 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & - 1,1,1,1,1,1/ - data twopi/6.283185307179586476d0/,first/.true./ - save - - if(first) then - do i=1,126 - pr(i)=2*nprc(i)-1 - enddo - first=.false. - endif - - call chkmsg(message,cok,nspecial,flip) - if(nspecial.eq.0) then - call packmsg(message,dgen,itype) !Pack message into 72 bits - nsendingsh=0 - if(iand(dgen(10),8).ne.0) nsendingsh=-1 !Plain text flag - - call rs_encode(dgen,sent) - call interleave63(sent,1) !Apply interleaving - call graycode(sent,63,1) !Apply Gray code - nsym=126 !Symbols per transmission - nsps=4096 - else - nsym=32 - nsps=16384 - nsendingsh=1 !Flag for shorthand message - endif - if(mode65.eq.0) go to 900 - -! Set up necessary constants - dt=1.d0/(samfac*11025.d0) - f0=118*11025.d0/1024 - dfgen=mode65*11025.d0/4096.d0 - phi=0.d0 - dphi=twopi*dt*f0 - i=0 - k=0 - do j=1,nsym - if(message(1:5).ne.'@TUNE') then - f=f0 - if(nspecial.ne.0 .and. mod(j,2).eq.0) f=f0+10*nspecial*dfgen - if(nspecial.eq.0 .and. flip*pr(j).lt.0.0) then - k=k+1 - f=f0+(sent(k)+2)*dfgen - endif - dphi=twopi*dt*f - endif - do ii=1,nsps - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - i=i+1 - iwave(2*i-1)=32767.0*cos(xphi) - iwave(2*i)=32767.0*sin(xphi) - enddo - enddo - - iwave(2*nsym*nsps+1:)=0 - nwave=2*nsym*nsps + 5512 - call unpackmsg(dgen,msgsent) - if(flip.lt.0.0) then - do i=22,1,-1 - if(msgsent(i:i).ne.' ') goto 10 - enddo -10 msgsent=msgsent(1:i)//' OOO' - endif - - if(nsendingsh.eq.1) then - if(nspecial.eq.2) msgsent='RO' - if(nspecial.eq.3) msgsent='RRR' - if(nspecial.eq.4) msgsent='73' - endif - -900 return -end subroutine gen65 diff --git a/q65w/libm65/gen_q65_cwave.f90 b/q65w/libm65/gen_q65_cwave.f90 deleted file mode 100644 index 0e3d00074..000000000 --- a/q65w/libm65/gen_q65_cwave.f90 +++ /dev/null @@ -1,52 +0,0 @@ -subroutine gen_q65_cwave(msg,ntxfreq,ntone_spacing,msgsent,cwave,nwave) - -! Encodes a Q65 message to yield complex cwave() at fsample = 96000 Hz - - use packjt - use q65_encoding - parameter (NMAX=60*96000) - character*22 msg - character*22 msgsent !Message as it will be received - character*37 msg37 - real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym - complex cwave(NMAX) - integer codeword(65),itone(85) - integer icos7(0:6) - data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array - data twopi/6.283185307179586476d0/ - save - - msgsent=msg - msg37='' - msg37(1:22)=msg - call get_q65_tones(msg37,codeword,itone) - -! Set up necessary constants - nsym=85 - tsym=7200.d0/12000.d0 - dt=1.d0/96000.d0 - f0=ntxfreq - dfgen=ntone_spacing*12000.d0/7200.d0 - phi=0.d0 - dphi=twopi*dt*f0 - i=0 - nwave=85*7200*96000.d0/12000.d0 - t=0.d0 - j0=0 - do i=1,nwave - t=t+dt - j=t/tsym + 1 - if(j.gt.85) exit - if(j.ne.j0) then - f=f0 + itone(j)*dfgen - dphi=twopi*dt*f - j0=j - endif - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - cwave(i)=cmplx(cos(xphi),-sin(xphi)) - enddo - -999 return -end subroutine gen_q65_cwave diff --git a/q65w/libm65/gen_q65_wave.f90 b/q65w/libm65/gen_q65_wave.f90 deleted file mode 100644 index bd91c8ddb..000000000 --- a/q65w/libm65/gen_q65_wave.f90 +++ /dev/null @@ -1,54 +0,0 @@ -subroutine gen_q65_wave(msg,ntxfreq,mode65,msgsent,iwave,nwave) - -! Encodes a Q65 message to yield complex iwave() at fsample = 11025 Hz - - use packjt - use q65_encoding - parameter (NMAX=2*60*11025) - character*22 msg - character*22 msgsent !Message as it will be received - character*37 msg37 - real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,tsym - integer codeword(65),itone(85) - integer*2 iwave(NMAX) - integer icos7(0:6) - data icos7/2,5,6,0,4,1,3/ !Defines a 7x7 Costas array - data twopi/6.283185307179586476d0/ - save - - msgsent=msg - msg37='' - msg37(1:22)=msg - call get_q65_tones(msg37,codeword,itone) - -! Set up necessary constants - nsym=85 - tsym=7200.d0/12000.d0 - dt=1.d0/11025.d0 - f0=ntxfreq - ndf=2**(mode65-1) - dfgen=ndf*12000.d0/7200.d0 - phi=0.d0 - dphi=twopi*dt*f0 - i=0 - iz=85*7200*11025.d0/12000.d0 - t=0.d0 - j0=0 - do i=1,iz - t=t+dt - j=t/tsym + 1.0 - if(j.ne.j0) then - f=f0 + itone(j)*dfgen - dphi=twopi*dt*f - j0=j - endif - phi=phi+dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - iwave(2*i-1)=32767.0*cos(xphi) - iwave(2*i)=32767.0*sin(xphi) - enddo - nwave=2*iz - -999 return -end subroutine gen_q65_wave diff --git a/q65w/libm65/graycode65.f90 b/q65w/libm65/graycode65.f90 deleted file mode 100644 index bb2c669ce..000000000 --- a/q65w/libm65/graycode65.f90 +++ /dev/null @@ -1,9 +0,0 @@ -subroutine graycode65(dat,n,idir) - - integer dat(n) - do i=1,n - dat(i)=igray(dat(i),idir) - enddo - - return -end subroutine graycode65 diff --git a/q65w/libm65/jt65code.f90 b/q65w/libm65/jt65code.f90 deleted file mode 100644 index b232fcdd6..000000000 --- a/q65w/libm65/jt65code.f90 +++ /dev/null @@ -1,47 +0,0 @@ -program JT65code - -! Provides examples of message packing, bit and symbol ordering, -! Reed Solomon encoding, and other necessary details of the JT65 -! protocol. - - character*22 msg0,msg,decoded,cok*3 - integer dgen(12),sent(63),recd(12),era(51) - - nargs=iargc() - if(nargs.ne.1) then - print*,'Usage: JT65code "message"' - go to 999 - endif - - call getarg(1,msg0) !Get message from command line - msg=msg0 - - call chkmsg(msg,cok,nspecial,flip) !See if it includes "OOO" report - if(nspecial.gt.0) then !or is a shorthand message - write(*,1010) -1010 format('Shorthand message.') - go to 999 - endif - - call packmsg(msg,dgen) !Pack message into 72 bits - write(*,1020) msg0 -1020 format('Message: ',a22) !Echo input message - if(iand(dgen(10),8).ne.0) write(*,1030) !Is plain text bit set? -1030 format('Plain text.') - write(*,1040) dgen -1040 format('Packed message, 6-bit symbols: ',12i3) !Display packed symbols - - call rs_encode(dgen,sent) !RS encode - call interleave63(sent,1) !Interleave channel symbols - call graycode(sent,63,1) !Apply Gray code - write(*,1050) sent -1050 format('Channel symbols, including FEC:'/(i5,20i3)) - - call graycode(sent,63,-1) - call interleave63(sent,-1) - call rs_decode(sent,era,0,recd,nerr) - call unpackmsg(recd,decoded) !Unpack the user message - write(*,1060) decoded,cok -1060 format('Decoded message: ',a22,2x,a3) - -999 end program JT65code diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index 1ddc624e9..c1b86bd16 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -211,8 +211,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & if(npol.lt.0) npol=npol+180 endif - call txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) - cmode='#A' if(mode65.eq.2) cmode='#B' if(mode65.eq.4) cmode='#C' diff --git a/q65w/libm65/mapsim.f90 b/q65w/libm65/mapsim.f90 deleted file mode 100644 index e58485f6c..000000000 --- a/q65w/libm65/mapsim.f90 +++ /dev/null @@ -1,229 +0,0 @@ -program mapsim - -! Generate simulated data for testing of MAP65 - - parameter (NMAX=60*96000) - real*4 d4(4,NMAX) !Floating-point data - integer*2 id4(4,NMAX) !i*2 data, dual polarization - integer*2 id2(2,NMAX) !i*2 data, single polarization - complex cwave(NMAX) !Generated complex waveform (no noise) - complex z,zx,zy - real*8 fcenter,fsample,samfac,f,dt,twopi,phi,dphi - logical bq65 - character msg0*22,message*22,msgsent*22,arg*8,fname*11,mode*2 - character*16 msg_list(60) - data msg_list/ & - 'W1AAA K2BBB EM00','W2CCC K3DDD EM01','W3EEE K4FFF EM02', & - 'W5GGG K6HHH EM03','W7III K8JJJ EM04','W9KKK K0LLL EM05', & - 'G0MMM F1NNN JN06','G2OOO F3PPP JN07','G4QQQ F5RRR JN08', & - 'G6SSS F7TTT JN09','W1XAA K2XBB EM10','W2XCC K3XDD EM11', & - 'W3XEE K4XFF EM12','W5XGG K6XHH EM13','W7XII K8XJJ EM14', & - 'W9XKK K0XLL EM15','G0XMM F1XNN JN16','G2XOO F3XPP JN17', & - 'G4XQQ F5XRR JN18','G6XSS F7XTT JN19','W1YAA K2YBB EM20', & - 'W2YCC K3YDD EM21','W3YEE K4YFF EM22','W5YGG K6YHH EM23', & - 'W7YII K8YJJ EM24','W9YKK K0YLL EM25','G0YMM F1YNN JN26', & - 'G2YOO F3YPP JN27','G4YQQ F5YRR JN28','G6YSS F7YTT JN29', & - 'W1ZAA K2ZBB EM30','W2ZCC K3ZDD EM31','W3ZEE K4ZFF EM32', & - 'W5ZGG K6ZHH EM33','W7ZII K8ZJJ EM34','W9ZKK K0ZLL EM35', & - 'G0ZMM F1ZNN JN36','G2ZOO F3ZPP JN37','G4ZQQ F5ZRR JN38', & - 'G6ZSS F7ZTT JN39','W1AXA K2BXB EM40','W2CXC K3DXD EM41', & - 'W3EXE K4FXF EM42','W5GXG K6HXH EM43','W7IXI K8JXJ EM44', & - 'W9KXK K0LXL EM45','G0MXM F1NXN JN46','G2OXO F3PXP JN47', & - 'G4QXQ F5RXR JN48','G6SXS F7TXT JN49','W1AYA K2BYB EM50', & - 'W2CYC K3DYD EM51','W3EYE K4FYF EM52','W5GYG K6HYH EM53', & - 'W7IYI K8JYJ EM54','W9KYK K0LYL EM55','G0MYM F1NYN JN56', & - 'G2OYO F3PYP JN57','G4QYQ F5RYR JN58','G6SYS F7TYT JN59'/ - - nargs=iargc() - if(nargs.ne.10) then - print*,'Usage: mapsim "message" mode DT fa fb nsigs pol fDop SNR nfiles' - print*,'Example: mapsim "CQ K1ABC FN42" B 2.5 -20 20 21 45 0.0 -20 1' - print*,' ' - print*,' mode = A B C for JT65; QA-QE for Q65-60A' - print*,' fa = lowest freq in kHz, relative to center' - print*,' fb = highest freq in kHz, relative to center' - print*,' message = "list" to use callsigns from list' - print*,' pol = -1 to generate a range of polarization angles.' - print*,' SNR = 0 to generate a range of SNRs.' - go to 999 - endif - - call getarg(1,msg0) - call getarg(2,mode) !JT65 sub-mode (A B C QA-QE) - call getarg(3,arg) - read(arg,*) dt0 !Time delay - call getarg(4,arg) - read(arg,*) fa !Lowest freq (kHz, relative to fcenter) - call getarg(5,arg) - read(arg,*) fb !Highest freq - call getarg(6,arg) - read(arg,*) nsigs !Number of signals in each file - call getarg(7,arg) - read(arg,*) npol !Polarization in degrees - pol=npol - call getarg(8,arg) - read(arg,*) fdop !Doppler spread - call getarg(9,arg) - read(arg,*) snrdb !S/N - call getarg(10,arg) - read(arg,*) nfiles !Number of files - - message=msg0 !Transmitted message - rmsdb=25. - rms=10.0**(0.05*rmsdb) - fcenter=144.125d0 !Center frequency (MHz) - fsample=96000.d0 !Sample rate (Hz) - dt=1.d0/fsample !Sample interval (s) - twopi=8.d0*atan(1.d0) - rad=360.0/twopi - samfac=1.d0 - bq65=(mode(1:1).eq.'Q') - ntone_spacing=1 - ntxfreq=1270 - fac=1.0/32767.0 - if(mode(1:1).eq.'B' .or. mode(2:2).eq.'B') ntone_spacing=2 - if(mode(1:1).eq.'C' .or. mode(2:2).eq.'C') ntone_spacing=4 - if(mode(2:2).eq.'D') ntone_spacing=8 - if(mode(2:2).eq.'E') ntone_spacing=16 - npts=NMAX - - write(*,1000) -1000 format('File N Mode DT freq pol fDop SNR Message'/68('-')) - - do ifile=1,nfiles - ilist=0 - nmin=ifile-1 - if(mode(2:2).eq.' ') nmin=2*nmin - write(fname,1002) nmin !Create the output filenames -1002 format('000000_',i4.4) - open(10,file=fname//'.iq',access='stream',status='unknown') - open(11,file=fname//'.tf2',access='stream',status='unknown') - - call noisegen(d4,npts) !Generate Gaussuian noise - - if(msg0(1:4).ne.'list') then - if(bq65) then - call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & - cwave,nwave) - else - call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & - cwave,nwave) - endif - endif - - if(fdop.gt.0.0) call dopspread(cwave,fdop) - - do isig=1,nsigs - - if(msg0(1:4).eq.'list') then - ilist=ilist+1 - message=msg_list(ilist) - if(bq65) then - call gen_q65_cwave(message,ntxfreq,ntone_spacing,msgsent, & - cwave,nwave) - else - call cgen65(message,ntone_spacing,samfac,nsendingsh,msgsent, & - cwave,nwave) - endif - endif - - if(npol.lt.0) pol=(isig-1)*180.0/nsigs - a=cos(pol/rad) - b=sin(pol/rad) - f=1000.0*(fa+fb)/2.0 - if(nsigs.gt.1) f=1000.0*(fa + (isig-1)*(fb-fa)/(nsigs-1.0)) - dphi=twopi*f*dt + 0.5*twopi - - snrdbx=snrdb - if(snrdb.eq.0.0) snrdbx=-15.0 - 15.0*(isig-1.0)/nsigs - sig=sqrt(2.2*2500.0/96000.0) * 10.0**(0.05*snrdbx) - write(*,1020) ifile,isig,mode,dt0,0.001*f,nint(pol),fDop,snrdbx,msgsent -1020 format(i3,i3,2x,a2,f6.2,f8.3,i5,2f7.1,2x,a22) - - phi=0. -! i0=fsample*(3.5d0+0.05d0*(isig-1)) - i0=fsample*(1.d0 + dt0) - do i=1,nwave - phi=phi + dphi - if(phi.lt.-twopi) phi=phi+twopi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - z=sig*cwave(i)*cmplx(cos(xphi),-sin(xphi)) - zx=a*z - zy=b*z - j=i+i0 - d4(1,j)=d4(1,j) + real(zx) - d4(2,j)=d4(2,j) + aimag(zx) - d4(3,j)=d4(3,j) + real(zy) - d4(4,j)=d4(4,j) + aimag(zy) - enddo - enddo - - do i=1,npts - id4(1,i)=nint(rms*d4(1,i)) - id4(2,i)=nint(rms*d4(2,i)) - id4(3,i)=nint(rms*d4(3,i)) - id4(4,i)=nint(rms*d4(4,i)) - id2(1,i)=id4(1,i) - id2(2,i)=id4(2,i) - enddo - - write(10) fcenter,id2(1:2,1:npts) - write(11) fcenter,id4(1:4,1:npts) - close(10) - close(11) - enddo - -999 end program mapsim - -subroutine dopspread(cwave,fspread) - - parameter (NMAX=60*96000) - parameter (NFFT=NMAX,NH=NFFT/2) - complex cwave(NMAX) - complex cspread(0:NMAX-1) - - twopi=8.0*atan(1.0) - df=96000.0/nfft - cspread(0)=1.0 - cspread(NH)=0. - b=6.0 !Use truncated Lorenzian shape for fspread - do i=1,NH - f=i*df - x=b*f/fspread - z=0. - a=0. - if(x.lt.3.0) then !Cutoff beyond x=3 - a=sqrt(1.111/(1.0+x*x)-0.1) !Lorentzian amplitude - phi1=twopi*rran() !Random phase - z=a*cmplx(cos(phi1),sin(phi1)) - endif - cspread(i)=z - z=0. - if(x.lt.3.0) then !Same thing for negative freqs - phi2=twopi*rran() - z=a*cmplx(cos(phi2),sin(phi2)) - endif - cspread(nfft-i)=z - enddo - - call four2a(cspread,nfft,1,1,1) !Transform to time domain - - sum=0. - do i=0,nfft-1 - p=real(cspread(i))**2 + aimag(cspread(i))**2 - sum=sum+p - enddo - avep=sum/nfft - fac=sqrt(1.0/avep) - cspread=fac*cspread !Normalize to constant avg power - cwave=cspread*cwave !Apply Rayleigh fading - -! do i=0,nfft-1 -! p=real(cspread(i))**2 + aimag(cspread(i))**2 -! write(14,3010) i,p,cspread(i) -!3010 format(i8,3f12.6) -! enddo - - return -end subroutine dopspread diff --git a/q65w/libm65/noisegen.f90 b/q65w/libm65/noisegen.f90 deleted file mode 100644 index 65d943161..000000000 --- a/q65w/libm65/noisegen.f90 +++ /dev/null @@ -1,13 +0,0 @@ -subroutine noisegen(d4,nmax) - - real*4 d4(4,nmax) - - do i=1,nmax - d4(1,i)=gran() - d4(2,i)=gran() - d4(3,i)=gran() - d4(4,i)=gran() - enddo - - return -end subroutine noisegen diff --git a/q65w/libm65/packjt.f90 b/q65w/libm65/packjt.f90 deleted file mode 100644 index c1fc0089d..000000000 --- a/q65w/libm65/packjt.f90 +++ /dev/null @@ -1,996 +0,0 @@ -module packjt - - contains - -subroutine packbits(dbits,nsymd,m0,sym) - - ! Pack 0s and 1s from dbits() into sym() with m0 bits per word. - ! NB: nsymd is the number of packed output words. - - integer sym(:) - integer*1 dbits(:) - - k=0 - do i=1,nsymd - n=0 - do j=1,m0 - k=k+1 - m=dbits(k) - n=ior(ishft(n,1),m) - enddo - sym(i)=n - enddo - - return - end subroutine packbits - - subroutine unpackbits(sym,nsymd,m0,dbits) - - ! Unpack bits from sym() into dbits(), one bit per byte. - ! NB: nsymd is the number of input words, and m0 their length. - ! there will be m0*nsymd output bytes, each 0 or 1. - - integer sym(:) - integer*1 dbits(:) - - k=0 - do i=1,nsymd - mask=ishft(1,m0-1) - do j=1,m0 - k=k+1 - dbits(k)=0 - if(iand(mask,sym(i)).ne.0) dbits(k)=1 - mask=ishft(mask,-1) - enddo - enddo - - return - end subroutine unpackbits - - subroutine packcall(callsign,ncall,text) - - ! Pack a valid callsign into a 28-bit integer. - - parameter (NBASE=37*36*10*27*27*27) - character callsign*6,c*1,tmp*6 - logical text - - text=.false. - - ! Work-around for Swaziland prefix: - if(callsign(1:4).eq.'3DA0') callsign='3D0'//callsign(5:6) - - if(callsign(1:3).eq.'CQ ') then - ncall=NBASE + 1 - if(callsign(4:4).ge.'0' .and. callsign(4:4).le.'9' .and. & - callsign(5:5).ge.'0' .and. callsign(5:5).le.'9' .and. & - callsign(6:6).ge.'0' .and. callsign(6:6).le.'9') then - read(callsign(4:6),*) nfreq - ncall=NBASE + 3 + nfreq - endif - return - else if(callsign(1:4).eq.'QRZ ') then - ncall=NBASE + 2 - return - else if(callsign(1:3).eq.'DE ') then - ncall=267796945 - return - endif - - tmp=' ' - if(callsign(3:3).ge.'0' .and. callsign(3:3).le.'9') then - tmp=callsign - else if(callsign(2:2).ge.'0' .and. callsign(2:2).le.'9') then - if(callsign(6:6).ne.' ') then - text=.true. - return - endif - tmp=' '//callsign(:5) - else - text=.true. - return - endif - - do i=1,6 - c=tmp(i:i) - if(c.ge.'a' .and. c.le.'z') & - tmp(i:i)=char(ichar(c)-ichar('a')+ichar('A')) - enddo - - n1=0 - if((tmp(1:1).ge.'A'.and.tmp(1:1).le.'Z').or.tmp(1:1).eq.' ') n1=1 - if(tmp(1:1).ge.'0' .and. tmp(1:1).le.'9') n1=1 - n2=0 - if(tmp(2:2).ge.'A' .and. tmp(2:2).le.'Z') n2=1 - if(tmp(2:2).ge.'0' .and. tmp(2:2).le.'9') n2=1 - n3=0 - if(tmp(3:3).ge.'0' .and. tmp(3:3).le.'9') n3=1 - n4=0 - if((tmp(4:4).ge.'A'.and.tmp(4:4).le.'Z').or.tmp(4:4).eq.' ') n4=1 - n5=0 - if((tmp(5:5).ge.'A'.and.tmp(5:5).le.'Z').or.tmp(5:5).eq.' ') n5=1 - n6=0 - if((tmp(6:6).ge.'A'.and.tmp(6:6).le.'Z').or.tmp(6:6).eq.' ') n6=1 - - if(n1+n2+n3+n4+n5+n6 .ne. 6) then - text=.true. - return - endif - - ncall=nchar(tmp(1:1)) - ncall=36*ncall+nchar(tmp(2:2)) - ncall=10*ncall+nchar(tmp(3:3)) - ncall=27*ncall+nchar(tmp(4:4))-10 - ncall=27*ncall+nchar(tmp(5:5))-10 - ncall=27*ncall+nchar(tmp(6:6))-10 - - return - end subroutine packcall - - subroutine unpackcall(ncall,word,iv2,psfx) - - parameter (NBASE=37*36*10*27*27*27) - character word*12,c*37,psfx*4 - - data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '/ - - word='......' - psfx=' ' - n=ncall - iv2=0 - if(n.ge.262177560) go to 20 - word='......' - ! if(n.ge.262177560) go to 999 !Plain text message ... - i=mod(n,27)+11 - word(6:6)=c(i:i) - n=n/27 - i=mod(n,27)+11 - word(5:5)=c(i:i) - n=n/27 - i=mod(n,27)+11 - word(4:4)=c(i:i) - n=n/27 - i=mod(n,10)+1 - word(3:3)=c(i:i) - n=n/10 - i=mod(n,36)+1 - word(2:2)=c(i:i) - n=n/36 - i=n+1 - word(1:1)=c(i:i) - do i=1,4 - if(word(i:i).ne.' ') go to 10 - enddo - go to 999 - 10 word=word(i:) - go to 999 - - 20 if(n.ge.267796946) go to 999 - - ! We have a JT65v2 message - if((n.ge.262178563) .and. (n.le.264002071)) then - ! CQ with prefix - iv2=1 - n=n-262178563 - i=mod(n,37)+1 - psfx(4:4)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if((n.ge.264002072) .and. (n.le.265825580)) then - ! QRZ with prefix - iv2=2 - n=n-264002072 - i=mod(n,37)+1 - psfx(4:4)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if((n.ge.265825581) .and. (n.le.267649089)) then - ! DE with prefix - iv2=3 - n=n-265825581 - i=mod(n,37)+1 - psfx(4:4)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if((n.ge.267649090) .and. (n.le.267698374)) then - ! CQ with suffix - iv2=4 - n=n-267649090 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if((n.ge.267698375) .and. (n.le.267747659)) then - ! QRZ with suffix - iv2=5 - n=n-267698375 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if((n.ge.267747660) .and. (n.le.267796944)) then - ! DE with suffix - iv2=6 - n=n-267747660 - i=mod(n,37)+1 - psfx(3:3)=c(i:i) - n=n/37 - i=mod(n,37)+1 - psfx(2:2)=c(i:i) - n=n/37 - i=n+1 - psfx(1:1)=c(i:i) - - else if(n.eq.267796945) then - ! DE with no prefix or suffix - iv2=7 - psfx = ' ' - endif - - 999 if(word(1:3).eq.'3D0') word='3DA0'//word(4:) - - return - end subroutine unpackcall - - subroutine packgrid(grid,ng,text) - - parameter (NGBASE=180*180) - character*4 grid - character*1 c1 - logical text - - text=.false. - if(grid.eq.' ') go to 90 !Blank grid is OK - - ! First, handle signal reports in the original range, -01 to -30 dB - if(grid(1:1).eq.'-') then - read(grid(2:3),*,err=800,end=800) n - if(n.ge.1 .and. n.le.30) then - ng=NGBASE+1+n - go to 900 - endif - go to 10 - else if(grid(1:2).eq.'R-') then - read(grid(3:4),*,err=800,end=800) n - if(n.ge.1 .and. n.le.30) then - ng=NGBASE+31+n - go to 900 - endif - go to 10 - ! Now check for RO, RRR, or 73 in the message field normally used for grid - else if(grid(1:4).eq.'RO ') then - ng=NGBASE+62 - go to 900 - else if(grid(1:4).eq.'RRR ') then - ng=NGBASE+63 - go to 900 - else if(grid(1:4).eq.'73 ') then - ng=NGBASE+64 - go to 900 - endif - - ! Now check for extended-range signal reports: -50 to -31, and 0 to +49. - 10 n=99 - c1=grid(1:1) - read(grid,*,err=20,end=20) n - go to 30 - 20 read(grid(2:4),*,err=30,end=30) n - 30 if(n.ge.-50 .and. n.le.49) then - if(c1.eq.'R') then - write(grid,1002) n+50 - 1002 format('LA',i2.2) - else - write(grid,1003) n+50 - 1003 format('KA',i2.2) - endif - go to 40 - endif - - ! Maybe it's free text ? - if(grid(1:1).lt.'A' .or. grid(1:1).gt.'R') text=.true. - if(grid(2:2).lt.'A' .or. grid(2:2).gt.'R') text=.true. - if(grid(3:3).lt.'0' .or. grid(3:3).gt.'9') text=.true. - if(grid(4:4).lt.'0' .or. grid(4:4).gt.'9') text=.true. - if(text) go to 900 - - ! OK, we have a properly formatted grid locator - 40 call grid2deg(grid//'mm',dlong,dlat) - long=int(dlong) - lat=int(dlat+ 90.0) - ng=((long+180)/2)*180 + lat - go to 900 - - 90 ng=NGBASE + 1 - go to 900 - - 800 text=.true. - 900 continue - - return - end subroutine packgrid - - subroutine unpackgrid(ng,grid) - - parameter (NGBASE=180*180) - character grid*4,grid6*6 - - grid=' ' - if(ng.ge.32400) go to 10 - dlat=mod(ng,180)-90 - dlong=(ng/180)*2 - 180 + 2 - call deg2grid(dlong,dlat,grid6) - grid=grid6(:4) - if(grid(1:2).eq.'KA') then - read(grid(3:4),*) n - n=n-50 - write(grid,1001) n - 1001 format(i3.2) - if(grid(1:1).eq.' ') grid(1:1)='+' - else if(grid(1:2).eq.'LA') then - read(grid(3:4),*) n - n=n-50 - write(grid,1002) n - 1002 format('R',i3.2) - if(grid(2:2).eq.' ') grid(2:2)='+' - endif - go to 900 - - 10 n=ng-NGBASE-1 - if(n.ge.1 .and.n.le.30) then - write(grid,1012) -n - 1012 format(i3.2) - else if(n.ge.31 .and.n.le.60) then - n=n-30 - write(grid,1022) -n - 1022 format('R',i3.2) - else if(n.eq.61) then - grid='RO' - else if(n.eq.62) then - grid='RRR' - else if(n.eq.63) then - grid='73' - endif - - 900 return - end subroutine unpackgrid - - subroutine packmsg(msg0,dat,itype) - - ! Packs a JT4/JT9/JT65 message into twelve 6-bit symbols - - ! itype Message Type - !-------------------- - ! 1 Standardd message - ! 2 Type 1 prefix - ! 3 Type 1 suffix - ! 4 Type 2 prefix - ! 5 Type 2 suffix - ! 6 Free text - ! -1 Does not decode correctly - - parameter (NBASE=37*36*10*27*27*27) - parameter (NBASE2=262178562) - character*22 msg0,msg - integer dat(:) - character*12 c1,c2 - character*4 c3 - character*6 grid6 - logical text1,text2,text3 - - msg=msg0 - itype=1 - call fmtmsg(msg,iz) - - if(msg(1:6).eq.'CQ DX ') msg(3:3)='9' - if(msg(1:3).eq."CQ " .and. & - msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & - msg(5:5).ge.'A' .and. msg(5:5).le.'Z' .and. & - msg(6:6).eq.' ') msg='E9'//msg(4:) - - ! See if it's a CQ message - if(msg(1:3).eq.'CQ ') then - i=3 - ! ... and if so, does it have a reply frequency? - if(msg(4:4).ge.'0' .and. msg(4:4).le.'9' .and. & - msg(5:5).ge.'0' .and. msg(5:5).le.'9' .and. & - msg(6:6).ge.'0' .and. msg(6:6).le.'9') i=7 - go to 1 - endif - - do i=1,22 - if(msg(i:i).eq.' ') go to 1 !Get 1st blank - enddo - go to 10 !Consider msg as plain text - - 1 ia=i - c1=msg(1:ia-1) - do i=ia+1,22 - if(msg(i:i).eq.' ') go to 2 !Get 2nd blank - enddo - go to 10 !Consider msg as plain text - - 2 ib=i - c2=msg(ia+1:ib-1) - - do i=ib+1,22 - if(msg(i:i).eq.' ') go to 3 !Get 3rd blank - enddo - go to 10 !Consider msg as plain text - - 3 ic=i - c3=' ' - if(ic.ge.ib+1) c3=msg(ib+1:ic) - if(c3.eq.'OOO ') c3=' ' !Strip out the OOO flag - call getpfx1(c1,k1,nv2a) - if(nv2a.ge.4) go to 10 - call packcall(c1,nc1,text1) - if(text1) go to 10 - call getpfx1(c2,k2,nv2b) - call packcall(c2,nc2,text2) - if(text2) go to 10 - if(nv2a.eq.2 .or. nv2a.eq.3 .or. nv2b.eq.2 .or. nv2b.eq.3) then - if(k1.lt.0 .or. k2.lt.0 .or. k1*k2.ne.0) go to 10 - if(k2.gt.0) k2=k2+450 - k=max(k1,k2) - if(k.gt.0) then - call k2grid(k,grid6) - c3=grid6(:4) - endif - endif - call packgrid(c3,ng,text3) - - if(nv2a.lt.4 .and. nv2b.lt.4 .and. (.not.text1) .and. (.not.text2) .and. & - (.not.text3)) go to 20 - - nc1=0 - if(nv2b.eq.4) then - if(c1(1:3).eq.'CQ ') nc1=262178563 + k2 - if(c1(1:4).eq.'QRZ ') nc1=264002072 + k2 - if(c1(1:3).eq.'DE ') nc1=265825581 + k2 - else if(nv2b.eq.5) then - if(c1(1:3).eq.'CQ ') nc1=267649090 + k2 - if(c1(1:4).eq.'QRZ ') nc1=267698375 + k2 - if(c1(1:3).eq.'DE ') nc1=267747660 + k2 - endif - if(nc1.ne.0) go to 20 - - ! The message will be treated as plain text. - 10 itype=6 - call packtext(msg,nc1,nc2,ng) - ng=ng+32768 - - ! Encode data into 6-bit words - 20 continue - if(itype.ne.6) itype=max(nv2a,nv2b) - dat(1)=iand(ishft(nc1,-22),63) !6 bits - dat(2)=iand(ishft(nc1,-16),63) !6 bits - dat(3)=iand(ishft(nc1,-10),63) !6 bits - dat(4)=iand(ishft(nc1, -4),63) !6 bits - dat(5)=4*iand(nc1,15)+iand(ishft(nc2,-26),3) !4+2 bits - dat(6)=iand(ishft(nc2,-20),63) !6 bits - dat(7)=iand(ishft(nc2,-14),63) !6 bits - dat(8)=iand(ishft(nc2, -8),63) !6 bits - dat(9)=iand(ishft(nc2, -2),63) !6 bits - dat(10)=16*iand(nc2,3)+iand(ishft(ng,-12),15) !2+4 bits - dat(11)=iand(ishft(ng,-6),63) - dat(12)=iand(ng,63) - - return - end subroutine packmsg - - subroutine unpackmsg(dat,msg) - - parameter (NBASE=37*36*10*27*27*27) - parameter (NGBASE=180*180) - integer dat(:) - character c1*12,c2*12,grid*4,msg*22,grid6*6,psfx*4,junk2*4 - logical cqnnn - - cqnnn=.false. - nc1=ishft(dat(1),22) + ishft(dat(2),16) + ishft(dat(3),10)+ & - ishft(dat(4),4) + iand(ishft(dat(5),-2),15) - - nc2=ishft(iand(dat(5),3),26) + ishft(dat(6),20) + & - ishft(dat(7),14) + ishft(dat(8),8) + ishft(dat(9),2) + & - iand(ishft(dat(10),-4),3) - - ng=ishft(iand(dat(10),15),12) + ishft(dat(11),6) + dat(12) - - if(ng.ge.32768) then - call unpacktext(nc1,nc2,ng,msg) - go to 100 - endif - - call unpackcall(nc1,c1,iv2,psfx) - if(iv2.eq.0) then - ! This is an "original JT65" message - if(nc1.eq.NBASE+1) c1='CQ ' - if(nc1.eq.NBASE+2) c1='QRZ ' - nfreq=nc1-NBASE-3 - if(nfreq.ge.0 .and. nfreq.le.999) then - write(c1,1002) nfreq - 1002 format('CQ ',i3.3) - cqnnn=.true. - endif - endif - - call unpackcall(nc2,c2,junk1,junk2) - call unpackgrid(ng,grid) - - if(iv2.gt.0) then - ! This is a JT65v2 message - do i=1,4 - if(ichar(psfx(i:i)).eq.0) psfx(i:i)=' ' - enddo - - n1=len_trim(psfx) - n2=len_trim(c2) - if(iv2.eq.1) msg='CQ '//psfx(:n1)//'/'//c2(:n2)//' '//grid - if(iv2.eq.2) msg='QRZ '//psfx(:n1)//'/'//c2(:n2)//' '//grid - if(iv2.eq.3) msg='DE '//psfx(:n1)//'/'//c2(:n2)//' '//grid - if(iv2.eq.4) msg='CQ '//c2(:n2)//'/'//psfx(:n1)//' '//grid - if(iv2.eq.5) msg='QRZ '//c2(:n2)//'/'//psfx(:n1)//' '//grid - if(iv2.eq.6) msg='DE '//c2(:n2)//'/'//psfx(:n1)//' '//grid - if(iv2.eq.7) msg='DE '//c2(:n2)//' '//grid - if(iv2.eq.8) msg=' ' - go to 100 - else - - endif - - grid6=grid//'ma' - call grid2k(grid6,k) - if(k.ge.1 .and. k.le.450) call getpfx2(k,c1) - if(k.ge.451 .and. k.le.900) call getpfx2(k,c2) - - i=index(c1,char(0)) - if(i.ge.3) c1=c1(1:i-1)//' ' - i=index(c2,char(0)) - if(i.ge.3) c2=c2(1:i-1)//' ' - - msg=' ' - j=0 - if(cqnnn) then - msg=c1//' ' - j=7 !### ??? ### - go to 10 - endif - - do i=1,12 - j=j+1 - msg(j:j)=c1(i:i) - if(c1(i:i).eq.' ') go to 10 - enddo - j=j+1 - msg(j:j)=' ' - - 10 do i=1,12 - if(j.le.21) j=j+1 - msg(j:j)=c2(i:i) - if(c2(i:i).eq.' ') go to 20 - enddo - if(j.le.21) j=j+1 - msg(j:j)=' ' - - 20 if(k.eq.0) then - do i=1,4 - if(j.le.21) j=j+1 - msg(j:j)=grid(i:i) - enddo - if(j.le.21) j=j+1 - msg(j:j)=' ' - endif - - 100 continue - if(msg(1:6).eq.'CQ9DX ') msg(3:3)=' ' - if(msg(1:2).eq.'E9' .and. & - msg(3:3).ge.'A' .and. msg(3:3).le.'Z' .and. & - msg(4:4).ge.'A' .and. msg(4:4).le.'Z' .and. & - msg(5:5).eq.' ') msg='CQ '//msg(3:) - - return - end subroutine unpackmsg - - subroutine packtext(msg,nc1,nc2,nc3) - - parameter (MASK28=2**28 - 1) - character*13 msg - character*42 c - data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ - - nc1=0 - nc2=0 - nc3=0 - - do i=1,5 !First 5 characters in nc1 - do j=1,42 !Get character code - if(msg(i:i).eq.c(j:j)) go to 10 - enddo - j=37 - 10 j=j-1 !Codes should start at zero - nc1=42*nc1 + j - enddo - - do i=6,10 !Characters 6-10 in nc2 - do j=1,42 !Get character code - if(msg(i:i).eq.c(j:j)) go to 20 - enddo - j=37 - 20 j=j-1 !Codes should start at zero - nc2=42*nc2 + j - enddo - - do i=11,13 !Characters 11-13 in nc3 - do j=1,42 !Get character code - if(msg(i:i).eq.c(j:j)) go to 30 - enddo - j=37 - 30 j=j-1 !Codes should start at zero - nc3=42*nc3 + j - enddo - - ! We now have used 17 bits in nc3. Must move one each to nc1 and nc2. - nc1=nc1+nc1 - if(iand(nc3,32768).ne.0) nc1=nc1+1 - nc2=nc2+nc2 - if(iand(nc3,65536).ne.0) nc2=nc2+1 - nc3=iand(nc3,32767) - - return - end subroutine packtext - - subroutine unpacktext(nc1,nc2,nc3,msg) - - character*22 msg - character*44 c - data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +-./?'/ - - nc3=iand(nc3,32767) !Remove the "plain text" bit - if(iand(nc1,1).ne.0) nc3=nc3+32768 - nc1=nc1/2 - if(iand(nc2,1).ne.0) nc3=nc3+65536 - nc2=nc2/2 - - do i=5,1,-1 - j=mod(nc1,42)+1 - msg(i:i)=c(j:j) - nc1=nc1/42 - enddo - - do i=10,6,-1 - j=mod(nc2,42)+1 - msg(i:i)=c(j:j) - nc2=nc2/42 - enddo - - do i=13,11,-1 - j=mod(nc3,42)+1 - msg(i:i)=c(j:j) - nc3=nc3/42 - enddo - msg(14:22) = ' ' - - return - end subroutine unpacktext - - subroutine getpfx1(callsign,k,nv2) - - character*12 callsign0,callsign,lof,rof - character*8 c - character addpfx*8,tpfx*4,tsfx*3 - logical ispfx,issfx,invalid - common/pfxcom/addpfx - include 'pfx.f90' - - callsign0=callsign - nv2=1 - iz=index(callsign,' ') - 1 - if(iz.lt.0) iz=12 - islash=index(callsign(1:iz),'/') - k=0 - ! if(k.eq.0) go to 10 !Tnx to DL9RDZ for reminder:this was for tests only! - c=' ' - if(islash.gt.0 .and. islash.le.(iz-4)) then - ! Add-on prefix - c=callsign(1:islash-1) - callsign=callsign(islash+1:iz) - do i=1,NZ - if(pfx(i)(1:4).eq.c) then - k=i - nv2=2 - go to 10 - endif - enddo - if(addpfx.eq.c) then - k=449 - nv2=2 - go to 10 - endif - - else if(islash.eq.(iz-1)) then - ! Add-on suffix - c=callsign(islash+1:iz) - callsign=callsign(1:islash-1) - do i=1,NZ2 - if(sfx(i).eq.c(1:1)) then - k=400+i - nv2=3 - go to 10 - endif - enddo - endif - - 10 if(islash.ne.0 .and.k.eq.0) then - ! Original JT65 would force this compound callsign to be treated as - ! plain text. In JT65v2, we will encode the prefix or suffix into nc1. - ! The task here is to compute the proper value of k. - lof=callsign0(:islash-1) - rof=callsign0(islash+1:) - llof=len_trim(lof) - lrof=len_trim(rof) - ispfx=(llof.gt.0 .and. llof.le.4) - issfx=(lrof.gt.0 .and. lrof.le.3) - invalid=.not.(ispfx.or.issfx) - if(ispfx.and.issfx) then - if(llof.lt.3) issfx=.false. - if(lrof.lt.3) ispfx=.false. - if(ispfx.and.issfx) then - i=ichar(callsign0(islash-1:islash-1)) - if(i.ge.ichar('0') .and. i.le.ichar('9')) then - issfx=.false. - else - ispfx=.false. - endif - endif - endif - - if(invalid) then - k=-1 - else - if(ispfx) then - tpfx=lof(1:4) - k=nchar(tpfx(1:1)) - k=37*k + nchar(tpfx(2:2)) - k=37*k + nchar(tpfx(3:3)) - k=37*k + nchar(tpfx(4:4)) - nv2=4 - i=index(callsign0,'/') - callsign=callsign0(:i-1) - callsign=callsign0(i+1:) - endif - if(issfx) then - tsfx=rof(1:3) - k=nchar(tsfx(1:1)) - k=37*k + nchar(tsfx(2:2)) - k=37*k + nchar(tsfx(3:3)) - nv2=5 - i=index(callsign0,'/') - callsign=callsign0(:i-1) - endif - endif - endif - - return - end subroutine getpfx1 - - subroutine getpfx2(k0,callsign) - - character callsign*12 - include 'pfx.f90' - character addpfx*8 - common/pfxcom/addpfx - - k=k0 - if(k.gt.450) k=k-450 - if(k.ge.1 .and. k.le.NZ) then - iz=index(pfx(k),' ') - 1 - callsign=pfx(k)(1:iz)//'/'//callsign - else if(k.ge.401 .and. k.le.400+NZ2) then - iz=index(callsign,' ') - 1 - callsign=callsign(1:iz)//'/'//sfx(k-400) - else if(k.eq.449) then - iz=index(addpfx,' ') - 1 - if(iz.lt.1) iz=8 - callsign=addpfx(1:iz)//'/'//callsign - endif - - return - end subroutine getpfx2 - - subroutine grid2k(grid,k) - - character*6 grid - - call grid2deg(grid,xlong,xlat) - nlong=nint(xlong) - nlat=nint(xlat) - k=0 - if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 - - return - end subroutine grid2k - - subroutine k2grid(k,grid) - character grid*6 - - nlong=2*mod((k-1)/5,90)-179 - if(k.gt.450) nlong=nlong+180 - nlat=mod(k-1,5)+ 85 - dlat=nlat - dlong=nlong - call deg2grid(dlong,dlat,grid) - - return - end subroutine k2grid - - subroutine grid2n(grid,n) - character*4 grid - - i1=ichar(grid(1:1))-ichar('A') - i2=ichar(grid(3:3))-ichar('0') - i=10*i1 + i2 - n=-i - 31 - - return - end subroutine grid2n - - subroutine n2grid(n,grid) - character*4 grid - - if(n.gt.-31 .or. n.lt.-70) stop 'Error in n2grid' - i=-(n+31) !NB: 0 <= i <= 39 - i1=i/10 - i2=mod(i,10) - grid(1:1)=char(ichar('A')+i1) - grid(2:2)='A' - grid(3:3)=char(ichar('0')+i2) - grid(4:4)='0' - - return - end subroutine n2grid - - function nchar(c) - - ! Convert ascii number, letter, or space to 0-36 for callsign packing. - - character c*1 - - n=0 !Silence compiler warning - if(c.ge.'0' .and. c.le.'9') then - n=ichar(c)-ichar('0') - else if(c.ge.'A' .and. c.le.'Z') then - n=ichar(c)-ichar('A') + 10 - else if(c.ge.'a' .and. c.le.'z') then - n=ichar(c)-ichar('a') + 10 - else if(c.ge.' ') then - n=36 - else - Print*,'Invalid character in callsign ',c,' ',ichar(c) - stop - endif - nchar=n - - return - end function nchar - - subroutine pack50(n1,n2,dat) - - integer*1 dat(:),i1 - - i1=iand(ishft(n1,-20),255) !8 bits - dat(1)=i1 - i1=iand(ishft(n1,-12),255) !8 bits - dat(2)=i1 - i1=iand(ishft(n1, -4),255) !8 bits - dat(3)=i1 - i1=16*iand(n1,15)+iand(ishft(n2,-18),15) !4+4 bits - dat(4)=i1 - i1=iand(ishft(n2,-10),255) !8 bits - dat(5)=i1 - i1=iand(ishft(n2, -2),255) !8 bits - dat(6)=i1 - i1=64*iand(n2,3) !2 bits - dat(7)=i1 - dat(8)=0 - dat(9)=0 - dat(10)=0 - dat(11)=0 - - return - end subroutine pack50 - -subroutine packpfx(call1,n1,ng,nadd) - - character*12 call1,call0 - character*3 pfx - logical text - - i1=index(call1,'/') - if(call1(i1+2:i1+2).eq.' ') then -! Single-character add-on suffix (maybe also fourth suffix letter?) - call0=call1(:i1-1) - call packcall(call0,n1,text) - nadd=1 - nc=ichar(call1(i1+1:i1+1)) - if(nc.ge.48 .and. nc.le.57) then - n=nc-48 - else if(nc.ge.65 .and. nc.le.90) then - n=nc-65+10 - else - n=38 - endif - nadd=1 - ng=60000-32768+n - else if(call1(i1+3:i1+3).eq.' ') then -! Two-character numerical suffix, /10 to /99 - call0=call1(:i1-1) - call packcall(call0,n1,text) - nadd=1 - n=10*(ichar(call1(i1+1:i1+1))-48) + ichar(call1(i1+2:i1+2)) - 48 - nadd=1 - ng=60000 + 26 + n - else -! Prefix of 1 to 3 characters - pfx=call1(:i1-1) - if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) - if(pfx(3:3).eq.' ') pfx=' '//pfx(1:2) - call0=call1(i1+1:) - call packcall(call0,n1,text) - - ng=0 - do i=1,3 - nc=ichar(pfx(i:i)) - if(nc.ge.48 .and. nc.le.57) then - n=nc-48 - else if(nc.ge.65 .and. nc.le.90) then - n=nc-65+10 - else - n=36 - endif - ng=37*ng + n - enddo - nadd=0 - if(ng.ge.32768) then - ng=ng-32768 - nadd=1 - endif - endif - - return -end subroutine packpfx - -end module packjt diff --git a/q65w/libm65/setup65.f90 b/q65w/libm65/setup65.f90 deleted file mode 100644 index b1a867d18..000000000 --- a/q65w/libm65/setup65.f90 +++ /dev/null @@ -1,96 +0,0 @@ -subroutine setup65 - -! Defines arrays related to the JT65 pseudo-random synchronizing pattern. -! Executed at program start. - - integer nprc(126) - common/prcom/pr(126),mdat(126),mref(126,2),mdat2(126),mref2(126,2) - -! JT65 - data nprc/ & - 1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & - 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & - 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & - 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & - 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & - 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & - 1,1,1,1,1,1/ - data mr2/0/ !Silence compiler warning - -! Put the appropriate pseudo-random sequence into pr - nsym=126 - do i=1,nsym - pr(i)=2*nprc(i)-1 - enddo - -! Determine locations of data and reference symbols - k=0 - mr1=0 - do i=1,nsym - if(pr(i).lt.0.0) then - k=k+1 - mdat(k)=i - else - mr2=i - if(mr1.eq.0) mr1=i - endif - enddo - nsig=k - -! Determine the reference symbols for each data symbol. - do k=1,nsig - m=mdat(k) - mref(k,1)=mr1 - do n=1,10 !Get ref symbol before data - if((m-n).gt.0) then - if (pr(m-n).gt.0.0) go to 10 - endif - enddo - go to 12 -10 mref(k,1)=m-n -12 mref(k,2)=mr2 - do n=1,10 !Get ref symbol after data - if((m+n).le.nsym) then - if (pr(m+n).gt.0.0) go to 20 - endif - enddo - go to 22 -20 mref(k,2)=m+n -22 enddo - -! Now do it all again, using opposite logic on pr(i) - k=0 - mr1=0 - do i=1,nsym - if(pr(i).gt.0.0) then - k=k+1 - mdat2(k)=i - else - mr2=i - if(mr1.eq.0) mr1=i - endif - enddo - nsig=k - - do k=1,nsig - m=mdat2(k) - mref2(k,1)=mr1 - do n=1,10 - if((m-n).gt.0) then - if (pr(m-n).lt.0.0) go to 110 - endif - enddo - go to 112 -110 mref2(k,1)=m-n -112 mref2(k,2)=mr2 - do n=1,10 - if((m+n).le.nsym) then - if (pr(m+n).lt.0.0) go to 120 - endif - enddo - go to 122 -120 mref2(k,2)=m+n -122 enddo - - return -end subroutine setup65 From 39318e9d219b049f4e997deadf410fc51b9d7533 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 11:35:23 -0500 Subject: [PATCH 088/251] Prune further... --- q65w/libm65/CMakeLists.txt | 27 -- q65w/libm65/cutil.c | 93 ------- q65w/libm65/decode_rs.c | 268 ------------------- q65w/libm65/encode_rs.c | 47 ---- q65w/libm65/ftrsd2.c | 213 --------------- q65w/libm65/gran.c | 28 -- q65w/libm65/igray.c | 22 -- q65w/libm65/init_rs.c | 120 --------- q65w/libm65/int.h | 54 ---- q65w/libm65/map65a.f90 | 1 - q65w/libm65/ptt.c | 43 ---- q65w/libm65/ptt_unix.c | 405 ----------------------------- q65w/libm65/rs.h | 35 --- q65w/libm65/rs2.h | 16 -- q65w/libm65/sec_midn.f90 | 11 - q65w/libm65/sleep.h | 32 --- q65w/libm65/timeval.h | 76 ------ q65w/libm65/tmoonsub.c | 514 ------------------------------------- q65w/libm65/usleep.c | 7 - q65w/libm65/wrapkarn.c | 70 ----- 20 files changed, 2082 deletions(-) delete mode 100644 q65w/libm65/cutil.c delete mode 100644 q65w/libm65/decode_rs.c delete mode 100644 q65w/libm65/encode_rs.c delete mode 100644 q65w/libm65/ftrsd2.c delete mode 100644 q65w/libm65/gran.c delete mode 100644 q65w/libm65/igray.c delete mode 100644 q65w/libm65/init_rs.c delete mode 100644 q65w/libm65/int.h delete mode 100644 q65w/libm65/ptt.c delete mode 100644 q65w/libm65/ptt_unix.c delete mode 100644 q65w/libm65/rs.h delete mode 100644 q65w/libm65/rs2.h delete mode 100644 q65w/libm65/sec_midn.f90 delete mode 100644 q65w/libm65/sleep.h delete mode 100644 q65w/libm65/timeval.h delete mode 100644 q65w/libm65/tmoonsub.c delete mode 100644 q65w/libm65/usleep.c delete mode 100644 q65w/libm65/wrapkarn.c diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index cda8cb193..bc47030fb 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -41,7 +41,6 @@ set (libm65_FSRCS recvpkt.f90 rfile3a.f90 s3avg.f90 - sec_midn.f90 set.f90 shell.f90 sleep_msec.f90 @@ -59,36 +58,10 @@ set (libm65_FSRCS f77_wisdom.f ) -set (libm65_ka9q_CSRCS - decode_rs.c - encode_rs.c - init_rs.c -) -set_source_files_properties (${libm65_ka9q_CSRCS} PROPERTIES COMPILE_FLAGS -Wno-sign-compare) - -set (libm65_CSRCS - ${libm65_ka9q_CSRCS} - ftrsd2.c -# gran.c - igray.c - tmoonsub.c - usleep.c - wrapkarn.c -) - -if (WIN32) - set (libm65_CSRCS ${libm65_CSRCS} ptt.c) -else () - set (libm65_CSRCS ${libm65_CSRCS} ptt_unix.c) -endif () - set (libm65_CXXSRCS ipcomm.cpp ) -add_definitions (-DBIGSYM=1) -set_source_files_properties (sec_midn.f90 PROPERTIES COMPILE_FLAGS -fno-second-underscore) - set (libm65_C_and_CXXSRCS ${libm65_CSRCS} ${libm65_CXXSRCS} diff --git a/q65w/libm65/cutil.c b/q65w/libm65/cutil.c deleted file mode 100644 index 69a526b07..000000000 --- a/q65w/libm65/cutil.c +++ /dev/null @@ -1,93 +0,0 @@ -#include -#include -#include -#include -#include -#include -// #include -// #include -// #include -#include "sleep.h" -#include "timeval.h" - -/* FORTRAN: fd = close(filedes) */ -int close_(int *filedes) -{ -return(close(*filedes)); -} -/* FORTRAN: fd = open(filnam,mode) */ -int open_(char filnam[], int *mode) -{ - return(open(filnam,*mode)); -} -/* FORTRAN: fd = creat(filnam,mode) */ -int creat_(char filnam[],int *mode) -{ - return(creat(filnam,*mode)); -} -/* FORTRAN: nread = read(fd,buf,n) */ -int read_(int *fd, char buf[], int *n) -{ - return(read(*fd,buf,*n)); -} -/* FORTRAN: nwrt = write(fd,buf,n) */ -int write_(int *fd, char buf[], int *n) -{ - return(write(*fd,buf,*n)); -} -/* FORTRAN: ns = lseek(fd,offset,origin) */ -int lseek_(int *fd,int *offset, int *origin) -{ - return(lseek(*fd,*offset,*origin)); -} -/* times(2) */ -//int times_(struct tms *buf) -//{ -// return (times(buf)); -//} -/* ioperm(2) */ -//ioperm_(from,num,turn_on) -//unsigned long *from,*num,*turn_on; -//{ -// return (ioperm(*from,*num,*turn_on)); -// return (i386_get_ioperm(*from,*num,*turn_on)); -//} - -/* usleep(3) */ -void usleep_(unsigned long *microsec) -{ - usleep(*microsec); -} - -/* returns random numbers between 0 and 32767 to FORTRAN program */ -int iran_(int *arg) -{ - return (rand()); -} - -int exit_(int *n) -{ - printf("\n\n"); - exit(*n); -} - -/* -struct tm * -gmtime_r_(const time_t *clock, struct tm *result) -{ - gmtime_r(clock, result); -} -*/ - -time_t time_(void) -{ - return time(0); -} - -/* hrtime() */ -double hrtime_(void) -{ - struct timeval tv; - gettimeofday(&tv,NULL); - return(tv.tv_sec+1.e-6*tv.tv_usec); -} diff --git a/q65w/libm65/decode_rs.c b/q65w/libm65/decode_rs.c deleted file mode 100644 index 91f582ac1..000000000 --- a/q65w/libm65/decode_rs.c +++ /dev/null @@ -1,268 +0,0 @@ -/* Reed-Solomon decoder - * Copyright 2002 Phil Karn, KA9Q - * May be used under the terms of the GNU General Public License (GPL) - * Modified by Steve Franke, K9AN, for use in a soft-symbol RS decoder - */ - -#ifdef DEBUG -#include -#endif - -#include - -#define NULL ((void *)0) -#define min(a,b) ((a) < (b) ? (a) : (b)) - -#ifdef FIXED -#include "fixed.h" -#elif defined(BIGSYM) -#include "int.h" -#else -#include "char.h" -#endif - -int DECODE_RS( -#ifndef FIXED - void *p, -#endif - DTYPE *data, int *eras_pos, int no_eras, int calc_syn){ - -#ifndef FIXED - struct rs *rs = (struct rs *)p; -#endif - int deg_lambda, el, deg_omega; - int i, j, r,k; - DTYPE u,q,tmp,num1,num2,den,discr_r; - DTYPE lambda[NROOTS+1]; // Err+Eras Locator poly - static DTYPE s[51]; // and syndrome poly - DTYPE b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1]; - DTYPE root[NROOTS], reg[NROOTS+1], loc[NROOTS]; - int syn_error, count; - - if( calc_syn ) { - /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ - for(i=0;i 0) { - /* Init lambda to be the erasure locator polynomial */ - lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))]; - for (i = 1; i < no_eras; i++) { - u = MODNN(PRIM*(NN-1-eras_pos[i])); - for (j = i+1; j > 0; j--) { - tmp = INDEX_OF[lambda[j - 1]]; - if(tmp != A0) - lambda[j] ^= ALPHA_TO[MODNN(u + tmp)]; - } - } - -#if DEBUG >= 1 - /* Test code that verifies the erasure locator polynomial just constructed - Needed only for decoder debugging. */ - - /* find roots of the erasure location polynomial */ - for(i=1;i<=no_eras;i++) - reg[i] = INDEX_OF[lambda[i]]; - - count = 0; - for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { - q = 1; - for (j = 1; j <= no_eras; j++) - if (reg[j] != A0) { - reg[j] = MODNN(reg[j] + j); - q ^= ALPHA_TO[reg[j]]; - } - if (q != 0) - continue; - /* store root and error location number indices */ - root[count] = i; - loc[count] = k; - count++; - } - if (count != no_eras) { - printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); - count = -1; - goto finish; - } -#if DEBUG >= 2 - printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); - for (i = 0; i < count; i++) - printf("%d ", loc[i]); - printf("\n"); -#endif -#endif - } - for(i=0;i 0; j--){ - if (reg[j] != A0) { - reg[j] = MODNN(reg[j] + j); - q ^= ALPHA_TO[reg[j]]; - } - } - if (q != 0) - continue; /* Not a root */ - /* store root (index-form) and error location number */ -#if DEBUG>=2 - printf("count %d root %d loc %d\n",count,i,k); -#endif - root[count] = i; - loc[count] = k; - /* If we've already found max possible roots, - * abort the search to save time - */ - if(++count == deg_lambda) - break; - } - if (deg_lambda != count) { - /* - * deg(lambda) unequal to number of roots => uncorrectable - * error detected - */ - count = -1; - goto finish; - } - /* - * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo - * x**NROOTS). in index form. Also find deg(omega). - */ - deg_omega = 0; - for (i = 0; i < NROOTS;i++){ - tmp = 0; - j = (deg_lambda < i) ? deg_lambda : i; - for(;j >= 0; j--){ - if ((s[i - j] != A0) && (lambda[j] != A0)) - tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])]; - } - if(tmp != 0) - deg_omega = i; - omega[i] = INDEX_OF[tmp]; - } - omega[NROOTS] = A0; - - /* - * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = - * inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form - */ - for (j = count-1; j >=0; j--) { - num1 = 0; - for (i = deg_omega; i >= 0; i--) { - if (omega[i] != A0) - num1 ^= ALPHA_TO[MODNN(omega[i] + i * root[j])]; - } - num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)]; - den = 0; - - /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ - for (i = min(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) { - if(lambda[i+1] != A0) - den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])]; - } - if (den == 0) { -#if DEBUG >= 1 - printf("\n ERROR: denominator = 0\n"); -#endif - count = -1; - goto finish; - } - /* Apply error to data */ - if (num1 != 0) { - data[loc[j]] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])]; - } - } -finish: - if(eras_pos != NULL){ - for(i=0;i - -#ifdef FIXED -#include "fixed.h" -#elif defined(BIGSYM) -#include "int.h" -#else -#include "char.h" -#endif - -void ENCODE_RS( -#ifndef FIXED -void *p, -#endif -DTYPE *data, DTYPE *bb){ -#ifndef FIXED - struct rs *rs = (struct rs *)p; -#endif - int i, j; - DTYPE feedback; - - memset(bb,0,NROOTS*sizeof(DTYPE)); - - for(i=0;i -#include -#include -#include -#include -#include "rs2.h" - -static void *rs; -void getpp_(int workdat[], float *pp); - -void ftrsd2_(int mrsym[], int mrprob[], int mr2sym[], int mr2prob[], - int* ntrials0, int correct[], int param[], int ntry[]) -{ - int rxdat[63], rxprob[63], rxdat2[63], rxprob2[63]; - int workdat[63]; - int indexes[63]; - int era_pos[51]; - int i, j, numera, nerr, nn=63; - int ntrials = *ntrials0; - int nhard=0,nhard_min=32768,nsoft=0,nsoft_min=32768; - int ntotal=0,ntotal_min=32768,ncandidates; - int nera_best=0; - float pp,pp1,pp2; - static unsigned int nseed; - -// Power-percentage symbol metrics - composite gnnf/hf - int perr[8][8] = { - { 4, 9, 11, 13, 14, 14, 15, 15}, - { 2, 20, 20, 30, 40, 50, 50, 50}, - { 7, 24, 27, 40, 50, 50, 50, 50}, - {13, 25, 35, 46, 52, 70, 50, 50}, - {17, 30, 42, 54, 55, 64, 71, 70}, - {25, 39, 48, 57, 64, 66, 77, 77}, - {32, 45, 54, 63, 66, 75, 78, 83}, - {51, 58, 57, 66, 72, 77, 82, 86}}; - - -// Initialize the KA9Q Reed-Solomon encoder/decoder - unsigned int symsize=6, gfpoly=0x43, fcr=3, prim=1, nroots=51; - rs=init_rs_int(symsize, gfpoly, fcr, prim, nroots, 0); - -// Reverse the received symbol vectors for BM decoder - for (i=0; i<63; i++) { - rxdat[i]=mrsym[62-i]; - rxprob[i]=mrprob[62-i]; - rxdat2[i]=mr2sym[62-i]; - rxprob2[i]=mr2prob[62-i]; - } - -// Sort rxprob to find indexes of the least reliable symbols - int k, pass, tmp, nsym=63; - int probs[63]; - for (i=0; i<63; i++) { - indexes[i]=i; - probs[i]=rxprob[i]; - } - for (pass = 1; pass <= nsym-1; pass++) { - for (k = 0; k < nsym - pass; k++) { - if( probs[k] < probs[k+1] ) { - tmp = probs[k]; - probs[k] = probs[k+1]; - probs[k+1] = tmp; - tmp = indexes[k]; - indexes[k] = indexes[k+1]; - indexes[k+1] = tmp; - } - } - } - -// See if we can decode using BM HDD, and calculate the syndrome vector. - memset(era_pos,0,51*sizeof(int)); - numera=0; - memcpy(workdat,rxdat,sizeof(rxdat)); - nerr=decode_rs_int(rs,workdat,era_pos,numera,1); - if( nerr >= 0 ) { - // Hard-decision decoding succeeded. Save codeword and some parameters. - nhard=0; - for (i=0; i<63; i++) { - if( workdat[i] != rxdat[i] ) nhard=nhard+1; - } - memcpy(correct,workdat,63*sizeof(int)); - param[0]=0; - param[1]=nhard; - param[2]=0; - param[3]=0; - param[4]=0; - param[5]=0; - param[7]=1000*1000; - ntry[0]=0; - return; - } - -/* -Hard-decision decoding failed. Try the FT soft-decision method. -Generate random erasure-locator vectors and see if any of them -decode. This will generate a list of "candidate" codewords. The -soft distance between each candidate codeword and the received -word is estimated by finding the largest (pp1) and second-largest -(pp2) outputs from a synchronized filter-bank operating on the -symbol spectra, and using these to decide which candidate -codeword is "best". -*/ - - nseed=1; //Seed for random numbers - float ratio; - int thresh, nsum; - int thresh0[63]; - ncandidates=0; - nsum=0; - int ii,jj; - for (i=0; i= 0 ) { - // We have a candidate codeword. Find its hard and soft distance from - // the received word. Also find pp1 and pp2 from the full array - // s3(64,63) of synchronized symbol spectra. - ncandidates=ncandidates+1; - nhard=0; - nsoft=0; - for (i=0; i<63; i++) { - if(workdat[i] != rxdat[i]) { - nhard=nhard+1; - if(workdat[i] != rxdat2[i]) { - nsoft=nsoft+rxprob[i]; - } - } - } - nsoft=63*nsoft/nsum; - ntotal=nsoft+nhard; - - getpp_(workdat,&pp); - if(pp>pp1) { - pp2=pp1; - pp1=pp; - nsoft_min=nsoft; - nhard_min=nhard; - ntotal_min=ntotal; - memcpy(correct,workdat,63*sizeof(int)); - nera_best=numera; - ntry[0]=k; - } else { - if(pp>pp2 && pp!=pp1) pp2=pp; - } - if(nhard_min <= 41 && ntotal_min <= 71) break; - } - if(k == ntrials) ntry[0]=k; - } - - param[0]=ncandidates; - param[1]=nhard_min; - param[2]=nsoft_min; - param[3]=nera_best; - param[4]= pp1 > 0 ? 1000.0*pp2/pp1 : 1000.0; - param[5]=ntotal_min; - param[6]=ntry[0]; - param[7]=1000.0*pp2; - param[8]=1000.0*pp1; - if(param[0]==0) param[2]=-1; - return; -} diff --git a/q65w/libm65/gran.c b/q65w/libm65/gran.c deleted file mode 100644 index 24b986503..000000000 --- a/q65w/libm65/gran.c +++ /dev/null @@ -1,28 +0,0 @@ -#include -#include - -/* Generate gaussian random float with mean=0 and std_dev=1 */ -float gran_() -{ - float fac,rsq,v1,v2; - static float gset; - static int iset; - - if(iset){ - /* Already got one */ - iset = 0; - return gset; - } - /* Generate two evenly distributed numbers between -1 and +1 - * that are inside the unit circle - */ - do { - v1 = 2.0 * (float)rand() / RAND_MAX - 1; - v2 = 2.0 * (float)rand() / RAND_MAX - 1; - rsq = v1*v1 + v2*v2; - } while(rsq >= 1.0 || rsq == 0.0); - fac = sqrt(-2.0*log(rsq)/rsq); - gset = v1*fac; - iset++; - return v2*fac; -} diff --git a/q65w/libm65/igray.c b/q65w/libm65/igray.c deleted file mode 100644 index 395f79712..000000000 --- a/q65w/libm65/igray.c +++ /dev/null @@ -1,22 +0,0 @@ -#ifdef CVF -extern int __stdcall IGRAY(int *n0, int *idir) -#else -int igray_(int *n0, int *idir) -#endif -{ - int n; - unsigned long sh; - unsigned long nn; - n=*n0; - - if(*idir>0) return (n ^ (n >> 1)); - - sh = 1; - nn = (n >> sh); - while (nn > 0) { - n ^= nn; - sh <<= 1; - nn = (n >> sh); - } - return (n); -} diff --git a/q65w/libm65/init_rs.c b/q65w/libm65/init_rs.c deleted file mode 100644 index 876819f8c..000000000 --- a/q65w/libm65/init_rs.c +++ /dev/null @@ -1,120 +0,0 @@ -/* Initialize a RS codec - * - * Copyright 2002 Phil Karn, KA9Q - * May be used under the terms of the GNU General Public License (GPL) - */ -#include - -#ifdef CCSDS -#include "ccsds.h" -#elif defined(BIGSYM) -#include "int.h" -#else -#include "char.h" -#endif - -void FREE_RS(void *p){ - struct rs *rs = (struct rs *)p; - - free(rs->alpha_to); - free(rs->index_of); - free(rs->genpoly); - free(rs); -} - -/* Initialize a Reed-Solomon codec - * symsize = symbol size, bits (1-8) - * gfpoly = Field generator polynomial coefficients - * fcr = first root of RS code generator polynomial, index form - * prim = primitive element to generate polynomial roots - * nroots = RS code generator polynomial degree (number of roots) - */ -void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim, - unsigned int nroots){ - struct rs *rs; - int i, j, sr,root,iprim; - - /* Check parameter ranges */ - if(symsize < 0 || symsize > (int)(8*sizeof(DTYPE))) - return NULL; /* Need version with ints rather than chars */ - - if(fcr >= (1<= (1<= (1<mm = symsize; - rs->nn = (1<alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); - if(rs->alpha_to == NULL){ - free(rs); - return NULL; - } - rs->index_of = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1)); - if(rs->index_of == NULL){ - free(rs->alpha_to); - free(rs); - return NULL; - } - - /* Generate Galois field lookup tables */ - rs->index_of[0] = A0; /* log(zero) = -inf */ - rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */ - sr = 1; - for(i=0;inn;i++){ - rs->index_of[sr] = i; - rs->alpha_to[i] = sr; - sr <<= 1; - if(sr & (1<nn; - } - if(sr != 1){ - /* field generator polynomial is not primitive! */ - free(rs->alpha_to); - free(rs->index_of); - free(rs); - return NULL; - } - - /* Form RS code generator polynomial from its roots */ - rs->genpoly = (DTYPE *)malloc(sizeof(DTYPE)*(nroots+1)); - if(rs->genpoly == NULL){ - free(rs->alpha_to); - free(rs->index_of); - free(rs); - return NULL; - } - rs->fcr = fcr; - rs->prim = prim; - rs->nroots = nroots; - - /* Find prim-th root of 1, used in decoding */ - for(iprim=1;(iprim % prim) != 0;iprim += rs->nn) - ; - rs->iprim = iprim / prim; - - rs->genpoly[0] = 1; - for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) { - rs->genpoly[i+1] = 1; - - /* Multiply rs->genpoly[] by @**(root + x) */ - for (j = i; j > 0; j--){ - if (rs->genpoly[j] != 0) - rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; - else - rs->genpoly[j] = rs->genpoly[j-1]; - } - /* rs->genpoly[0] can never be zero */ - rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; - } - /* convert rs->genpoly[] to index form for quicker encoding */ - for (i = 0; i <= nroots; i++) - rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; - - return rs; -} diff --git a/q65w/libm65/int.h b/q65w/libm65/int.h deleted file mode 100644 index ada5bfd4c..000000000 --- a/q65w/libm65/int.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Include file to configure the RS codec for integer symbols - * - * Copyright 2002, Phil Karn, KA9Q - * May be used under the terms of the GNU General Public License (GPL) - */ -#define DTYPE int - -/* Reed-Solomon codec control block */ -struct rs { - unsigned int mm; /* Bits per symbol */ - unsigned int nn; /* Symbols per block (= (1<= rs->nn) { - x -= rs->nn; - x = (x >> rs->mm) + (x & rs->nn); - } - return x; -} -#define MODNN(x) modnn(rs,x) - -#define MM (rs->mm) -#define NN (rs->nn) -#define ALPHA_TO (rs->alpha_to) -#define INDEX_OF (rs->index_of) -#define GENPOLY (rs->genpoly) -#define NROOTS (rs->nroots) -#define FCR (rs->fcr) -#define PRIM (rs->prim) -#define IPRIM (rs->iprim) -#define A0 (NN) - -#define ENCODE_RS encode_rs_int -#define DECODE_RS decode_rs_int -#define INIT_RS init_rs_int -#define FREE_RS free_rs_int - -void ENCODE_RS(void *p,DTYPE *data,DTYPE *parity); -int DECODE_RS(void *p,DTYPE *data,int *eras_pos,int no_eras, int calc_syn); -void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned int fcr, - unsigned int prim,unsigned int nroots); -void FREE_RS(void *p); - - - - diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index c1b86bd16..f3bd5aa5b 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -121,7 +121,6 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & short=0. !Zero the whole short array jpz=1 - print*,'AAA',mode65 call timer('filbig ',0) call filbig(dd,NSMAX,f0,newdat,nfsample,xpol,cx,cy,n5) call timer('filbig ',1) diff --git a/q65w/libm65/ptt.c b/q65w/libm65/ptt.c deleted file mode 100644 index 0f99d1be8..000000000 --- a/q65w/libm65/ptt.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -int ptt_(int *nport, int *ntx, int *iptt) -{ - static HANDLE hFile; - static int open=0; - char s[10]; - int i3=0,i4=0,i5=0,i6=0,i9=0,i00=0; - - if(*nport==0) { - *iptt=*ntx; - return(0); - } - - if(*ntx && (!open)) { - sprintf(s,"COM%d",*nport); - hFile=CreateFile(TEXT(s),GENERIC_WRITE,0,NULL,OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL,NULL); - if(hFile==INVALID_HANDLE_VALUE) { - // printf("PTT: Cannot open COM port %d.\n",*nport); - return 1; - } - open=1; - } - - if(*ntx && open) { - EscapeCommFunction(hFile,3); - EscapeCommFunction(hFile,5); - *iptt=1; - } - - else { - EscapeCommFunction(hFile,4); - EscapeCommFunction(hFile,6); - EscapeCommFunction(hFile,9); - i00=CloseHandle(hFile); - *iptt=0; - open=0; - } - if((i00+i3+i4+i5+i6+i9)==-99) return -1; //Silence compiler warning - return 0; -} diff --git a/q65w/libm65/ptt_unix.c b/q65w/libm65/ptt_unix.c deleted file mode 100644 index 1c583f641..000000000 --- a/q65w/libm65/ptt_unix.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * WSJT is Copyright (c) 2001-2006 by Joseph H. Taylor, Jr., K1JT, - * and is licensed under the GNU General Public License (GPL). - * - * Code used from cwdaemon for parallel port ptt only. - * - * cwdaemon - morse sounding daemon for the parallel or serial port - * Copyright (C) 2002 -2005 Joop Stakenborg - * and many authors, see the AUTHORS file. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -# if HAVE_STDIO_H -# include -#endif -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_UNISTD_H -# include -#endif -#if HAVE_SYS_STAT_H -# include -#endif -#if HAVE_SYS_IOCTL_H -# include -#endif -#if HAVE_FCNTL_H -# include -#endif - -#ifdef HAVE_LINUX_PPDEV_H -# include -# include -#endif -#ifdef HAVE_DEV_PPBUS_PPI_H -# include -# include -#endif - -int lp_reset (int fd); -int lp_ptt (int fd, int onoff); - -#ifdef HAVE_SYS_STAT_H -# include -#endif -#if (defined(__unix__) || defined(unix)) && !defined(USG) -# include -#endif - -#include -/* parport functions */ - -int dev_is_parport(int fd); -int ptt_parallel(int fd, int *ntx, int *iptt); -int ptt_serial(int fd, int *ntx, int *iptt); - -int fd=-1; /* Used for both serial and parallel */ - -/* - * ptt_ - * - * generic unix PTT routine called from Fortran - * - * Inputs - * unused Unused, to satisfy old windows calling convention - * ptt_port device name serial or parallel - * ntx pointer to fortran command on or off - * iptt pointer to fortran command status on or off - * Returns - non 0 if error -*/ - -/* Tiny state machine */ -#define STATE_PORT_CLOSED 0 -#define STATE_PORT_OPEN_PARALLEL 1 -#define STATE_PORT_OPEN_SERIAL 2 - -//int ptt_(int *unused, char *ptt_port, int *ntx, int *iptt) -int ptt_(int *unused, int *ntx, int *iptt) -{ - static int state=0; - char *p; - -// ### Temporary: - char* ptt_port; - if(*unused != -99) { - *iptt=*ntx; - return 0; - } -// ### - - /* In the very unlikely event of a NULL pointer, just return. - * Yes, I realise this should not be possible in WSJT. - */ - if (ptt_port == NULL) { - *iptt = *ntx; - return (0); - } - - switch (state) { - case STATE_PORT_CLOSED: - - /* Remove trailing ' ' */ - if ((p = strchr(ptt_port, ' ')) != NULL) - *p = '\0'; - - /* If all that is left is a '\0' then also just return */ - if (*ptt_port == '\0') { - *iptt = *ntx; - return(0); - } - - if ((fd = open(ptt_port, O_RDWR|O_NONBLOCK)) < 0) { - fprintf(stderr, "Can't open %s.\n", ptt_port); - return (1); - } - - if (dev_is_parport(fd)) { - state = STATE_PORT_OPEN_PARALLEL; - lp_reset(fd); - ptt_parallel(fd, ntx, iptt); - } else { - state = STATE_PORT_OPEN_SERIAL; - ptt_serial(fd, ntx, iptt); - } - break; - - case STATE_PORT_OPEN_PARALLEL: - ptt_parallel(fd, ntx, iptt); - break; - - case STATE_PORT_OPEN_SERIAL: - ptt_serial(fd, ntx, iptt); - break; - - default: - close(fd); - fd = -1; - state = STATE_PORT_CLOSED; - break; - } - return(0); -} - -/* - * ptt_serial - * - * generic serial unix PTT routine called indirectly from Fortran - * - * fd - already opened file descriptor - * ntx - pointer to fortran command on or off - * iptt - pointer to fortran command status on or off - */ - -int -ptt_serial(int fd, int *ntx, int *iptt) -{ - int control = TIOCM_RTS | TIOCM_DTR; - -#if defined (TIOCMBIS) && defined (TIOCMBIS) - if(*ntx) { - ioctl(fd, TIOCMBIS, &control); /* Set DTR and RTS */ - *iptt = 1; - } else { - ioctl(fd, TIOCMBIC, &control); - *iptt = 0; - } -#else - unsigned y; - ioctl(fd, TIOCMGET, &y); - if (*ntx) { - y |= control; - } else { - y &= ~control; - } - ioctl(fd, TIOCMSET, &y); -#endif - return(0); -} - - -/* parport functions */ - -/* - * dev_is_parport(fd): - * - * inputs - Already open fd - * output - 1 if parallel port, 0 if not - * side effects - Unfortunately, this is platform specific. - */ - -#if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */ - -int -dev_is_parport(int fd) -{ - struct stat st; - int m; - - if ((fstat(fd, &st) == -1) || - ((st.st_mode & S_IFMT) != S_IFCHR) || - (ioctl(fd, PPGETMODE, &m) == -1)) - return(0); - - return(1); -} - -#elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */ - -int -dev_is_parport(int fd) -{ - struct stat st; - unsigned char c; - - if ((fstat(fd, &st) == -1) || - ((st.st_mode & S_IFMT) != S_IFCHR) || - (ioctl(fd, PPISSTATUS, &c) == -1)) - return(0); - - return(1); -} - -#else /* Fallback (nothing) */ - -int -dev_is_parport(int fd) -{ - return(0); -} - -#endif -/* Linux wrapper around PPFCONTROL */ -#ifdef HAVE_LINUX_PPDEV_H -static void -parport_control (int fd, unsigned char controlbits, int values) -{ - struct ppdev_frob_struct frob; - frob.mask = controlbits; - frob.val = values; - - if (ioctl (fd, PPFCONTROL, &frob) == -1) - { - fprintf(stderr, "Parallel port PPFCONTROL"); - exit (1); - } -} -#endif - -/* FreeBSD wrapper around PPISCTRL */ -#ifdef HAVE_DEV_PPBUS_PPI_H -static void -parport_control (int fd, unsigned char controlbits, int values) -{ - unsigned char val; - - if (ioctl (fd, PPIGCTRL, &val) == -1) - { - fprintf(stderr, "Parallel port PPIGCTRL"); - exit (1); - } - - val &= ~controlbits; - val |= values; - - if (ioctl (fd, PPISCTRL, &val) == -1) - { - fprintf(stderr, "Parallel port PPISCTRL"); - exit (1); - } -} -#endif - -/* Initialise a parallel port, given open fd */ -int -lp_init (int fd) -{ -#ifdef HAVE_LINUX_PPDEV_H - int mode; -#endif - -#ifdef HAVE_LINUX_PPDEV_H - mode = PARPORT_MODE_PCSPP; - - if (ioctl (fd, PPSETMODE, &mode) == -1) - { - fprintf(stderr, "Setting parallel port mode"); - close (fd); - return(-1); - } - - if (ioctl (fd, PPEXCL, NULL) == -1) - { - fprintf(stderr, "Parallel port is already in use.\n"); - close (fd); - return(-1); - } - if (ioctl (fd, PPCLAIM, NULL) == -1) - { - fprintf(stderr, "Claiming parallel port.\n"); - fprintf(stderr, "HINT: did you unload the lp kernel module?"); - close (fd); - return(-1); - } - - /* Enable CW & PTT - /STROBE bit (pin 1) */ - parport_control (fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE); -#endif -#ifdef HAVE_DEV_PPBUS_PPI_H - parport_control (fd, STROBE, STROBE); -#endif - lp_reset (fd); - return(0); -} - -/* release ppdev and close port */ -int -lp_free (int fd) -{ -#ifdef HAVE_LINUX_PPDEV_H - lp_reset (fd); - - /* Disable CW & PTT - /STROBE bit (pin 1) */ - parport_control (fd, PARPORT_CONTROL_STROBE, 0); - - ioctl (fd, PPRELEASE); -#endif -#ifdef HAVE_DEV_PPBUS_PPI_H - /* Disable CW & PTT - /STROBE bit (pin 1) */ - parport_control (fd, STROBE, 0); -#endif - close (fd); - return(0); -} - -/* set to a known state */ -int -lp_reset (int fd) -{ -#if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) - lp_ptt (fd, 0); -#endif - return(0); -} - -/* SSB PTT keying - /INIT bit (pin 16) (inverted) */ -int -lp_ptt (int fd, int onoff) -{ -#ifdef HAVE_LINUX_PPDEV_H - if (onoff == 1) - parport_control (fd, PARPORT_CONTROL_INIT, - PARPORT_CONTROL_INIT); - else - parport_control (fd, PARPORT_CONTROL_INIT, 0); -#endif -#ifdef HAVE_DEV_PPBUS_PPI_H - if (onoff == 1) - parport_control (fd, nINIT, - nINIT); - else - parport_control (fd, nINIT, 0); -#endif - return(0); -} - -/* - * ptt_parallel - * - * generic parallel unix PTT routine called indirectly from Fortran - * - * fd - already opened file descriptor - * ntx - pointer to fortran command on or off - * iptt - pointer to fortran command status on or off - */ - -int -ptt_parallel(int fd, int *ntx, int *iptt) -{ - if(*ntx) { - lp_ptt(fd, 1); - *iptt=1; - } else { - lp_ptt(fd, 0); - *iptt=0; - } - return(0); -} diff --git a/q65w/libm65/rs.h b/q65w/libm65/rs.h deleted file mode 100644 index 06cbe344f..000000000 --- a/q65w/libm65/rs.h +++ /dev/null @@ -1,35 +0,0 @@ -/* User include file for the Reed-Solomon codec - * Copyright 2002, Phil Karn KA9Q - * May be used under the terms of the GNU General Public License (GPL) - */ - -/* General purpose RS codec, 8-bit symbols */ -void encode_rs_char(void *rs,unsigned char *data,unsigned char *parity); -int decode_rs_char(void *rs,unsigned char *data,int *eras_pos, - int no_eras); -void *init_rs_char(int symsize,int gfpoly, - int fcr,int prim,int nroots, - int pad); -void free_rs_char(void *rs); - -/* General purpose RS codec, integer symbols */ -void encode_rs_int(void *rs,int *data,int *parity); -int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras); -void *init_rs_int(int symsize,int gfpoly,int fcr, - int prim,int nroots,int pad); -void free_rs_int(void *rs); - -/* CCSDS standard (255,223) RS codec with conventional (*not* dual-basis) - * symbol representation - */ -void encode_rs_8(unsigned char *data,unsigned char *parity,int pad); -int decode_rs_8(unsigned char *data,int *eras_pos,int no_eras,int pad); - -/* CCSDS standard (255,223) RS codec with dual-basis symbol representation */ -void encode_rs_ccsds(unsigned char *data,unsigned char *parity,int pad); -int decode_rs_ccsds(unsigned char *data,int *eras_pos,int no_eras,int pad); - -/* Tables to map from conventional->dual (Taltab) and - * dual->conventional (Tal1tab) bases - */ -extern unsigned char Taltab[],Tal1tab[]; diff --git a/q65w/libm65/rs2.h b/q65w/libm65/rs2.h deleted file mode 100644 index c2b807d15..000000000 --- a/q65w/libm65/rs2.h +++ /dev/null @@ -1,16 +0,0 @@ -/* User include file for the Reed-Solomon codec - * Copyright 2002, Phil Karn KA9Q - * May be used under the terms of the GNU General Public License (GPL) - */ - -/* General purpose RS codec, integer symbols */ -void encode_rs_int(void *rs,int *data,int *parity); -int decode_rs_int(void *rs,int *data,int *eras_pos,int no_eras, int calc_syn); -void *init_rs_int(int symsize,int gfpoly,int fcr, - int prim,int nroots,int pad); -void free_rs_int(void *rs); - -/* Tables to map from conventional->dual (Taltab) and - * dual->conventional (Tal1tab) bases - */ -extern unsigned char Taltab[],Tal1tab[]; diff --git a/q65w/libm65/sec_midn.f90 b/q65w/libm65/sec_midn.f90 deleted file mode 100644 index 0bbe62c2c..000000000 --- a/q65w/libm65/sec_midn.f90 +++ /dev/null @@ -1,11 +0,0 @@ -real function sec_midn() - sec_midn=secnds(0.0) - return -end function sec_midn - -subroutine sleep_msec(n) - - call usleep(1000*n) - - return -end subroutine sleep_msec diff --git a/q65w/libm65/sleep.h b/q65w/libm65/sleep.h deleted file mode 100644 index df60bc92a..000000000 --- a/q65w/libm65/sleep.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * sleep.h 1.0 02/03/10 - * - * Defines cross-platform sleep, usleep, etc. - * - * By Wu Yongwei - * - */ - -#ifndef _SLEEP_H -#define _SLEEP_H - -#ifdef _WIN32 -# if defined(_NEED_SLEEP_ONLY) && (defined(_MSC_VER) || defined(__MINGW32__)) -# include -# define sleep(t) _sleep((t) * 1000) -# else -# include -# define sleep(t) Sleep((t) * 1000) -# endif -# ifndef _NEED_SLEEP_ONLY -# define msleep(t) Sleep(t) -# define usleep(t) Sleep((t) / 1000) -# endif -#else -# include -# ifndef _NEED_SLEEP_ONLY -# define msleep(t) usleep((t) * 1000) -# endif -#endif - -#endif /* _SLEEP_H */ diff --git a/q65w/libm65/timeval.h b/q65w/libm65/timeval.h deleted file mode 100644 index 83c77d5a1..000000000 --- a/q65w/libm65/timeval.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * timeval.h 1.0 01/12/19 - * - * Defines gettimeofday, timeval, etc. for Win32 - * - * By Wu Yongwei - * - */ - -#ifndef _TIMEVAL_H -#define _TIMEVAL_H - -#ifdef _WIN32 - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#ifndef __GNUC__ -#define EPOCHFILETIME (116444736000000000i64) -#else -#define EPOCHFILETIME (116444736000000000LL) -#endif - -//struct timeval { -// long tv_sec; /* seconds */ -// long tv_usec; /* microseconds */ -//}; - -/* -struct timezone { - int tz_minuteswest; // minutes W of Greenwich -int tz_dsttime; // type of dst correction -}; -*/ - -__inline int gettimeofday(struct timeval *tv, struct timezone *tz) -{ - FILETIME ft; - LARGE_INTEGER li; - __int64 t; - static int tzflag; - - if (tv) - { - GetSystemTimeAsFileTime(&ft); - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - t = li.QuadPart; /* In 100-nanosecond intervals */ - t -= EPOCHFILETIME; /* Offset to the Epoch time */ - t /= 10; /* In microseconds */ - tv->tv_sec = (long)(t / 1000000); - tv->tv_usec = (long)(t % 1000000); - } - - if (tz) - { - if (!tzflag) - { - _tzset(); - tzflag++; - } - tz->tz_minuteswest = _timezone / 60; - tz->tz_dsttime = _daylight; - } - - return 0; -} - -#else /* _WIN32 */ - -#include - -#endif /* _WIN32 */ - -#endif /* _TIMEVAL_H */ diff --git a/q65w/libm65/tmoonsub.c b/q65w/libm65/tmoonsub.c deleted file mode 100644 index 29ac28b49..000000000 --- a/q65w/libm65/tmoonsub.c +++ /dev/null @@ -1,514 +0,0 @@ -#include -#include -#include - -#define RADS 0.0174532925199433 -#define DEGS 57.2957795130823 -#define TPI 6.28318530717959 -#define PI 3.1415927 - -/* ratio of earth radius to astronomical unit */ -#define ER_OVER_AU 0.0000426352325194252 - -/* all prototypes here */ - -double getcoord(int coord); -void getargs(int argc, char *argv[], int *y, int *m, double *tz, double *glong, double *glat); -double range(double y); -double rangerad(double y); -double days(int y, int m, int dn, double hour); -double days_(int *y, int *m, int *dn, double *hour); -void moonpos(double, double *, double *, double *); -void sunpos(double , double *, double *, double *); -double moontransit(int y, int m, int d, double timezone, double glat, double glong, int *nt); -double atan22(double y, double x); -double epsilon(double d); -void equatorial(double d, double *lon, double *lat, double *r); -void ecliptic(double d, double *lon, double *lat, double *r); -double gst(double d); -void topo(double lst, double glat, double *alp, double *dec, double *r); -double alt(double glat, double ha, double dec); -void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p); -void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill); -int daysinmonth(int y, int m); -int isleap(int y); -void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, - double *mrv, double *l, double *b, double *paxis); - -static const char -*usage = " Usage: tmoon date[yyyymm] timz[+/-h.hh] long[+/-dddmm] lat[+/-ddmm]\n" - "example: tmoon 200009 0 -00155 5230\n"; - -/* - getargs() gets the arguments from the command line, does some basic error - checking, and converts arguments into numerical form. Arguments are passed - back in pointers. Error messages print to stderr so re-direction of output - to file won't leave users blind. Error checking prints list of all errors - in a command line before quitting. -*/ -void getargs(int argc, char *argv[], int *y, int *m, double *tz, - double *glong, double *glat) { - - int date, latitude, longitude; - int mflag = 0, yflag = 0, longflag = 0, latflag = 0, tzflag = 0; - int longminflag = 0, latminflag = 0, dflag = 0; - - /* if not right number of arguments, then print example command line */ - - if (argc !=5) { - fprintf(stderr, usage); - exit(EXIT_FAILURE); - } - - date = atoi(argv[1]); - *y = date / 100; - *m = date - *y * 100; - *tz = (double) atof(argv[2]); - longitude = atoi(argv[3]); - latitude = atoi(argv[4]); - *glong = RADS * getcoord(longitude); - *glat = RADS * getcoord(latitude); - - /* set a flag for each error found */ - - if (*m > 12 || *m < 1) mflag = 1; - if (*y > 2500) yflag = 1; - if (date < 150001) dflag = 1; - if (fabs((float) *glong) > 180 * RADS) longflag = 1; - if (abs(longitude) % 100 > 59) longminflag = 1; - if (fabs((float) *glat) > 90 * RADS) latflag = 1; - if (abs(latitude) % 100 > 59) latminflag = 1; - if (fabs((float) *tz) > 12) tzflag = 1; - - /* print all the errors found */ - - if (dflag == 1) { - fprintf(stderr, "date: dates must be in form yyyymm, gregorian, and later than 1500 AD\n"); - } - if (yflag == 1) { - fprintf(stderr, "date: too far in future - accurate from 1500 to 2500\n"); - } - if (mflag == 1) { - fprintf(stderr, "date: month must be in range 0 to 12, eg - August 2000 is entered as 200008\n"); - } - if (tzflag == 1) { - fprintf(stderr, "timz: must be in range +/- 12 hours, eg -6 for Chicago\n"); - } - if (longflag == 1) { - fprintf(stderr, "long: must be in range +/- 180 degrees\n"); - } - if (longminflag == 1) { - fprintf(stderr, "long: last two digits are arcmin - max 59\n"); - } - if (latflag == 1) { - fprintf(stderr, " lat: must be in range +/- 90 degrees\n"); - } - if (latminflag == 1) { - fprintf(stderr, " lat: last two digits are arcmin - max 59\n"); - } - - /* quits if one or more flags set */ - - if (dflag + mflag + yflag + longflag + latflag + tzflag + longminflag + latminflag > 0) { - exit(EXIT_FAILURE); - } - -} - -/* - returns coordinates in decimal degrees given the - coord as a ddmm value stored in an integer. -*/ -double getcoord(int coord) { - int west = 1; - double glg, deg; - if (coord < 0) west = -1; - glg = fabs((double) coord/100); - deg = floor(glg); - glg = west* (deg + (glg - deg)*100 / 60); - return(glg); -} - -/* - days() takes the year, month, day in the month and decimal hours - in the day and returns the number of days since J2000.0. - Assumes Gregorian calendar. -*/ -double days(int y, int m, int d, double h) { - int a, b; - double day; - - /* - The lines below work from 1900 march to feb 2100 - a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9 + d; - day = (double)a - 730531.5 + hour / 24; - */ - - /* These lines work for any Gregorian date since 0 AD */ - if (m ==1 || m==2) { - m +=12; - y -= 1; - } - a = y / 100; - b = 2 - a + a/4; - day = floor(365.25*(y + 4716)) + floor(30.6001*(m + 1)) - + d + b - 1524.5 - 2451545 + h/24; - return(day); -} -double days_(int *y0, int *m0, int *d0, double *h0) -{ - return days(*y0,*m0,*d0,*h0); -} - -/* -Returns 1 if y a leap year, and 0 otherwise, according -to the Gregorian calendar -*/ -int isleap(int y) { - int a = 0; - if(y % 4 == 0) a = 1; - if(y % 100 == 0) a = 0; - if(y % 400 == 0) a = 1; - return(a); -} - -/* -Given the year and the month, function returns the -number of days in the month. Valid for Gregorian -calendar. -*/ -int daysinmonth(int y, int m) { - int b = 31; - if(m == 2) { - if(isleap(y) == 1) b= 29; - else b = 28; - } - if(m == 4 || m == 6 || m == 9 || m == 11) b = 30; - return(b); -} - -/* -moonpos() takes days from J2000.0 and returns ecliptic coordinates -of moon in the pointers. Note call by reference. -This function is within a couple of arcminutes most of the time, -and is truncated from the Meeus Ch45 series, themselves truncations of -ELP-2000. Returns moon distance in earth radii. -Terms have been written out explicitly rather than using the -table based method as only a small number of terms is -retained. -*/ -void moonpos(double d, double *lambda, double *beta, double *rvec) { - double dl, dB, dR, L, D, M, M1, F, e, lm, bm, rm, t; - - t = d / 36525; - - L = range(218.3164591 + 481267.88134236 * t) * RADS; - D = range(297.8502042 + 445267.1115168 * t) * RADS; - M = range(357.5291092 + 35999.0502909 * t) * RADS; - M1 = range(134.9634114 + 477198.8676313 * t - .008997 * t * t) * RADS; - F = range(93.27209929999999 + 483202.0175273 * t - .0034029*t*t)*RADS; - e = 1 - .002516 * t; - - dl = 6288774 * sin(M1); - dl += 1274027 * sin(2 * D - M1); - dl += 658314 * sin(2 * D); - dl += 213618 * sin(2 * M1); - dl -= e * 185116 * sin(M); - dl -= 114332 * sin(2 * F) ; - dl += 58793 * sin(2 * D - 2 * M1); - dl += e * 57066 * sin(2 * D - M - M1) ; - dl += 53322 * sin(2 * D + M1); - dl += e * 45758 * sin(2 * D - M); - dl -= e * 40923 * sin(M - M1); - dl -= 34720 * sin(D) ; - dl -= e * 30383 * sin(M + M1) ; - dl += 15327 * sin(2 * D - 2 * F) ; - dl -= 12528 * sin(M1 + 2 * F); - dl += 10980 * sin(M1 - 2 * F); - lm = rangerad(L + dl / 1000000 * RADS); - - dB = 5128122 * sin(F); - dB += 280602 * sin(M1 + F); - dB += 277693 * sin(M1 - F); - dB += 173237 * sin(2 * D - F); - dB += 55413 * sin(2 * D - M1 + F); - dB += 46271 * sin(2 * D - M1 - F); - dB += 32573 * sin(2 * D + F); - dB += 17198 * sin(2 * M1 + F); - dB += 9266 * sin(2 * D + M1 - F); - dB += 8822 * sin(2 * M1 - F); - dB += e * 8216 * sin(2 * D - M - F); - dB += 4324 * sin(2 * D - 2 * M1 - F); - bm = dB / 1000000 * RADS; - - dR = -20905355 * cos(M1); - dR -= 3699111 * cos(2 * D - M1); - dR -= 2955968 * cos(2 * D); - dR -= 569925 * cos(2 * M1); - dR += e * 48888 * cos(M); - dR -= 3149 * cos(2 * F); - dR += 246158 * cos(2 * D - 2 * M1); - dR -= e * 152138 * cos(2 * D - M - M1) ; - dR -= 170733 * cos(2 * D + M1); - dR -= e * 204586 * cos(2 * D - M); - dR -= e * 129620 * cos(M - M1); - dR += 108743 * cos(D); - dR += e * 104755 * cos(M + M1); - dR += 79661 * cos(M1 - 2 * F); - rm = 385000.56 + dR / 1000; - - *lambda = lm; - *beta = bm; - /* distance to Moon must be in Earth radii */ - *rvec = rm / 6378.14; -} - -/* -topomoon() takes the local siderial time, the geographical -latitude of the observer, and pointers to the geocentric -equatorial coordinates. The function overwrites the geocentric -coordinates with topocentric coordinates on a simple spherical -earth model (no polar flattening). Expects Moon-Earth distance in -Earth radii. Formulas scavenged from Astronomical Almanac 'low -precision formulae for Moon position' page D46. -*/ - -void topo(double lst, double glat, double *alp, double *dec, double *r) { - double x, y, z, r1; - x = *r * cos(*dec) * cos(*alp) - cos(glat) * cos(lst); - y = *r * cos(*dec) * sin(*alp) - cos(glat) * sin(lst); - z = *r * sin(*dec) - sin(glat); - r1 = sqrt(x*x + y*y + z*z); - *alp = atan22(y, x); - *dec = asin(z / r1); - *r = r1; -} - -/* -moontransit() takes date, the time zone and geographic longitude -of observer and returns the time (decimal hours) of lunar transit -on that day if there is one, and sets the notransit flag if there -isn't. See Explanatory Supplement to Astronomical Almanac -section 9.32 and 9.31 for the method. -*/ - -double moontransit(int y, int m, int d, double tz, double glat, double glong, int *notransit) { - double hm, ht, ht1, lon, lat, rv, dnew, lst; - int itcount; - - ht1 = 180 * RADS; - ht = 0; - itcount = 0; - *notransit = 0; - do { - ht = ht1; - itcount++; - dnew = days(y, m, d, ht * DEGS/15) - tz/24; - lst = gst(dnew) + glong; - /* find the topocentric Moon ra (hence hour angle) and dec */ - moonpos(dnew, &lon, &lat, &rv); - equatorial(dnew, &lon, &lat, &rv); - topo(lst, glat, &lon, &lat, &rv); - hm = rangerad(lst - lon); - ht1 = rangerad(ht - hm); - /* if no convergence, then no transit on that day */ - if (itcount > 30) { - *notransit = 1; - break; - } - } - while (fabs(ht - ht1) > 0.04 * RADS); - return(ht1); -} - -/* - Calculates the selenographic coordinates of either the sub Earth point - (optical libration) or the sub-solar point (selen. coords of centre of - bright hemisphere). Based on Meeus chapter 51 but neglects physical - libration and nutation, with some simplification of the formulas. -*/ -void libration(double day, double lambda, double beta, double alpha, double *l, double *b, double *p) { - double i, f, omega, w, y, x, a, t, eps; - t = day / 36525; - i = 1.54242 * RADS; - eps = epsilon(day); - f = range(93.2720993 + 483202.0175273 * t - .0034029 * t * t) * RADS; - omega = range(125.044555 - 1934.1361849 * t + .0020762 * t * t) * RADS; - w = lambda - omega; - y = sin(w) * cos(beta) * cos(i) - sin(beta) * sin(i); - x = cos(w) * cos(beta); - a = atan22(y, x); - *l = a - f; - - /* kludge to catch cases of 'round the back' angles */ - if (*l < -90 * RADS) *l += TPI; - if (*l > 90 * RADS) *l -= TPI; - *b = asin(-sin(w) * cos(beta) * sin(i) - sin(beta) * cos(i)); - - /* pa pole axis - not used for Sun stuff */ - x = sin(i) * sin(omega); - y = sin(i) * cos(omega) * cos(eps) - cos(i) * sin(eps); - w = atan22(x, y); - *p = rangerad(asin(sqrt(x*x + y*y) * cos(alpha - w) / cos(*b))); -} - -/* - Takes: days since J2000.0, eq coords Moon, ratio of moon to sun distance, - eq coords Sun - Returns: position angle of bright limb wrt NCP, percentage illumination - of Sun -*/ -void illumination(double day, double lra, double ldec, double dr, double sra, double sdec, double *pabl, double *ill) { - double x, y, phi, i; - y = cos(sdec) * sin(sra - lra); - x = sin(sdec) * cos(ldec) - cos(sdec) * sin(ldec) * cos (sra - lra); - *pabl = atan22(y, x); - phi = acos(sin(sdec) * sin(ldec) + cos(sdec) * cos(ldec) * cos(sra-lra)); - i = atan22(sin(phi) , (dr - cos(phi))); - *ill = 0.5*(1 + cos(i)); -} - -/* -sunpos() takes days from J2000.0 and returns ecliptic longitude -of Sun in the pointers. Latitude is zero at this level of precision, -but pointer left in for consistency in number of arguments. -This function is within 0.01 degree (1 arcmin) almost all the time -for a century either side of J2000.0. This is from the 'low precision -fomulas for the Sun' from C24 of Astronomical Alamanac -*/ -void sunpos(double d, double *lambda, double *beta, double *rvec) { - double L, g, ls, bs, rs; - - L = range(280.461 + .9856474 * d) * RADS; - g = range(357.528 + .9856003 * d) * RADS; - ls = L + (1.915 * sin(g) + .02 * sin(2 * g)) * RADS; - bs = 0; - rs = 1.00014 - .01671 * cos(g) - .00014 * cos(2 * g); - *lambda = ls; - *beta = bs; - *rvec = rs; -} - -/* -this routine returns the altitude given the days since J2000.0 -the hour angle and declination of the object and the latitude -of the observer. Used to find the Sun's altitude to put a letter -code on the transit time, and to find the Moon's altitude at -transit just to make sure that the Moon is visible. -*/ -double alt(double glat, double ha, double dec) { - return(asin(sin(dec) * sin(glat) + cos(dec) * cos(glat) * cos(ha))); -} - -/* returns an angle in degrees in the range 0 to 360 */ -double range(double x) { - double a, b; - b = x / 360; - a = 360 * (b - floor(b)); - if (a < 0) - a = 360 + a; - return(a); -} - -/* returns an angle in rads in the range 0 to two pi */ -double rangerad(double x) { - double a, b; - b = x / TPI; - a = TPI * (b - floor(b)); - if (a < 0) - a = TPI + a; - return(a); -} - -/* -gets the atan2 function returning angles in the right -order and range -*/ -double atan22(double y, double x) { - double a; - - a = atan2(y, x); - if (a < 0) a += TPI; - return(a); -} - -/* -returns mean obliquity of ecliptic in radians given days since -J2000.0. -*/ -double epsilon(double d) { - double t = d/ 36525; - return((23.4392911111111 - (t* (46.8150 + 0.00059*t)/3600)) *RADS); -} - -/* -replaces ecliptic coordinates with equatorial coordinates -note: call by reference destroys original values -R is unchanged. -*/ -void equatorial(double d, double *lon, double *lat, double *r) { - double eps, ceps, seps, l, b; - - l = *lon; - b = * lat; - eps = epsilon(d); - ceps = cos(eps); - seps = sin(eps); - *lon = atan22(sin(l)*ceps - tan(b)*seps, cos(l)); - *lat = asin(sin(b)*ceps + cos(b)*seps*sin(l)); -} - -/* -replaces equatorial coordinates with ecliptic ones. Inverse -of above, but used to find topocentric ecliptic coords. -*/ -void ecliptic(double d, double *lon, double *lat, double *r) { - double eps, ceps, seps, alp, dec; - alp = *lon; - dec = *lat; - eps = epsilon(d); - ceps = cos(eps); - seps = sin(eps); - *lon = atan22(sin(alp)*ceps + tan(dec)*seps, cos(alp)); - *lat = asin(sin(dec)*ceps - cos(dec)*seps*sin(alp)); -} - -/* -returns the siderial time at greenwich meridian as -an angle in radians given the days since J2000.0 -*/ -double gst( double d) { - double t = d / 36525; - double theta; - theta = range(280.46061837 + 360.98564736629 * d + 0.000387933 * t * t); - return(theta * RADS); -} - -void tmoonsub_(double *day, double *glat, double *glong, double *moonalt, - double *mrv, double *l, double *b, double *paxis) -{ - double mlambda, mbeta; - double malpha, mdelta; - double lst, mhr; - double tlambda, tbeta, trv; - - lst = gst(*day) + *glong; - - /* find Moon topocentric coordinates for libration calculations */ - - moonpos(*day, &mlambda, &mbeta, mrv); - malpha = mlambda; - mdelta = mbeta; - equatorial(*day, &malpha, &mdelta, mrv); - topo(lst, *glat, &malpha, &mdelta, mrv); - mhr = rangerad(lst - malpha); - *moonalt = alt(*glat, mhr, mdelta); - - /* Optical libration and Position angle of the Pole */ - - tlambda = malpha; - tbeta = mdelta; - trv = *mrv; - ecliptic(*day, &tlambda, &tbeta, &trv); - libration(*day, tlambda, tbeta, malpha, l, b, paxis); -} diff --git a/q65w/libm65/usleep.c b/q65w/libm65/usleep.c deleted file mode 100644 index 21d242a68..000000000 --- a/q65w/libm65/usleep.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -/* usleep(3) */ -void usleep_(unsigned long *microsec) -{ - usleep(*microsec); -} diff --git a/q65w/libm65/wrapkarn.c b/q65w/libm65/wrapkarn.c deleted file mode 100644 index 9e0a51caf..000000000 --- a/q65w/libm65/wrapkarn.c +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include -#include -#include -#include "rs.h" - -static void *rs; -static int first=1; - -void rs_encode_(int *dgen, int *sent) -// Encode JT65 data dgen[12], producing sent[63]. -{ - int dat1[12]; - int b[51]; - int i; - - if(first) { - // Initialize the JT65 codec - rs=init_rs_int(6,0x43,3,1,51,0); - first=0; - } - - // Reverse data order for the Karn codec. - for(i=0; i<12; i++) { - dat1[i]=dgen[11-i]; - } - // Compute the parity symbols - encode_rs_int(rs,dat1,b); - - // Move parity symbols and data into sent[] array, in reverse order. - for (i = 0; i < 51; i++) sent[50-i] = b[i]; - for (i = 0; i < 12; i++) sent[i+51] = dat1[11-i]; -} - -void rs_decode_(int *recd0, int *era0, int *numera0, int *decoded, int *nerr) -// Decode JT65 received data recd0[63], producing decoded[12]. -// Erasures are indicated in era0[numera]. The number of corrected -// errors is *nerr. If the data are uncorrectable, *nerr=-1 is returned. -{ - int numera; - int i; - int era_pos[50]; - int recd[63]; - - if(first) { - rs=init_rs_int(6,0x43,3,1,51,0); - first=0; - } - - numera=*numera0; - for(i=0; i<12; i++) recd[i]=recd0[62-i]; - for(i=0; i<51; i++) recd[12+i]=recd0[50-i]; - if(numera) - for(i=0; i Date: Mon, 12 Dec 2022 11:42:54 -0500 Subject: [PATCH 089/251] More pruning ... --- q65w/libm65/CMakeLists.txt | 1 - q65w/libm65/decode0.f90 | 6 ++---- q65w/libm65/map65a.f90 | 38 +++----------------------------------- q65w/libm65/symspec.f90 | 6 ++---- 4 files changed, 7 insertions(+), 44 deletions(-) diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index bc47030fb..7779289ab 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -20,7 +20,6 @@ set (libm65_FSRCS ftnquit.f90 q65b.f90 geocentric.f90 - getdphi.f90 getpfx1.f90 getpfx2.f90 graycode.f90 diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index b3c017a33..ae52c7c1a 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -40,8 +40,6 @@ subroutine decode0(dd,ss,savg,nstandalone) enddo 10 rmsdd=1.5*i endif - ndphi=0 - if(iand(nrxlog,8).ne.0) ndphi=1 if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0 .or. & hisgrid.ne.hisgrid0 .or. mcall3.ne.0 .or. neme.ne.neme0) mcall3b=1 @@ -52,8 +50,8 @@ subroutine decode0(dd,ss,savg,nstandalone) neme0=neme call timer('map65a ',0) - call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & + call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 index f3bd5aa5b..a52d6c95d 100644 --- a/q65w/libm65/map65a.f90 +++ b/q65w/libm65/map65a.f90 @@ -1,5 +1,5 @@ -subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & +subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) @@ -82,23 +82,16 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & mcall3a=mcall3b mousefqso0=mousefqso - if(.not.xpol) ndphi=0 nsum=0 -!### Should use AppDir! ### -! open(23,file='CALL3.TXT',status='unknown') - df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz if(nfsample.eq.95238) df=95238.1/NFFT ftol=0.010 !Frequency tolerance (kHz) - dphi=idphi/57.2957795 foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) iloop=0 -2 if(ndphi.eq.1) dphi=30*iloop/57.2957795 - - if(nutc.ne.nutc0) nfile=nfile+1 +2 if(nutc.ne.nutc0) nfile=nfile+1 nutc0=nutc nqd=0 @@ -204,39 +197,14 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & decoded(1:4).eq.'73 ') then nsync2=nint(1.33*s2db + 2.0) endif - - if(nxant.ne.0) then - npol=npol-45 - if(npol.lt.0) npol=npol+180 - endif - - cmode='#A' - if(mode65.eq.2) cmode='#B' - if(mode65.eq.4) cmode='#C' -! write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & -! nsync2,nutc,decoded,cp,cmode -!1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) - ndecodes=ndecodes+1 -! write(21,1100) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & -! cmode(1:1),cmode(2:2) -!1100 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) endif - endif j=j+nsiz(n) enddo !i=1,km - -! write(26,1015) nutc -!1015 format(37x,i6.4,' ') -! call flush(21) -! call flush(26) -! call display(nkeep,ftol) ndecdone=2 900 continue -! close(23) call flush(12) - ndphi=0 mcall3b=mcall3a return diff --git a/q65w/libm65/symspec.f90 b/q65w/libm65/symspec.f90 index 55aa3110c..1a0dd90a6 100644 --- a/q65w/libm65/symspec.f90 +++ b/q65w/libm65/symspec.f90 @@ -26,7 +26,7 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) - complex z,zfac + complex z complex zsumx,zsumy complex cx(NFFT),cy(NFFT) complex cx00(NFFT),cy00(NFFT) @@ -113,8 +113,6 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & i=0 fac=0.0002 - dphi=idphi/57.2957795 - zfac=fac*cmplx(cos(dphi),sin(dphi)) do j=ja,jb !Copy data into cx, cy x1=dd(1,j) x2=dd(2,j) @@ -127,7 +125,7 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & endif i=i+1 cx(i)=fac*cmplx(x1,x2) - cy(i)=zfac*cmplx(x3,x4) !NB: cy includes dphi correction + cy(i)=cmplx(x3,x4) !NB: cy includes dphi correction enddo if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then From 7b3587fcfd8cf51cdb040022fc5d509543527ac5 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 11:57:59 -0500 Subject: [PATCH 090/251] Pruning continues... --- q65w/libm65/CMakeLists.txt | 5 -- q65w/libm65/astro.f90 | 2 +- q65w/libm65/ftninit.f90 | 1 - q65w/libm65/getpfx1.f90 | 96 -------------------------------------- q65w/libm65/getpfx2.f90 | 24 ---------- q65w/libm65/k2grid.f90 | 12 ----- q65w/libm65/nchar.f90 | 23 --------- q65w/libm65/pfxdump.f90 | 13 ------ 8 files changed, 1 insertion(+), 175 deletions(-) delete mode 100644 q65w/libm65/getpfx1.f90 delete mode 100644 q65w/libm65/getpfx2.f90 delete mode 100644 q65w/libm65/k2grid.f90 delete mode 100644 q65w/libm65/nchar.f90 delete mode 100644 q65w/libm65/pfxdump.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index 7779289ab..c39385b1f 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -20,8 +20,6 @@ set (libm65_FSRCS ftnquit.f90 q65b.f90 geocentric.f90 - getpfx1.f90 - getpfx2.f90 graycode.f90 grid2deg.f90 grid2k.f90 @@ -29,14 +27,11 @@ set (libm65_FSRCS interleave63.f90 iqcal.f90 iqfix.f90 - k2grid.f90 lorentzian.f90 m65c.f90 map65a.f90 moon2.f90 moondop.f90 - nchar.f90 - pfxdump.f90 recvpkt.f90 rfile3a.f90 s3avg.f90 diff --git a/q65w/libm65/astro.f90 b/q65w/libm65/astro.f90 index d34819cc6..cf59bf27f 100644 --- a/q65w/libm65/astro.f90 +++ b/q65w/libm65/astro.f90 @@ -43,7 +43,7 @@ subroutine astro(nyear,month,nday,uth,nfreq,Mygrid,NStation,MoonDX, & if(nfreq.eq.2) freq=1.8e6 if(nfreq.eq.4) freq=3.5e6 - call MoonDop(nyear,month,nday,uth,lon,lat,RAMoon,DecMoon,LST,HA, & + call moondop(nyear,month,nday,uth,lon,lat,RAMoon,DecMoon,LST,HA, & AzMoon,ElMoon,vr,dist) ! Compute spatial polarization offset diff --git a/q65w/libm65/ftninit.f90 b/q65w/libm65/ftninit.f90 index c25c04f57..2741d662c 100644 --- a/q65w/libm65/ftninit.f90 +++ b/q65w/libm65/ftninit.f90 @@ -15,7 +15,6 @@ subroutine ftninit appd='.' addpfx=' ' - call pfxdump(appd//'/prefixes.txt') open(12,file=appd//'/q65w_decodes.txt',status='unknown') open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') diff --git a/q65w/libm65/getpfx1.f90 b/q65w/libm65/getpfx1.f90 deleted file mode 100644 index 40fcc369c..000000000 --- a/q65w/libm65/getpfx1.f90 +++ /dev/null @@ -1,96 +0,0 @@ -subroutine getpfx1(callsign,k,nv2) - - character*12 callsign0,callsign,lof,rof - character*8 c - character addpfx*8,tpfx*4,tsfx*3 - logical ispfx,issfx,invalid - common/pfxcom/addpfx - include 'pfx.f90' - - callsign0=callsign - nv2=0 - iz=index(callsign,' ') - 1 - if(iz.lt.0) iz=12 - islash=index(callsign(1:iz),'/') - k=0 - c=' ' - if(islash.gt.0 .and. islash.le.(iz-4)) then -! Add-on prefix - c=callsign(1:islash-1) - callsign=callsign(islash+1:iz) - do i=1,NZ - if(pfx(i)(1:4).eq.c) then - k=i - go to 10 - endif - enddo - if(addpfx.eq.c) then - k=449 - go to 10 - endif - - else if(islash.eq.(iz-1)) then -! Add-on suffix - c=callsign(islash+1:iz) - callsign=callsign(1:islash-1) - do i=1,NZ2 - if(sfx(i).eq.c(1:1)) then - k=400+i - go to 10 - endif - enddo - endif - -10 if(islash.ne.0 .and.k.eq.0) then -! Original JT65 would force this compound callsign to be treated as -! plain text. In JT65v2, we will encode the prefix or suffix into nc1. -! The task here is to compute the proper value of k. - lof=callsign0(:islash-1) - rof=callsign0(islash+1:) - llof=len_trim(lof) - lrof=len_trim(rof) - ispfx=(llof.gt.0 .and. llof.le.4) - issfx=(lrof.gt.0 .and. lrof.le.3) - invalid=.not.(ispfx.or.issfx) - if(ispfx.and.issfx) then - if(llof.lt.3) issfx=.false. - if(lrof.lt.3) ispfx=.false. - if(ispfx.and.issfx) then - i=ichar(callsign0(islash-1:islash-1)) - if(i.ge.ichar('0') .and. i.le.ichar('9')) then - issfx=.false. - else - ispfx=.false. - endif - endif - endif - - if(invalid) then - k=-1 - else - if(ispfx) then - tpfx=lof(1:4) - k=nchar(tpfx(1:1)) - k=37*k + nchar(tpfx(2:2)) - k=37*k + nchar(tpfx(3:3)) - k=37*k + nchar(tpfx(4:4)) - nv2=1 - i=index(callsign0,'/') - callsign=callsign0(:i-1) - callsign=callsign0(i+1:) - endif - if(issfx) then - tsfx=rof(1:3) - k=nchar(tsfx(1:1)) - k=37*k + nchar(tsfx(2:2)) - k=37*k + nchar(tsfx(3:3)) - nv2=2 - i=index(callsign0,'/') - callsign=callsign0(:i-1) - endif - endif - endif - - return -end subroutine getpfx1 - diff --git a/q65w/libm65/getpfx2.f90 b/q65w/libm65/getpfx2.f90 deleted file mode 100644 index d747e7f29..000000000 --- a/q65w/libm65/getpfx2.f90 +++ /dev/null @@ -1,24 +0,0 @@ -subroutine getpfx2(k0,callsign) - - character callsign*12 - include 'pfx.f90' - character addpfx*8 - common/pfxcom/addpfx - - k=k0 - if(k.gt.450) k=k-450 - if(k.ge.1 .and. k.le.NZ) then - iz=index(pfx(k),' ') - 1 - callsign=pfx(k)(1:iz)//'/'//callsign - else if(k.ge.401 .and. k.le.400+NZ2) then - iz=index(callsign,' ') - 1 - callsign=callsign(1:iz)//'/'//sfx(k-400) - else if(k.eq.449) then - iz=index(addpfx,' ') - 1 - if(iz.lt.1) iz=8 - callsign=addpfx(1:iz)//'/'//callsign - endif - - return -end subroutine getpfx2 - diff --git a/q65w/libm65/k2grid.f90 b/q65w/libm65/k2grid.f90 deleted file mode 100644 index aa7631579..000000000 --- a/q65w/libm65/k2grid.f90 +++ /dev/null @@ -1,12 +0,0 @@ -subroutine k2grid(k,grid) - character grid*6 - - nlong=2*mod((k-1)/5,90)-179 - if(k.gt.450) nlong=nlong+180 - nlat=mod(k-1,5)+ 85 - dlat=nlat - dlong=nlong - call deg2grid(dlong,dlat,grid) - - return -end subroutine k2grid diff --git a/q65w/libm65/nchar.f90 b/q65w/libm65/nchar.f90 deleted file mode 100644 index 21593bd13..000000000 --- a/q65w/libm65/nchar.f90 +++ /dev/null @@ -1,23 +0,0 @@ -function nchar(c) - -! Convert ascii number, letter, or space to 0-36 for callsign packing. - - character c*1 - - n=0 !Silence compiler warning - if(c.ge.'0' .and. c.le.'9') then - n=ichar(c)-ichar('0') - else if(c.ge.'A' .and. c.le.'Z') then - n=ichar(c)-ichar('A') + 10 - else if(c.ge.'a' .and. c.le.'z') then - n=ichar(c)-ichar('a') + 10 - else if(c.ge.' ') then - n=36 - else - Print*,'Invalid character in callsign ',c,' ',ichar(c) - call exit(1) - endif - nchar=n - - return -end function nchar diff --git a/q65w/libm65/pfxdump.f90 b/q65w/libm65/pfxdump.f90 deleted file mode 100644 index 7587dbf72..000000000 --- a/q65w/libm65/pfxdump.f90 +++ /dev/null @@ -1,13 +0,0 @@ -subroutine pfxdump(fname) - character*(*) fname - include 'pfx.f90' - - open(11,file=fname,status='unknown') - write(11,1001) sfx -1001 format('Supported Suffixes:'/(11('/',a1,2x))) - write(11,1002) pfx -1002 format(/'Supported Add-On DXCC Prefixes:'/(15(a5,1x))) - close(11) - - return -end subroutine pfxdump From d2034e7c713db63122c07a613b20965490eb7ea9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 12:22:52 -0500 Subject: [PATCH 091/251] Cleanup and renaming map65a --> q65wa. --- q65w/libm65/CMakeLists.txt | 10 +- q65w/libm65/decode0.f90 | 10 +- q65w/libm65/map65a.f90 | 211 ------------------------------------- q65w/libm65/q65wa.f90 | 134 +++++++++++++++++++++++ 4 files changed, 140 insertions(+), 225 deletions(-) delete mode 100644 q65w/libm65/map65a.f90 create mode 100644 q65w/libm65/q65wa.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index c39385b1f..de5af0415 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -29,24 +29,16 @@ set (libm65_FSRCS iqfix.f90 lorentzian.f90 m65c.f90 - map65a.f90 moon2.f90 moondop.f90 + q65wa.f90 recvpkt.f90 - rfile3a.f90 - s3avg.f90 - set.f90 - shell.f90 - sleep_msec.f90 - smo.f90 sun.f90 symspec.f90 timf2.f90 tm2.f90 toxyz.f90 trimlist.f90 - twkfreq.f90 - twkfreq_xy.f90 wavhdr.f90 f77_wisdom.f diff --git a/q65w/libm65/decode0.f90 b/q65w/libm65/decode0.f90 index ae52c7c1a..27eae0769 100644 --- a/q65w/libm65/decode0.f90 +++ b/q65w/libm65/decode0.f90 @@ -49,13 +49,13 @@ subroutine decode0(dd,ss,savg,nstandalone) hisgrid0=hisgrid neme0=neme - call timer('map65a ',0) - call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & + call timer('q65wa ',0) + call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & - neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & + nfcal,mcall3b,nsum,nxant,mycall,mygrid, & + hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) - call timer('map65a ',1) + call timer('q65wa ',1) flush(6) return diff --git a/q65w/libm65/map65a.f90 b/q65w/libm65/map65a.f90 deleted file mode 100644 index a52d6c95d..000000000 --- a/q65w/libm65/map65a.f90 +++ /dev/null @@ -1,211 +0,0 @@ -subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & - neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00) - -! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. - - use wideband_sync - use timer_module, only: timer - - parameter (MAXMSG=1000) !Size of decoded message list - parameter (NSMAX=60*96000) - complex cx(NSMAX/64), cy(NSMAX/64) !Data at 1378.125 samples/s - real dd(4,NSMAX) - real*4 ss(4,322,NFFT),savg(NFFT) - real tavg(-50:50) !Temp for finding local base level - real base(4) !Local basel level at 4 pol'ns - real sig(MAXMSG,30) !Parameters of detected signals - real a(5) - real*8 fcenter - character*22 msg(MAXMSG) - character*3 shmsg0(4) - character mycall*12,hiscall*12,mygrid*6,hisgrid*6,cp*1,cm*1 - integer indx(MAXMSG),nsiz(MAXMSG) - logical done(MAXMSG) - logical xpol,bq65,q65b_called - logical candec(MAX_CANDIDATES) - logical ldecoded - character decoded*22,blank*22,cmode*2 - real short(3,NFFT) !SNR dt ipol for potential shorthands - real qphi(12) - type(candidate) :: cand(MAX_CANDIDATES) - character*60 result - common/decodes/ndecodes,ncand,result(50) - common/c3com/ mcall3a - common/testcom/ifreq - common/early/nhsym1,nhsym2,ldecoded(32768) - - data blank/' '/,cm/'#'/ - data shmsg0/'ATT','RO ','RRR','73 '/ - data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ - save - - rewind 12 - -! Clean start for Q65 at early decode - if(nhsym.eq.nhsym1 .or. nagain.ne.0) ldecoded=.false. - if(ndiskdat.eq.1) ldecoded=.false. - - nkhz_center=nint(1000.0*(fcenter-int(fcenter))) - mfa=nfa-nkhz_center+48 - mfb=nfb-nkhz_center+48 - mode65=mod(nmode,10) - if(mode65.eq.3) mode65=4 - mode_q65=nmode/10 - nts_jt65=mode65 !JT65 tone separation factor - nts_q65=2**(mode_q65-1) !Q65 tone separation factor - xpol=(nxpol.ne.0) - -! No second decode for JT65? - if(nhsym.eq.nhsym2 .and. nagain.eq.0 .and.ndiskdat.eq.0) mode65=0 - - if(nagain.eq.0) then - call timer('get_cand',0) - call get_candidates(ss,savg,xpol,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) - call timer('get_cand',1) - candec=.false. - endif -!### -! do k=1,ncand -! freq=cand(k)%f+nkhz_center-48.0 -! ipk=cand(k)%indx -! write(71,3071) k,db(cand(k)%snr),freq,cand(k)%xdt, & -! cand(k)%ipol,cand(k)%iflip,ipk,ldecoded(ipk) -!3071 format(i3,f8.2,f10.3,f8.2,2i3,i6,L4) -! enddo -!### - - nwrite_q65=0 - bq65=mode_q65.gt.0 - - mcall3a=mcall3b - mousefqso0=mousefqso - nsum=0 - - df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz - if(nfsample.eq.95238) df=95238.1/NFFT - ftol=0.010 !Frequency tolerance (kHz) - foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL - fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) - iloop=0 - -2 if(nutc.ne.nutc0) nfile=nfile+1 - nutc0=nutc - - nqd=0 - fa=-1000*0.5*(nfb-nfa) + 1000*nfshift - fb= 1000*0.5*(nfb-nfa) + 1000*nfshift - ia=nint(fa/df) + 16385 - ib=nint(fb/df) + 16385 - ia=max(51,ia) - ib=min(32768-51,ib) - if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia - - km=0 - nkm=1 - nz=n/8 - freq0=-999. - sync10=-999. - fshort0=-999. - syncshort0=-999. - ntry=0 - short=0. !Zero the whole short array - jpz=1 - - call timer('filbig ',0) - call filbig(dd,NSMAX,f0,newdat,nfsample,xpol,cx,cy,n5) - call timer('filbig ',1) - - if(nqd.eq.0 .and. bq65) then -! Do the wideband Q65 decode - do icand=1,ncand - if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here - if(candec(icand)) cycle !Skip if already decoded - freq=cand(icand)%f+nkhz_center-48.0-1.27046 -!###! If here at nqd=1, do only candidates at mousefqso +/- ntol -!### if(nqd.eq.1 .and. abs(freq-mousefqso).gt.0.001*ntol) cycle - ikhz=nint(freq) - f0=cand(icand)%f - call timer('q65b ',0) - call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & - xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,nhsym,ndop00,idec) - call timer('q65b ',1) - if(idec.ge.0) candec(icand)=.true. - enddo ! icand - endif - call sec0(1,tsec0) - -! Trim the list and produce a sorted index and sizes of groups. -! (Should trimlist remove all but best SNR for given UTC and message content?) -700 call trimlist(sig,km,ftol,indx,nsiz,nz) - done(1:km)=.false. - j=0 - ilatest=-1 - do n=1,nz - ifile0=0 - do m=1,nsiz(n) - i=indx(j+m) - ifile=sig(i,1) - if(ifile.gt.ifile0 .and.msg(i).ne.blank) then - ilatest=i - ifile0=ifile - endif - enddo - i=ilatest - - if(i.ge.1) then - if(.not.done(i)) then - done(i)=.true. - nutc=sig(i,2) - freq=sig(i,3) - sync1=sig(i,4) - dt=sig(i,5) - npol=nint(57.2957795*sig(i,6)) - flip=sig(i,7) - sync2=sig(i,8) - nkv=sig(i,9) - nqual=min(sig(i,10),10.0) -! rms0=sig(i,11) - do k=1,5 - a(k)=sig(i,12+k) - enddo - nhist=sig(i,18) - decoded=msg(i) - - if(flip.lt.0.0) then - do i=22,1,-1 - if(decoded(i:i).ne.' ') go to 10 - enddo - stop 'Error in message format' -10 if(i.le.18) decoded(i+2:i+4)='OOO' - endif - mhz=fcenter !... +fadd ??? - nkHz=nint(freq-foffset)-nfshift - f0=mhz+0.001*nkHz - ndf=nint(1000.0*(freq-foffset-(nkHz+nfshift))) - ndf0=nint(a(1)) - ndf1=nint(a(2)) - ndf2=nint(a(3)) - nsync1=sync1 - - s2db=10.0*log10(sync2) - 40 !### empirical ### - nsync2=nint(s2db) - if(decoded(1:4).eq.'RO ' .or. decoded(1:4).eq.'RRR ' .or. & - decoded(1:4).eq.'73 ') then - nsync2=nint(1.33*s2db + 2.0) - endif - endif - endif - j=j+nsiz(n) - enddo !i=1,km - ndecdone=2 - -900 continue - call flush(12) - mcall3b=mcall3a - - return -end subroutine map65a diff --git a/q65w/libm65/q65wa.f90 b/q65w/libm65/q65wa.f90 new file mode 100644 index 000000000..6c7ef681a --- /dev/null +++ b/q65w/libm65/q65wa.f90 @@ -0,0 +1,134 @@ +subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & + mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & + nfcal,mcall3b,nsum,nxant,mycall,mygrid, & + hiscall,hisgrid,nhsym,nfsample, & + ndiskdat,nxpol,nmode,ndop00) + +! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. + + use wideband_sync + use timer_module, only: timer + + parameter (MAXMSG=1000) !Size of decoded message list + parameter (NSMAX=60*96000) + complex cx(NSMAX/64), cy(NSMAX/64) !Data at 1378.125 samples/s + real dd(4,NSMAX) + real*4 ss(4,322,NFFT),savg(NFFT) + real*8 fcenter + character*3 shmsg0(4) + character mycall*12,hiscall*12,mygrid*6,hisgrid*6,cm*1 + logical xpol,bq65 + logical candec(MAX_CANDIDATES) + logical ldecoded + character blank*22 + real short(3,NFFT) !SNR dt ipol for potential shorthands + type(candidate) :: cand(MAX_CANDIDATES) + character*60 result + common/decodes/ndecodes,ncand,result(50) + common/c3com/ mcall3a + common/testcom/ifreq + common/early/nhsym1,nhsym2,ldecoded(32768) + + data blank/' '/,cm/'#'/ + data shmsg0/'ATT','RO ','RRR','73 '/ + data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ + save + + rewind 12 + +! Clean start for Q65 at early decode + if(nhsym.eq.nhsym1 .or. nagain.ne.0) ldecoded=.false. + if(ndiskdat.eq.1) ldecoded=.false. + + nkhz_center=nint(1000.0*(fcenter-int(fcenter))) + mfa=nfa-nkhz_center+48 + mfb=nfb-nkhz_center+48 + mode65=mod(nmode,10) + if(mode65.eq.3) mode65=4 + mode_q65=nmode/10 + nts_jt65=mode65 !JT65 tone separation factor + nts_q65=2**(mode_q65-1) !Q65 tone separation factor + xpol=(nxpol.ne.0) + +! No second decode for JT65? + if(nhsym.eq.nhsym2 .and. nagain.eq.0 .and.ndiskdat.eq.0) mode65=0 + + if(nagain.eq.0) then + call timer('get_cand',0) + call get_candidates(ss,savg,xpol,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + candec=.false. + endif +!### +! do k=1,ncand +! freq=cand(k)%f+nkhz_center-48.0 +! ipk=cand(k)%indx +! write(71,3071) k,db(cand(k)%snr),freq,cand(k)%xdt, & +! cand(k)%ipol,cand(k)%iflip,ipk,ldecoded(ipk) +!3071 format(i3,f8.2,f10.3,f8.2,2i3,i6,L4) +! enddo +!### + + nwrite_q65=0 + bq65=mode_q65.gt.0 + + mcall3a=mcall3b + mousefqso0=mousefqso + nsum=0 + + df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz + if(nfsample.eq.95238) df=95238.1/NFFT + ftol=0.010 !Frequency tolerance (kHz) + foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL + fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) + iloop=0 + + if(nutc.ne.nutc0) nfile=nfile+1 + nutc0=nutc + + nqd=0 + fa=-1000*0.5*(nfb-nfa) + 1000*nfshift + fb= 1000*0.5*(nfb-nfa) + 1000*nfshift + ia=nint(fa/df) + 16385 + ib=nint(fb/df) + 16385 + ia=max(51,ia) + ib=min(32768-51,ib) + if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia + + km=0 + nkm=1 + nz=n/8 + freq0=-999. + sync10=-999. + fshort0=-999. + syncshort0=-999. + ntry=0 + short=0. !Zero the whole short array + jpz=1 + + call timer('filbig ',0) + call filbig(dd,NSMAX,f0,newdat,nfsample,xpol,cx,cy,n5) + call timer('filbig ',1) + +! Do the wideband Q65 decode + do icand=1,ncand + if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here + if(candec(icand)) cycle !Skip if already decoded + freq=cand(icand)%f+nkhz_center-48.0-1.27046 + ikhz=nint(freq) + f0=cand(icand)%f + call timer('q65b ',0) + call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,nhsym,ndop00,idec) + call timer('q65b ',1) + if(idec.ge.0) candec(icand)=.true. + enddo ! icand + call sec0(1,tsec0) + ndecdone=2 + + call flush(12) + mcall3b=mcall3a + + return +end subroutine q65wa From 7d63433fe4106926073663ccca60b95948c0b2dd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 12:28:44 -0500 Subject: [PATCH 092/251] A few more trimmings... --- q65w/libm65/CMakeLists.txt | 2 - q65w/libm65/q65b.f90 | 1 - q65w/libm65/trimlist.f90 | 28 ---------- q65w/libm65/wavhdr.f90 | 110 ------------------------------------- 4 files changed, 141 deletions(-) delete mode 100644 q65w/libm65/trimlist.f90 delete mode 100644 q65w/libm65/wavhdr.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index de5af0415..d45eaccff 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -38,8 +38,6 @@ set (libm65_FSRCS timf2.f90 tm2.f90 toxyz.f90 - trimlist.f90 - wavhdr.f90 f77_wisdom.f ) diff --git a/q65w/libm65/q65b.f90 b/q65w/libm65/q65b.f90 index 5175abd1f..9922f06a5 100644 --- a/q65w/libm65/q65b.f90 +++ b/q65w/libm65/q65b.f90 @@ -9,7 +9,6 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & ! orthogonal polarization. Decoded messages are sent back to the GUI ! on stdout. -! use wavhdr use q65_decode use wideband_sync use timer_module, only: timer diff --git a/q65w/libm65/trimlist.f90 b/q65w/libm65/trimlist.f90 deleted file mode 100644 index 9e8a36e69..000000000 --- a/q65w/libm65/trimlist.f90 +++ /dev/null @@ -1,28 +0,0 @@ -subroutine trimlist(sig,km,ftol,indx,nsiz,nz) - - parameter (MAXMSG=1000) !Size of decoded message list - real sig(MAXMSG,30) - integer indx(MAXMSG),nsiz(MAXMSG) - -! 1 2 3 4 5 6 7 8 -! nfile nutc freq snr dt ipol flip sync - - call indexx(sig(1,3),km,indx) !Sort list by frequency - - n=1 - i0=1 - do i=2,km - j0=indx(i-1) - j=indx(i) - if(sig(j,3)-sig(j0,3).gt.ftol) then - nsiz(n)=i-i0 - i0=i - n=n+1 - endif - enddo - nz=n - nsiz(nz)=km+1-i0 - nsiz(nz+1)=-1 - - return -end subroutine trimlist diff --git a/q65w/libm65/wavhdr.f90 b/q65w/libm65/wavhdr.f90 deleted file mode 100644 index 6568c1fa6..000000000 --- a/q65w/libm65/wavhdr.f90 +++ /dev/null @@ -1,110 +0,0 @@ -module wavhdr - type hdr - character*4 ariff - integer*4 lenfile - character*4 awave - character*4 afmt - integer*4 lenfmt - integer*2 nfmt2 - integer*2 nchan2 - integer*4 nsamrate - integer*4 nbytesec - integer*2 nbytesam2 - integer*2 nbitsam2 - character*4 adata - integer*4 ndata - end type hdr - - contains - - function default_header(nsamrate,npts) - type(hdr) default_header,h - h%ariff='RIFF' - h%awave='WAVE' - h%afmt='fmt ' - h%lenfmt=16 - h%nfmt2=1 - h%nchan2=1 - h%nsamrate=nsamrate - h%nbitsam2=16 - h%nbytesam2=h%nbitsam2 * h%nchan2 / 8 - h%adata='data' - h%nbytesec=h%nsamrate * h%nbitsam2 * h%nchan2 / 8 - h%ndata=2*npts - h%lenfile=h%ndata + 44 - 8 - default_header=h - end function default_header - - subroutine set_wsjtx_wav_params(fMHz,mode,nsubmode,ntrperiod,id2) - - parameter (NBANDS=23,NMODES=13) - character*8 mode,modes(NMODES) - integer*2 id2(4) - integer iperiod(8) - real fband(NBANDS) - data fband/0.137,0.474,1.8,3.5,5.1,7.0,10.14,14.0,18.1,21.0,24.9, & - 28.0,50.0,144.0,222.0,432.0,902.0,1296.0,2304.0,3400.0, & - 5760.0,10368.0,24048.0/ - data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & - 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ - data iperiod/5,10,15,30,60,120,900,0/ - - dmin=1.e30 - iband=0 - do i=1,NBANDS - if(abs(fMHz-fband(i)).lt.dmin) then - dmin=abs(fMHz-fband(i)) - iband=i - endif - enddo - - imode=0 - do i=1,NMODES - if(mode.eq.modes(i)) imode=i - enddo - - ip=0 - do i=1,8 - if(ntrperiod.eq.iperiod(i)) ip=i - enddo - - id2(1)=iband - id2(2)=imode - id2(3)=nsubmode - id2(4)=ip - - return - end subroutine set_wsjtx_wav_params - - subroutine get_wsjtx_wav_params(id2,band,mode,nsubmode,ntrperiod,ok) - - parameter (NBANDS=23,NMODES=13) - character*8 mode,modes(NMODES) - character*6 band,bands(NBANDS) - integer*2 id2(4) - integer iperiod(8) - logical ok - data modes/'Echo','FSK441','ISCAT','JT4','JT65','JT6M','JT9', & - 'JT9+JT65','JTMS','JTMSK','WSPR','FT8','FT2'/ - data iperiod/5,10,15,30,60,120,900,0/ - data bands/'2190m','630m','160m','80m','60m','40m','30m','20m', & - '17m','15m','12m','10m','6m','2m','1.25m','70cm','33cm', & - '23cm','13cm','9cm','6cm','3cm','1.25cm'/ - - ok=.true. - if(id2(1).lt.1 .or. id2(1).gt.NBANDS) ok=.false. - if(id2(2).lt.1 .or. id2(2).gt.NMODES) ok=.false. - if(id2(3).lt.1 .or. id2(3).gt.8) ok=.false. - if(id2(4).lt.1 .or. id2(4).gt.8) ok=.false. - - if(ok) then - band=bands(id2(1)) - mode=modes(id2(2)) - nsubmode=id2(3) - ntrperiod=iperiod(id2(4)) - endif - - return - end subroutine get_wsjtx_wav_params - -end module wavhdr From b9b9fe6412c41594484bac747e7f3bada344c8f0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 12:37:39 -0500 Subject: [PATCH 093/251] More pruning... --- q65w/libm65/CMakeLists.txt | 3 --- q65w/libm65/coord.f90 | 40 -------------------------------------- q65w/libm65/deg2grid.f90 | 30 ---------------------------- q65w/libm65/grid2k.f90 | 12 ------------ 4 files changed, 85 deletions(-) delete mode 100644 q65w/libm65/coord.f90 delete mode 100644 q65w/libm65/deg2grid.f90 delete mode 100644 q65w/libm65/grid2k.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index d45eaccff..c13dbb910 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -8,10 +8,8 @@ set (libm65_FSRCS astrosub.f90 chkhist.f90 chkmsg.f90 - coord.f90 dcoord.f90 decode0.f90 - deg2grid.f90 dot.f90 fchisq0.f90 filbig.f90 @@ -22,7 +20,6 @@ set (libm65_FSRCS geocentric.f90 graycode.f90 grid2deg.f90 - grid2k.f90 indexx.f90 interleave63.f90 iqcal.f90 diff --git a/q65w/libm65/coord.f90 b/q65w/libm65/coord.f90 deleted file mode 100644 index 8934b612b..000000000 --- a/q65w/libm65/coord.f90 +++ /dev/null @@ -1,40 +0,0 @@ -SUBROUTINE COORD(A0,B0,AP,BP,A1,B1,A2,B2) - -! Examples: -! 1. From ha,dec to az,el: -! call coord(pi,pio2-lat,0.,lat,ha,dec,az,el) -! 2. From az,el to ha,dec: -! call coord(pi,pio2-lat,0.,lat,az,el,ha,dec) -! 3. From ra,dec to l,b -! call coord(4.635594495,-0.504691042,3.355395488,0.478220215, -! ra,dec,l,b) -! 4. From l,b to ra,dec -! call coord(1.705981071d0,-1.050357016d0,2.146800277d0, -! 0.478220215d0,l,b,ra,dec) -! 5. From ra,dec to ecliptic latitude (eb) and longitude (el): -! call coord(0.d0,0.d0,-pio2,pio2-23.443*pi/180,ra,dec,el,eb) -! 6. From ecliptic latitude (eb) and longitude (el) to ra,dec: -! call coord(0.d0,0.d0,-pio2,pio2-23.443*pi/180,el,eb,ra,dec) - - SB0=sin(B0) - CB0=cos(B0) - SBP=sin(BP) - CBP=cos(BP) - SB1=sin(B1) - CB1=cos(B1) - SB2=SBP*SB1 + CBP*CB1*cos(AP-A1) - CB2=SQRT(1.e0-SB2**2) - B2=atan(SB2/CB2) - SAA=sin(AP-A1)*CB1/CB2 - CAA=(SB1-SB2*SBP)/(CB2*CBP) - CBB=SB0/CBP - SBB=sin(AP-A0)*CB0 - SA2=SAA*CBB-CAA*SBB - CA2=CAA*CBB+SAA*SBB - TA2O2=0.0 !Shut up compiler warnings. -db - IF(CA2.LE.0.e0) TA2O2=(1.e0-CA2)/SA2 - IF(CA2.GT.0.e0) TA2O2=SA2/(1.e0+CA2) - A2=2.e0*atan(TA2O2) - IF(A2.LT.0.e0) A2=A2+6.2831853 - RETURN -END SUBROUTINE COORD diff --git a/q65w/libm65/deg2grid.f90 b/q65w/libm65/deg2grid.f90 deleted file mode 100644 index 9ca3602f8..000000000 --- a/q65w/libm65/deg2grid.f90 +++ /dev/null @@ -1,30 +0,0 @@ -subroutine deg2grid(dlong0,dlat,grid) - - real dlong !West longitude (deg) - real dlat !Latitude (deg) - character grid*6 - - dlong=dlong0 - if(dlong.lt.-180.0) dlong=dlong+360.0 - if(dlong.gt.180.0) dlong=dlong-360.0 - -! Convert to units of 5 min of longitude, working east from 180 deg. - nlong=60.0*(180.0-dlong)/5.0 - n1=nlong/240 !20-degree field - n2=(nlong-240*n1)/24 !2 degree square - n3=nlong-240*n1-24*n2 !5 minute subsquare - grid(1:1)=char(ichar('A')+n1) - grid(3:3)=char(ichar('0')+n2) - grid(5:5)=char(ichar('a')+n3) - -! Convert to units of 2.5 min of latitude, working north from -90 deg. - nlat=60.0*(dlat+90)/2.5 - n1=nlat/240 !10-degree field - n2=(nlat-240*n1)/24 !1 degree square - n3=nlat-240*n1-24*n2 !2.5 minuts subsquare - grid(2:2)=char(ichar('A')+n1) - grid(4:4)=char(ichar('0')+n2) - grid(6:6)=char(ichar('a')+n3) - - return -end subroutine deg2grid diff --git a/q65w/libm65/grid2k.f90 b/q65w/libm65/grid2k.f90 deleted file mode 100644 index f68b1409e..000000000 --- a/q65w/libm65/grid2k.f90 +++ /dev/null @@ -1,12 +0,0 @@ -subroutine grid2k(grid,k) - - character*6 grid - - call grid2deg(grid,xlong,xlat) - nlong=nint(xlong) - nlat=nint(xlat) - k=0 - if(nlat.ge.85) k=5*(nlong+179)/2 + nlat-84 - - return -end subroutine grid2k From fc2273dc67eb6d60ce19e6849a9a5dea4fe3ef41 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 12:39:44 -0500 Subject: [PATCH 094/251] More pruning... --- q65w/libm65/CMakeLists.txt | 2 -- q65w/libm65/graycode.f90 | 10 ---------- q65w/libm65/interleave63.f90 | 25 ------------------------- 3 files changed, 37 deletions(-) delete mode 100644 q65w/libm65/graycode.f90 delete mode 100644 q65w/libm65/interleave63.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index c13dbb910..e7fdca3b4 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -18,10 +18,8 @@ set (libm65_FSRCS ftnquit.f90 q65b.f90 geocentric.f90 - graycode.f90 grid2deg.f90 indexx.f90 - interleave63.f90 iqcal.f90 iqfix.f90 lorentzian.f90 diff --git a/q65w/libm65/graycode.f90 b/q65w/libm65/graycode.f90 deleted file mode 100644 index 2074241a6..000000000 --- a/q65w/libm65/graycode.f90 +++ /dev/null @@ -1,10 +0,0 @@ -subroutine graycode(dat,n,idir) - - integer dat(n) - do i=1,n - dat(i)=igray(dat(i),idir) - enddo - - return -end subroutine graycode - diff --git a/q65w/libm65/interleave63.f90 b/q65w/libm65/interleave63.f90 deleted file mode 100644 index a32ef34cd..000000000 --- a/q65w/libm65/interleave63.f90 +++ /dev/null @@ -1,25 +0,0 @@ -subroutine interleave63(d1,idir) - -! Interleave (idir=1) or de-interleave (idir=-1) the array d1. - - integer d1(0:6,0:8) - integer d2(0:8,0:6) - - if(idir.ge.0) then - do i=0,6 - do j=0,8 - d2(j,i)=d1(i,j) - enddo - enddo - call move(d2,d1,63) - else - call move(d1,d2,63) - do i=0,6 - do j=0,8 - d1(i,j)=d2(j,i) - enddo - enddo - endif - - return -end subroutine interleave63 From 0e12c8f3f4276bfa9c7dee6b8c485dcd4dbab62f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:01:32 -0500 Subject: [PATCH 095/251] Get rid of more xpol stuff. --- q65w/libm65/symspec.f90 | 52 ++++--------------------- q65w/libm65/timf2.f90 | 84 +++-------------------------------------- q65w/mainwindow.cpp | 5 +-- q65w/mainwindow.h | 4 +- 4 files changed, 16 insertions(+), 129 deletions(-) diff --git a/q65w/libm65/symspec.f90 b/q65w/libm65/symspec.f90 index 1a0dd90a6..3fcf29a1c 100644 --- a/q65w/libm65/symspec.f90 +++ b/q65w/libm65/symspec.f90 @@ -1,16 +1,13 @@ -subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & - fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, & +subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & + fgreen,gainx,gainy,phasex,phasey,rejectx,rejecty, & pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) ! k pointer to the most recent new data -! nxpol 0/1 to indicate single- or dual-polarization ! ndiskdat 0/1 to indicate if data from disk ! nb 0/1 status of noise blanker ! idphi Phase correction for Y channel, degrees ! nfsample sample rate (Hz) ! fgreen Frequency of green marker in I/Q calibrate mode (-48.0 to +48.0 kHz) -! iqadjust 0/1 to indicate whether IQ adjustment is active -! iqapply 0/1 to indicate whether to apply I/Q calibration ! pxdb power in x channel (0-60 dB) ! pydb power in y channel (0-60 dB) ! ssz5a polarized spectrum, for waterfall display @@ -28,10 +25,9 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) complex z complex zsumx,zsumy - complex cx(NFFT),cy(NFFT) - complex cx00(NFFT),cy00(NFFT) + complex cx(NFFT) + complex cx00(NFFT) complex cx0(0:1023),cx1(0:1023) - complex cy0(0:1023),cy1(0:1023) logical*1 lstrong(0:1023) data rms/999.0/,k0/99999999/,nadjx/0/,nadjy/0/ save @@ -75,11 +71,7 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & px=0. py=0. - iqapply0=0 - iqadjust0=0 - if(iqadjust.ne.0) iqapply0=0 nwindow=2 -! nwindow=0 !### No windowing ### nfft2=1024 kstep=nfft2 if(nwindow.ne.0) kstep=nfft2/2 @@ -88,19 +80,14 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & j=k1+1 do i=0,nfft2-1 cx0(i)=cmplx(dd(1,j+i),dd(2,j+i)) - if(nxpol.ne.0) cy0(i)=cmplx(dd(3,j+i),dd(4,j+i)) enddo - call timf2(k,nxpol,nfft2,nwindow,nb,peaklimit,iqadjust0,iqapply0, & - faclim,cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong, & + call timf2(k,nfft2,nwindow,nb,peaklimit, & + faclim,cx0,gainx,gainy,phasex,phasey,cx1,slimit,lstrong, & px,py,nzap) do i=0,kstep-1 dd(1,j+i)=real(cx1(i)) dd(2,j+i)=aimag(cx1(i)) - if(nxpol.ne.0) then - dd(3,j+i)=real(cy1(i)) - dd(4,j+i)=aimag(cy1(i)) - endif enddo k1=k1+kstep enddo @@ -113,19 +100,11 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & i=0 fac=0.0002 - do j=ja,jb !Copy data into cx, cy + do j=ja,jb !Copy data into cx x1=dd(1,j) x2=dd(2,j) - if(nxpol.ne.0) then - x3=dd(3,j) - x4=dd(4,j) - else - x3=0. - x4=0. - endif i=i+1 cx(i)=fac*cmplx(x1,x2) - cy(i)=cmplx(x3,x4) !NB: cy includes dphi correction enddo if(nzap/178.lt.50 .and. (ndiskdat.eq.0 .or. ihsym.lt.280)) then @@ -134,7 +113,6 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & rmsx=sqrt(0.5*px/nsum) rmsy=sqrt(0.5*py/nsum) rms=rmsx - if(nxpol.ne.0) rms=sqrt((px+py)/(4.0*nsum)) endif pxdb=0. pydb=0. @@ -144,36 +122,20 @@ subroutine symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, & if(pydb.gt.60.0) pydb=60.0 cx00=cx - if(nxpol.ne.0) cy00=cy do mm=1,nfast ihsym=ihsym+1 if(nfast.eq.1) then cx=w*cx00 !Apply window for 2nd forward FFT - if(nxpol.ne.0) cy=w*cy00 else if(mm.eq.1) then cx=w2a*cx00 - if(nxpol.ne.0) cy=w2a*cy00 else cx=w2b*cx00 - if(nxpol.ne.0) cy=w2b*cy00 endif endif call four2a(cx,NFFT,1,1,1) !Second forward FFT (X) - if(iqadjust.eq.0) nadjx=0 - if(iqadjust.ne.0 .and. nadjx.lt.50) call iqcal(nadjx,cx,NFFT, & - gainx,phasex,zsumx,ipkx,rejectx0) - if(iqapply.ne.0) call iqfix(cx,NFFT,gainx,phasex) - - if(nxpol.ne.0) then - call four2a(cy,NFFT,1,1,1) !Second forward FFT (Y) - if(iqadjust.eq.0) nadjy=0 - if(iqadjust.ne.0 .and. nadjy.lt.50) call iqcal(nadjy,cy,NFFT, & - gainy,phasey,zsumy,ipky,rejecty) - if(iqapply.ne.0) call iqfix(cy,NFFT,gainy,phasey) - endif n=min(322,ihsym) do i=1,NFFT diff --git a/q65w/libm65/timf2.f90 b/q65w/libm65/timf2.f90 index 4873d0e95..681e1dc24 100644 --- a/q65w/libm65/timf2.f90 +++ b/q65w/libm65/timf2.f90 @@ -1,16 +1,15 @@ -subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & - cx0,cy0,gainx,gainy,phasex,phasey,cx1,cy1,slimit,lstrong,px,py,nzap) +subroutine timf2(k,nfft,nwindow,nb,peaklimit,faclim, & + cx0,gainx,gainy,phasex,phasey,cx1,slimit,lstrong,px,py,nzap) ! Sequential processing of time-domain I/Q data, using Linrad-like ! "first FFT" and "first backward FFT". -! cx0,cy0 - complex input data +! cx0 - complex input data ! nfft - length of FFTs ! nwindow - 0 for no window, 2 for sin^2 window -! iqapply - 0/1 determines if I/Q phase and amplitude corrections applied ! gainx,y - gain error in Q channel, relative to I ! phasex,y - phase error -! cx1,cy1 - output data +! cx1 - output data ! Non-windowed processing means no overlap, so kstep=nfft. ! Sin^2 window has 50% overlap, kstep=nfft/2. @@ -23,13 +22,9 @@ subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & parameter (MAXFFT=1024,MAXNH=MAXFFT/2) parameter (MAXSIGS=100) complex cx0(0:nfft-1),cx1(0:nfft-1) - complex cy0(0:nfft-1),cy1(0:nfft-1) complex cx(0:MAXFFT-1),cxt(0:MAXFFT-1) - complex cy(0:MAXFFT-1),cyt(0:MAXFFT-1) complex cxs(0:MAXFFT-1),covxs(0:MAXNH-1) !Strong X signals - complex cys(0:MAXFFT-1),covys(0:MAXNH-1) !Strong Y signals complex cxw(0:MAXFFT-1),covxw(0:MAXNH-1) !Weak X signals - complex cyw(0:MAXFFT-1),covyw(0:MAXNH-1) !Weak Y signals real*4 w(0:MAXFFT-1) real*4 s(0:MAXFFT-1) logical*1 lstrong(0:MAXFFT-1),lprev @@ -40,7 +35,7 @@ subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & data k0/99999999/ save - if(faclim+iqadjust.eq.-9999.0) iqadjust=0 !Silence compiler warning. + if(faclim.eq.-9999.0) stop !Silence compiler warning. if(first) then pi=4.0*atan(1.0) do i=0,nfft-1 @@ -66,53 +61,13 @@ subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & cx(0:nfft-1)=cx0 if(nwindow.eq.2) cx(0:nfft-1)=w(0:nfft-1)*cx(0:nfft-1) call four2a(cx,nfft,1,1,1) !First forward FFT (X) - - if(nxpol.ne.0) then - cy(0:nfft-1)=cy0 - if(nwindow.eq.2) cy(0:nfft-1)=w(0:nfft-1)*cy(0:nfft-1) - call four2a(cy,nfft,1,1,1) !First forward FFT (Y) - endif - - if(iqapply.ne.0) then !Apply I/Q corrections (X) - h=gainx*cmplx(cos(phasex),sin(phasex)) - v=0. - do i=0,nfft-1 - u=cx(i) - if(i.gt.0) v=cx(nfft-i) - x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & - (real(u) - real(v))*real(h) - y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & - (real(u) - real(v))*aimag(h) - cxt(i)=0.5*cmplx(x,y) - enddo - else - cxt(0:nfft-1)=cx(0:nfft-1) - endif - - if(nxpol.ne.0) then - if(iqapply.ne.0) then !Apply I/Q corrections (Y) - h=gainy*cmplx(cos(phasey),sin(phasey)) - v=0. - do i=0,nfft-1 - u=cy(i) - if(i.gt.0) v=cy(nfft-i) - x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & - (real(u) - real(v))*real(h) - y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & - (real(u) - real(v))*aimag(h) - cyt(i)=0.5*cmplx(x,y) - enddo - else - cyt(0:nfft-1)=cy(0:nfft-1) - endif - endif + cxt(0:nfft-1)=cx(0:nfft-1) ! Identify frequencies with strong signals, copy frequency-domain ! data into array cs (strong) or cw (weak). do i=0,nfft-1 p=real(cxt(i))**2 + aimag(cxt(i))**2 - if(nxpol.ne.0) p=p + real(cyt(i))**2 + aimag(cyt(i))**2 s(i)=p enddo ave=sum(s(0:nfft-1))/nfft @@ -151,50 +106,28 @@ subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & if(lstrong(i)) then cxs(i)=fac*cxt(i) cxw(i)=0. - if(nxpol.ne.0) then - cys(i)=fac*cyt(i) - cyw(i)=0. - endif else cxw(i)=fac*cxt(i) cxs(i)=0. - if(nxpol.ne.0) then - cyw(i)=fac*cyt(i) - cys(i)=0. - endif endif enddo call four2a(cxw,nfft,1,-1,1) !Transform weak and strong X call four2a(cxs,nfft,1,-1,1) !back to time domain, separately - if(nxpol.ne.0) then - call four2a(cyw,nfft,1,-1,1) !Transform weak and strong Y - call four2a(cys,nfft,1,-1,1) !back to time domain, separately - endif - if(nwindow.eq.2) then cxw(0:nh-1)=cxw(0:nh-1)+covxw(0:nh-1) !Add previous segment's 2nd half covxw(0:nh-1)=cxw(nh:nfft-1) !Save 2nd half cxs(0:nh-1)=cxs(0:nh-1)+covxs(0:nh-1) !Ditto for strong signals covxs(0:nh-1)=cxs(nh:nfft-1) - - if(nxpol.ne.0) then - cyw(0:nh-1)=cyw(0:nh-1)+covyw(0:nh-1) !Add previous segment's 2nd half - covyw(0:nh-1)=cyw(nh:nfft-1) !Save 2nd half - cys(0:nh-1)=cys(0:nh-1)+covys(0:nh-1) !Ditto for strong signals - covys(0:nh-1)=cys(nh:nfft-1) - endif endif ! Apply noise blanking to weak data if(nb.ne.0) then do i=0,kstep-1 peak=abs(cxw(i)) - if(nxpol.ne.0) peak=max(peak,abs(cyw(i))) if(peak.gt.peaklimit) then cxw(i)=0. - if(nxpol.ne.0) cyw(i)=0. nzap=nzap+1 endif enddo @@ -203,13 +136,8 @@ subroutine timf2(k,nxpol,nfft,nwindow,nb,peaklimit,iqadjust,iqapply,faclim, & ! Compute power levels from weak data only do i=0,kstep-1 px=px + real(cxw(i))**2 + aimag(cxw(i))**2 - if(nxpol.ne.0) py=py + real(cyw(i))**2 + aimag(cyw(i))**2 enddo - cx1(0:kstep-1)=cxw(0:kstep-1) + cxs(0:kstep-1) !Weak + strong (X) - if(nxpol.ne.0) then - cy1(0:kstep-1)=cyw(0:kstep-1) + cys(0:kstep-1) !Weak + strong (Y) - endif return end subroutine timf2 diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index edb645e55..73a8bc75b 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -328,7 +328,6 @@ void MainWindow::dataSink(int k) static float fgreen; static int ndiskdat; static int nb; - static int nxpol=0; static float px=0.0,py=0.0; static uchar lstrong[1024]; static float rejectx; @@ -349,9 +348,7 @@ void MainWindow::dataSink(int k) nfsample=96000; if(!m_fs96000) nfsample=95238; fgreen=m_wide_graph_window->fGreen(); - int zero=0; - symspec_(&k, &nxpol, &ndiskdat, &nb, &m_NBslider, &m_dPhi, - &nfsample, &fgreen, &zero, &zero, + symspec_(&k, &ndiskdat, &nb, &m_NBslider, &m_dPhi, &nfsample, &fgreen, &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 3cd57bf9c..442a28ae2 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -205,9 +205,9 @@ extern int killbyname(const char* progName); extern "C" { //----------------------------------------------------- C and Fortran routines - void symspec_(int* k, int* nxpol, int* ndiskdat, int* nb, + void symspec_(int* k, int* ndiskdat, int* nb, int* m_NBslider, int* idphi, int* nfsample, float* fgreen, - int* iqadjust, int* iqapply, float* gainx, float* gainy, + float* gainx, float* gainy, float* phasex, float* phasey, float* rejectx, float* rejecty, float* px, float* py, float s[], int* nkhz, int* nhsym, int* nzap, float* slimit, uchar lstrong[]); From a3c7b421bd39159e585321d0103191ff6530622b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:09:07 -0500 Subject: [PATCH 096/251] Rename m65c to q65c. --- q65w/libm65/CMakeLists.txt | 2 +- q65w/libm65/{m65c.f90 => q65c.f90} | 6 ++---- q65w/mainwindow.cpp | 4 ++-- q65w/mainwindow.h | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) rename q65w/libm65/{m65c.f90 => q65c.f90} (95%) diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index e7fdca3b4..b7da3953f 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -23,9 +23,9 @@ set (libm65_FSRCS iqcal.f90 iqfix.f90 lorentzian.f90 - m65c.f90 moon2.f90 moondop.f90 + q65c.f90 q65wa.f90 recvpkt.f90 sun.f90 diff --git a/q65w/libm65/m65c.f90 b/q65w/libm65/q65c.f90 similarity index 95% rename from q65w/libm65/m65c.f90 rename to q65w/libm65/q65c.f90 index be3914bc1..b9b4eae07 100644 --- a/q65w/libm65/m65c.f90 +++ b/q65w/libm65/q65c.f90 @@ -1,4 +1,4 @@ -subroutine m65c(itimer) +subroutine q65c(itimer) use timer_module, only: timer use timer_impl, only: fini_timer !, limtrace @@ -38,8 +38,6 @@ subroutine m65c(itimer) return endif - lq65w=.true. - lq65w2=.true. datetime(18:20)=':00' ! if(first) call timer('q65w ',0) @@ -52,4 +50,4 @@ subroutine m65c(itimer) call timer('decode0 ',1) return -end subroutine m65c +end subroutine q65c diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 73a8bc75b..d2e4f55a4 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -186,7 +186,7 @@ MainWindow::~MainWindow() { writeSettings(); int itimer=1; - m65c_(&itimer); + q65c_(&itimer); if (soundInThread.isRunning()) { soundInThread.quit(); @@ -901,7 +901,7 @@ void MainWindow::decode() //decode() decodes_.ncand=0; m_fetched=0; int itimer=0; - watcher3.setFuture(QtConcurrent::run (std::bind (m65c_, &itimer))); + watcher3.setFuture(QtConcurrent::run (std::bind (q65c_, &itimer))); decodeBusy(true); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 442a28ae2..8eb557063 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -215,7 +215,7 @@ extern "C" { void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, const char* mygrid, int* ndop00, int len1); - void m65c_(int* itimer); + void q65c_(int* itimer); } #endif // MAINWINDOW_H From d808521b0fb741a5ab74e09dd36d2d09e36daabc Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:22:11 -0500 Subject: [PATCH 097/251] Final (?) pruning of source tree. --- q65w/libm65/CMakeLists.txt | 4 ---- q65w/libm65/chkhist.f90 | 23 ----------------------- q65w/libm65/chkmsg.f90 | 31 ------------------------------- q65w/libm65/iqcal.f90 | 30 ------------------------------ q65w/libm65/iqfix.f90 | 28 ---------------------------- 5 files changed, 116 deletions(-) delete mode 100644 q65w/libm65/chkhist.f90 delete mode 100644 q65w/libm65/chkmsg.f90 delete mode 100644 q65w/libm65/iqcal.f90 delete mode 100644 q65w/libm65/iqfix.f90 diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libm65/CMakeLists.txt index b7da3953f..e23aa85ad 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libm65/CMakeLists.txt @@ -6,8 +6,6 @@ set (libm65_FSRCS astro.f90 astro0.f90 astrosub.f90 - chkhist.f90 - chkmsg.f90 dcoord.f90 decode0.f90 dot.f90 @@ -20,8 +18,6 @@ set (libm65_FSRCS geocentric.f90 grid2deg.f90 indexx.f90 - iqcal.f90 - iqfix.f90 lorentzian.f90 moon2.f90 moondop.f90 diff --git a/q65w/libm65/chkhist.f90 b/q65w/libm65/chkhist.f90 deleted file mode 100644 index c814c3ca3..000000000 --- a/q65w/libm65/chkhist.f90 +++ /dev/null @@ -1,23 +0,0 @@ -subroutine chkhist(mrsym,nmax,ipk) - - integer mrsym(63) - integer hist(0:63) - - do i=0,63 - hist(i)=0 - enddo - do j=1,63 - i=mrsym(j) - hist(i)=hist(i)+1 - enddo - - nmax=0 - do i=0,63 - if(hist(i).gt.nmax) then - nmax=hist(i) - ipk=i+1 - endif - enddo - - return -end subroutine chkhist diff --git a/q65w/libm65/chkmsg.f90 b/q65w/libm65/chkmsg.f90 deleted file mode 100644 index 457a80924..000000000 --- a/q65w/libm65/chkmsg.f90 +++ /dev/null @@ -1,31 +0,0 @@ -subroutine chkmsg(message,cok,nspecial,flip) - - character message*22,cok*3 - - nspecial=0 - flip=1.0 - cok=" " - - do i=22,1,-1 - if(message(i:i).ne.' ') go to 10 - enddo - i=22 - -10 if(i.ge.11) then - if ((message(i-3:i).eq.' OOO') .or. (message(20:22).eq.' OO')) then - cok='OOO' - flip=-1.0 - if(message(20:22).eq.' OO') then - message=message(1:19) - else - message=message(1:i-4) - endif - endif - endif - - if(message(1:3).eq.'RO ') nspecial=2 - if(message(1:4).eq.'RRR ') nspecial=3 - if(message(1:3).eq.'73 ') nspecial=4 - - return -end subroutine chkmsg diff --git a/q65w/libm65/iqcal.f90 b/q65w/libm65/iqcal.f90 deleted file mode 100644 index c0c4fce2d..000000000 --- a/q65w/libm65/iqcal.f90 +++ /dev/null @@ -1,30 +0,0 @@ -subroutine iqcal(nn,c,nfft,gain,phase,zsum,ipk,reject) - - complex c(0:nfft-1) - complex z,zsum,zave - - if(nn.eq.0) then - zsum=0. - endif - nn=nn+1 - smax=0. - ipk=1 - do i=1,nfft-1 !Find strongest signal - s=real(c(i))**2 + aimag(c(i))**2 - if(s.gt.smax) then - smax=s - ipk=i - endif - enddo - pimage=real(c(nfft-ipk))**2 + aimag(c(nfft-ipk))**2 - p=smax + pimage - z=c(ipk)*c(nfft-ipk)/p !Synchronous detection of image - zsum=zsum+z - zave=zsum/nn - tmp=sqrt(1.0 - (2.0*real(zave))**2) - phase=asin(2.0*aimag(zave)/tmp) !Estimate phase - gain=tmp/(1.0-2.0*real(zave)) !Estimate gain - reject=10.0*log10(pimage/smax) - - return -end subroutine iqcal diff --git a/q65w/libm65/iqfix.f90 b/q65w/libm65/iqfix.f90 deleted file mode 100644 index 93cace4b1..000000000 --- a/q65w/libm65/iqfix.f90 +++ /dev/null @@ -1,28 +0,0 @@ -subroutine iqfix(c,nfft,gain,phase) - - complex c(0:nfft-1) - complex z,h,u,v - - nh=nfft/2 - h=gain*cmplx(cos(phase),sin(phase)) - - do i=1,nh-1 - u=c(i) - v=c(nfft-i) - x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & - (real(u) - real(v))*real(h) - y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & - (real(u) - real(v))*aimag(h) - c(i)=0.5*cmplx(x,y) - z=u - u=v - v=z - x=real(u) + real(v) - (aimag(u) + aimag(v))*aimag(h) + & - (real(u) - real(v))*real(h) - y=aimag(u) - aimag(v) + (aimag(u) + aimag(v))*real(h) + & - (real(u) - real(v))*aimag(h) - c(nfft-i)=0.5*cmplx(x,y) - enddo - - return -end subroutine iqfix From 16214c2ff1af8bef2bfa738e5f2bfa7e548ee502 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:27:13 -0500 Subject: [PATCH 098/251] Rename libm65 to libq65. --- q65w/CMakeLists.txt | 2 +- q65w/{libm65 => libq65}/CMakeLists.txt | 16 ++++++++-------- q65w/{libm65 => libq65}/astro.f90 | 0 q65w/{libm65 => libq65}/astro0.f90 | 0 q65w/{libm65 => libq65}/astrosub.f90 | 0 q65w/{libm65 => libq65}/dcoord.f90 | 0 q65w/{libm65 => libq65}/decode0.f90 | 0 q65w/{libm65 => libq65}/dot.f90 | 0 q65w/{libm65 => libq65}/f77_wisdom.f | 0 q65w/{libm65 => libq65}/fchisq0.f90 | 0 q65w/{libm65 => libq65}/fftw3.f | 0 q65w/{libm65 => libq65}/fftw3.f90 | 0 q65w/{libm65 => libq65}/filbig.f90 | 0 q65w/{libm65 => libq65}/four2a.f90 | 0 q65w/{libm65 => libq65}/ftninit.f90 | 0 q65w/{libm65 => libq65}/ftnquit.f90 | 0 q65w/{libm65 => libq65}/geocentric.f90 | 0 q65w/{libm65 => libq65}/getdphi.f90 | 0 q65w/{libm65 => libq65}/grid2deg.f90 | 0 q65w/{libm65 => libq65}/indexx.f90 | 0 q65w/{libm65 => libq65}/ipcomm.cpp | 0 q65w/{libm65 => libq65}/lorentzian.f90 | 0 q65w/{libm65 => libq65}/moon2.f90 | 0 q65w/{libm65 => libq65}/moondop.f90 | 0 q65w/{libm65 => libq65}/msgs.txt | 0 q65w/{libm65 => libq65}/njunk.f90 | 0 q65w/{libm65 => libq65}/pfx.f90 | 0 q65w/{libm65 => libq65}/q65b.f90 | 0 q65w/{libm65 => libq65}/q65c.f90 | 0 q65w/{libm65 => libq65}/q65wa.f90 | 0 q65w/{libm65 => libq65}/recvpkt.f90 | 0 q65w/{libm65 => libq65}/rfile3a.f90 | 0 q65w/{libm65 => libq65}/s3avg.f90 | 0 q65w/{libm65 => libq65}/set.f90 | 0 q65w/{libm65 => libq65}/shell.f90 | 0 q65w/{libm65 => libq65}/sleep_msec.f90 | 0 q65w/{libm65 => libq65}/smo.f90 | 0 q65w/{libm65 => libq65}/sort.f90 | 0 q65w/{libm65 => libq65}/ssort.f | 0 q65w/{libm65 => libq65}/sun.f90 | 0 q65w/{libm65 => libq65}/symspec.f90 | 0 q65w/{libm65 => libq65}/synctest.f90 | 0 q65w/{libm65 => libq65}/synctst.f90 | 0 q65w/{libm65 => libq65}/synctst2.f90 | 0 q65w/{libm65 => libq65}/tastro.f90 | 0 q65w/{libm65 => libq65}/timf2.f90 | 0 q65w/{libm65 => libq65}/tm2.f90 | 0 q65w/{libm65 => libq65}/toxyz.f90 | 0 q65w/{libm65 => libq65}/twkfreq.f90 | 0 q65w/{libm65 => libq65}/twkfreq_xy.f90 | 0 q65w/{libm65 => libq65}/txpol.f90 | 0 q65w/{libm65 => libq65}/wideband_sync.f90 | 0 q65w/{libm65 => libq65}/zplot.f90 | 0 53 files changed, 9 insertions(+), 9 deletions(-) rename q65w/{libm65 => libq65}/CMakeLists.txt (67%) rename q65w/{libm65 => libq65}/astro.f90 (100%) rename q65w/{libm65 => libq65}/astro0.f90 (100%) rename q65w/{libm65 => libq65}/astrosub.f90 (100%) rename q65w/{libm65 => libq65}/dcoord.f90 (100%) rename q65w/{libm65 => libq65}/decode0.f90 (100%) rename q65w/{libm65 => libq65}/dot.f90 (100%) rename q65w/{libm65 => libq65}/f77_wisdom.f (100%) rename q65w/{libm65 => libq65}/fchisq0.f90 (100%) rename q65w/{libm65 => libq65}/fftw3.f (100%) rename q65w/{libm65 => libq65}/fftw3.f90 (100%) rename q65w/{libm65 => libq65}/filbig.f90 (100%) rename q65w/{libm65 => libq65}/four2a.f90 (100%) rename q65w/{libm65 => libq65}/ftninit.f90 (100%) rename q65w/{libm65 => libq65}/ftnquit.f90 (100%) rename q65w/{libm65 => libq65}/geocentric.f90 (100%) rename q65w/{libm65 => libq65}/getdphi.f90 (100%) rename q65w/{libm65 => libq65}/grid2deg.f90 (100%) rename q65w/{libm65 => libq65}/indexx.f90 (100%) rename q65w/{libm65 => libq65}/ipcomm.cpp (100%) rename q65w/{libm65 => libq65}/lorentzian.f90 (100%) rename q65w/{libm65 => libq65}/moon2.f90 (100%) rename q65w/{libm65 => libq65}/moondop.f90 (100%) rename q65w/{libm65 => libq65}/msgs.txt (100%) rename q65w/{libm65 => libq65}/njunk.f90 (100%) rename q65w/{libm65 => libq65}/pfx.f90 (100%) rename q65w/{libm65 => libq65}/q65b.f90 (100%) rename q65w/{libm65 => libq65}/q65c.f90 (100%) rename q65w/{libm65 => libq65}/q65wa.f90 (100%) rename q65w/{libm65 => libq65}/recvpkt.f90 (100%) rename q65w/{libm65 => libq65}/rfile3a.f90 (100%) rename q65w/{libm65 => libq65}/s3avg.f90 (100%) rename q65w/{libm65 => libq65}/set.f90 (100%) rename q65w/{libm65 => libq65}/shell.f90 (100%) rename q65w/{libm65 => libq65}/sleep_msec.f90 (100%) rename q65w/{libm65 => libq65}/smo.f90 (100%) rename q65w/{libm65 => libq65}/sort.f90 (100%) rename q65w/{libm65 => libq65}/ssort.f (100%) rename q65w/{libm65 => libq65}/sun.f90 (100%) rename q65w/{libm65 => libq65}/symspec.f90 (100%) rename q65w/{libm65 => libq65}/synctest.f90 (100%) rename q65w/{libm65 => libq65}/synctst.f90 (100%) rename q65w/{libm65 => libq65}/synctst2.f90 (100%) rename q65w/{libm65 => libq65}/tastro.f90 (100%) rename q65w/{libm65 => libq65}/timf2.f90 (100%) rename q65w/{libm65 => libq65}/tm2.f90 (100%) rename q65w/{libm65 => libq65}/toxyz.f90 (100%) rename q65w/{libm65 => libq65}/twkfreq.f90 (100%) rename q65w/{libm65 => libq65}/twkfreq_xy.f90 (100%) rename q65w/{libm65 => libq65}/txpol.f90 (100%) rename q65w/{libm65 => libq65}/wideband_sync.f90 (100%) rename q65w/{libm65 => libq65}/zplot.f90 (100%) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index c36921664..4a326e981 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -33,7 +33,7 @@ set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) # build the subdirectories -add_subdirectory (libm65) +add_subdirectory (libq65) # UI generation qt5_wrap_ui (q65w_GENUISRCS ${q65w_UISRCS}) diff --git a/q65w/libm65/CMakeLists.txt b/q65w/libq65/CMakeLists.txt similarity index 67% rename from q65w/libm65/CMakeLists.txt rename to q65w/libq65/CMakeLists.txt index e23aa85ad..015cd3253 100644 --- a/q65w/libm65/CMakeLists.txt +++ b/q65w/libq65/CMakeLists.txt @@ -1,4 +1,4 @@ -set (libm65_FSRCS +set (libq65_FSRCS # Modules come first: wideband_sync.f90 @@ -33,21 +33,21 @@ set (libm65_FSRCS f77_wisdom.f ) -set (libm65_CXXSRCS +set (libq65_CXXSRCS ipcomm.cpp ) -set (libm65_C_and_CXXSRCS - ${libm65_CSRCS} - ${libm65_CXXSRCS} +set (libq65_C_and_CXXSRCS + ${libq65_CSRCS} + ${libq65_CXXSRCS} ) -set_property (SOURCE ${libm65_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") -set_property (SOURCE ${libm65_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) +set_property (SOURCE ${libq65_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") +set_property (SOURCE ${libq65_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) # # build our targets # -add_library (m65impl STATIC ${libm65_FSRCS} ${libm65_CSRCS} ${libm65_CXXSRCS}) +add_library (m65impl STATIC ${libq65_FSRCS} ${libq65_CSRCS} ${libq65_CXXSRCS}) target_link_libraries (m65impl wsjt_fort wsjt_cxx Qt5::Core) diff --git a/q65w/libm65/astro.f90 b/q65w/libq65/astro.f90 similarity index 100% rename from q65w/libm65/astro.f90 rename to q65w/libq65/astro.f90 diff --git a/q65w/libm65/astro0.f90 b/q65w/libq65/astro0.f90 similarity index 100% rename from q65w/libm65/astro0.f90 rename to q65w/libq65/astro0.f90 diff --git a/q65w/libm65/astrosub.f90 b/q65w/libq65/astrosub.f90 similarity index 100% rename from q65w/libm65/astrosub.f90 rename to q65w/libq65/astrosub.f90 diff --git a/q65w/libm65/dcoord.f90 b/q65w/libq65/dcoord.f90 similarity index 100% rename from q65w/libm65/dcoord.f90 rename to q65w/libq65/dcoord.f90 diff --git a/q65w/libm65/decode0.f90 b/q65w/libq65/decode0.f90 similarity index 100% rename from q65w/libm65/decode0.f90 rename to q65w/libq65/decode0.f90 diff --git a/q65w/libm65/dot.f90 b/q65w/libq65/dot.f90 similarity index 100% rename from q65w/libm65/dot.f90 rename to q65w/libq65/dot.f90 diff --git a/q65w/libm65/f77_wisdom.f b/q65w/libq65/f77_wisdom.f similarity index 100% rename from q65w/libm65/f77_wisdom.f rename to q65w/libq65/f77_wisdom.f diff --git a/q65w/libm65/fchisq0.f90 b/q65w/libq65/fchisq0.f90 similarity index 100% rename from q65w/libm65/fchisq0.f90 rename to q65w/libq65/fchisq0.f90 diff --git a/q65w/libm65/fftw3.f b/q65w/libq65/fftw3.f similarity index 100% rename from q65w/libm65/fftw3.f rename to q65w/libq65/fftw3.f diff --git a/q65w/libm65/fftw3.f90 b/q65w/libq65/fftw3.f90 similarity index 100% rename from q65w/libm65/fftw3.f90 rename to q65w/libq65/fftw3.f90 diff --git a/q65w/libm65/filbig.f90 b/q65w/libq65/filbig.f90 similarity index 100% rename from q65w/libm65/filbig.f90 rename to q65w/libq65/filbig.f90 diff --git a/q65w/libm65/four2a.f90 b/q65w/libq65/four2a.f90 similarity index 100% rename from q65w/libm65/four2a.f90 rename to q65w/libq65/four2a.f90 diff --git a/q65w/libm65/ftninit.f90 b/q65w/libq65/ftninit.f90 similarity index 100% rename from q65w/libm65/ftninit.f90 rename to q65w/libq65/ftninit.f90 diff --git a/q65w/libm65/ftnquit.f90 b/q65w/libq65/ftnquit.f90 similarity index 100% rename from q65w/libm65/ftnquit.f90 rename to q65w/libq65/ftnquit.f90 diff --git a/q65w/libm65/geocentric.f90 b/q65w/libq65/geocentric.f90 similarity index 100% rename from q65w/libm65/geocentric.f90 rename to q65w/libq65/geocentric.f90 diff --git a/q65w/libm65/getdphi.f90 b/q65w/libq65/getdphi.f90 similarity index 100% rename from q65w/libm65/getdphi.f90 rename to q65w/libq65/getdphi.f90 diff --git a/q65w/libm65/grid2deg.f90 b/q65w/libq65/grid2deg.f90 similarity index 100% rename from q65w/libm65/grid2deg.f90 rename to q65w/libq65/grid2deg.f90 diff --git a/q65w/libm65/indexx.f90 b/q65w/libq65/indexx.f90 similarity index 100% rename from q65w/libm65/indexx.f90 rename to q65w/libq65/indexx.f90 diff --git a/q65w/libm65/ipcomm.cpp b/q65w/libq65/ipcomm.cpp similarity index 100% rename from q65w/libm65/ipcomm.cpp rename to q65w/libq65/ipcomm.cpp diff --git a/q65w/libm65/lorentzian.f90 b/q65w/libq65/lorentzian.f90 similarity index 100% rename from q65w/libm65/lorentzian.f90 rename to q65w/libq65/lorentzian.f90 diff --git a/q65w/libm65/moon2.f90 b/q65w/libq65/moon2.f90 similarity index 100% rename from q65w/libm65/moon2.f90 rename to q65w/libq65/moon2.f90 diff --git a/q65w/libm65/moondop.f90 b/q65w/libq65/moondop.f90 similarity index 100% rename from q65w/libm65/moondop.f90 rename to q65w/libq65/moondop.f90 diff --git a/q65w/libm65/msgs.txt b/q65w/libq65/msgs.txt similarity index 100% rename from q65w/libm65/msgs.txt rename to q65w/libq65/msgs.txt diff --git a/q65w/libm65/njunk.f90 b/q65w/libq65/njunk.f90 similarity index 100% rename from q65w/libm65/njunk.f90 rename to q65w/libq65/njunk.f90 diff --git a/q65w/libm65/pfx.f90 b/q65w/libq65/pfx.f90 similarity index 100% rename from q65w/libm65/pfx.f90 rename to q65w/libq65/pfx.f90 diff --git a/q65w/libm65/q65b.f90 b/q65w/libq65/q65b.f90 similarity index 100% rename from q65w/libm65/q65b.f90 rename to q65w/libq65/q65b.f90 diff --git a/q65w/libm65/q65c.f90 b/q65w/libq65/q65c.f90 similarity index 100% rename from q65w/libm65/q65c.f90 rename to q65w/libq65/q65c.f90 diff --git a/q65w/libm65/q65wa.f90 b/q65w/libq65/q65wa.f90 similarity index 100% rename from q65w/libm65/q65wa.f90 rename to q65w/libq65/q65wa.f90 diff --git a/q65w/libm65/recvpkt.f90 b/q65w/libq65/recvpkt.f90 similarity index 100% rename from q65w/libm65/recvpkt.f90 rename to q65w/libq65/recvpkt.f90 diff --git a/q65w/libm65/rfile3a.f90 b/q65w/libq65/rfile3a.f90 similarity index 100% rename from q65w/libm65/rfile3a.f90 rename to q65w/libq65/rfile3a.f90 diff --git a/q65w/libm65/s3avg.f90 b/q65w/libq65/s3avg.f90 similarity index 100% rename from q65w/libm65/s3avg.f90 rename to q65w/libq65/s3avg.f90 diff --git a/q65w/libm65/set.f90 b/q65w/libq65/set.f90 similarity index 100% rename from q65w/libm65/set.f90 rename to q65w/libq65/set.f90 diff --git a/q65w/libm65/shell.f90 b/q65w/libq65/shell.f90 similarity index 100% rename from q65w/libm65/shell.f90 rename to q65w/libq65/shell.f90 diff --git a/q65w/libm65/sleep_msec.f90 b/q65w/libq65/sleep_msec.f90 similarity index 100% rename from q65w/libm65/sleep_msec.f90 rename to q65w/libq65/sleep_msec.f90 diff --git a/q65w/libm65/smo.f90 b/q65w/libq65/smo.f90 similarity index 100% rename from q65w/libm65/smo.f90 rename to q65w/libq65/smo.f90 diff --git a/q65w/libm65/sort.f90 b/q65w/libq65/sort.f90 similarity index 100% rename from q65w/libm65/sort.f90 rename to q65w/libq65/sort.f90 diff --git a/q65w/libm65/ssort.f b/q65w/libq65/ssort.f similarity index 100% rename from q65w/libm65/ssort.f rename to q65w/libq65/ssort.f diff --git a/q65w/libm65/sun.f90 b/q65w/libq65/sun.f90 similarity index 100% rename from q65w/libm65/sun.f90 rename to q65w/libq65/sun.f90 diff --git a/q65w/libm65/symspec.f90 b/q65w/libq65/symspec.f90 similarity index 100% rename from q65w/libm65/symspec.f90 rename to q65w/libq65/symspec.f90 diff --git a/q65w/libm65/synctest.f90 b/q65w/libq65/synctest.f90 similarity index 100% rename from q65w/libm65/synctest.f90 rename to q65w/libq65/synctest.f90 diff --git a/q65w/libm65/synctst.f90 b/q65w/libq65/synctst.f90 similarity index 100% rename from q65w/libm65/synctst.f90 rename to q65w/libq65/synctst.f90 diff --git a/q65w/libm65/synctst2.f90 b/q65w/libq65/synctst2.f90 similarity index 100% rename from q65w/libm65/synctst2.f90 rename to q65w/libq65/synctst2.f90 diff --git a/q65w/libm65/tastro.f90 b/q65w/libq65/tastro.f90 similarity index 100% rename from q65w/libm65/tastro.f90 rename to q65w/libq65/tastro.f90 diff --git a/q65w/libm65/timf2.f90 b/q65w/libq65/timf2.f90 similarity index 100% rename from q65w/libm65/timf2.f90 rename to q65w/libq65/timf2.f90 diff --git a/q65w/libm65/tm2.f90 b/q65w/libq65/tm2.f90 similarity index 100% rename from q65w/libm65/tm2.f90 rename to q65w/libq65/tm2.f90 diff --git a/q65w/libm65/toxyz.f90 b/q65w/libq65/toxyz.f90 similarity index 100% rename from q65w/libm65/toxyz.f90 rename to q65w/libq65/toxyz.f90 diff --git a/q65w/libm65/twkfreq.f90 b/q65w/libq65/twkfreq.f90 similarity index 100% rename from q65w/libm65/twkfreq.f90 rename to q65w/libq65/twkfreq.f90 diff --git a/q65w/libm65/twkfreq_xy.f90 b/q65w/libq65/twkfreq_xy.f90 similarity index 100% rename from q65w/libm65/twkfreq_xy.f90 rename to q65w/libq65/twkfreq_xy.f90 diff --git a/q65w/libm65/txpol.f90 b/q65w/libq65/txpol.f90 similarity index 100% rename from q65w/libm65/txpol.f90 rename to q65w/libq65/txpol.f90 diff --git a/q65w/libm65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 similarity index 100% rename from q65w/libm65/wideband_sync.f90 rename to q65w/libq65/wideband_sync.f90 diff --git a/q65w/libm65/zplot.f90 b/q65w/libq65/zplot.f90 similarity index 100% rename from q65w/libm65/zplot.f90 rename to q65w/libq65/zplot.f90 From 504a62bf93ea16437e11090aa6b3ca0e3f4acdbe Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:44:41 -0500 Subject: [PATCH 099/251] Remove (most of) mcall3 stuff. --- q65w/libq65/decode0.f90 | 7 ++----- q65w/libq65/q65wa.f90 | 6 +----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 27eae0769..dcb6bcb04 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -16,7 +16,7 @@ subroutine decode0(dd,ss,savg,nstandalone) mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime common/early/nhsym1,nhsym2,ldecoded(32768) - data neme0/-99/,mcall3b/1/ + data neme0/-99/ save call sec0(0,tquick) @@ -40,9 +40,6 @@ subroutine decode0(dd,ss,savg,nstandalone) enddo 10 rmsdd=1.5*i endif - - if(mycall.ne.mycall0 .or. hiscall.ne.hiscall0 .or. & - hisgrid.ne.hisgrid0 .or. mcall3.ne.0 .or. neme.ne.neme0) mcall3b=1 mycall0=mycall hiscall0=hiscall @@ -52,7 +49,7 @@ subroutine decode0(dd,ss,savg,nstandalone) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mcall3b,nsum,nxant,mycall,mygrid, & + nfcal,nsum,nxant,mycall,mygrid, & hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) call timer('q65wa ',1) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 6c7ef681a..47147dc89 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,6 +1,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mcall3b,nsum,nxant,mycall,mygrid, & + nfcal,nsum,nxant,mycall,mygrid, & hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nxpol,nmode,ndop00) @@ -25,7 +25,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & type(candidate) :: cand(MAX_CANDIDATES) character*60 result common/decodes/ndecodes,ncand,result(50) - common/c3com/ mcall3a common/testcom/ifreq common/early/nhsym1,nhsym2,ldecoded(32768) @@ -72,7 +71,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nwrite_q65=0 bq65=mode_q65.gt.0 - mcall3a=mcall3b mousefqso0=mousefqso nsum=0 @@ -126,9 +124,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & enddo ! icand call sec0(1,tsec0) ndecdone=2 - call flush(12) - mcall3b=mcall3a return end subroutine q65wa From 1c75702420e4685cb215325930366bb8fac7234e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 13:56:10 -0500 Subject: [PATCH 100/251] Reduce ss(4,322... to ss(322,... --- q65w/commons.h | 8 ++++---- q65w/libq65/decode0.f90 | 2 +- q65w/libq65/q65c.f90 | 2 +- q65w/libq65/q65wa.f90 | 2 +- q65w/libq65/recvpkt.f90 | 2 +- q65w/libq65/symspec.f90 | 4 ++-- q65w/libq65/wideband_sync.f90 | 22 ++++++++-------------- q65w/soundin.cpp | 2 +- 8 files changed, 19 insertions(+), 25 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index 792a8adaf..aa4485eaa 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -7,8 +7,8 @@ extern "C" { extern struct { //This is "common/datcom/..." in Fortran float d4[4*5760000]; //Raw I/Q data from Linrad - float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol - float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol + float ss[322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol + float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM int idphi; //Phase correction for Y pol'n, degrees @@ -46,8 +46,8 @@ extern struct { //This is "common/datcom/..." in Fortran extern struct { //This is "common/datcom/..." in Fortran float d4[4*5760000]; //Raw I/Q data from Linrad - float ss[4*322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol - float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol + float ss[322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol + float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM int idphi; //Phase correction for Y pol'n, degrees diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index dcb6bcb04..e15924c02 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -3,7 +3,7 @@ subroutine decode0(dd,ss,savg,nstandalone) use timer_module, only: timer parameter (NSMAX=60*96000) - real*4 dd(4,NSMAX),ss(4,322,NFFT),savg(NFFT) + real*4 dd(4,NSMAX),ss(322,NFFT),savg(NFFT) real*8 fcenter integer hist(0:32768) logical ldecoded diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index b9b4eae07..13df3b68f 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -16,7 +16,7 @@ subroutine q65c(itimer) character*6 mygrid,hisgrid character*20 datetime - common/datcom2/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),nparams0 + common/datcom2/dd(4,5760000),ss(322,NFFT),savg(NFFT),nparams0 !### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 47147dc89..73574efb1 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -13,7 +13,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & parameter (NSMAX=60*96000) complex cx(NSMAX/64), cy(NSMAX/64) !Data at 1378.125 samples/s real dd(4,NSMAX) - real*4 ss(4,322,NFFT),savg(NFFT) + real*4 ss(322,NFFT),savg(NFFT) real*8 fcenter character*3 shmsg0(4) character mycall*12,hiscall*12,mygrid*6,hisgrid*6,cm*1 diff --git a/q65w/libq65/recvpkt.f90 b/q65w/libq65/recvpkt.f90 index 031ac8652..b900664fd 100644 --- a/q65w/libq65/recvpkt.f90 +++ b/q65w/libq65/recvpkt.f90 @@ -12,7 +12,7 @@ subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) integer*2 jd(4),kd(2),nblock2 real*4 xd(4),yd(2) real*8 fcenter - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),fcenter,nutc, & + common/datcom/dd(4,5760000),ss(322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) equivalence (kd,d4) equivalence (jd,d8,yd) diff --git a/q65w/libq65/symspec.f90 b/q65w/libq65/symspec.f90 index 3fcf29a1c..ecd4068ab 100644 --- a/q65w/libq65/symspec.f90 +++ b/q65w/libq65/symspec.f90 @@ -20,7 +20,7 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & parameter (NFFT=32768) !Length of FFTs real*8 ts,hsym real*8 fcenter - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(NFFT),fcenter,nutc, & + common/datcom/dd(4,5760000),ss(322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) complex z @@ -140,7 +140,7 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & n=min(322,ihsym) do i=1,NFFT sx=real(cx(i))**2 + aimag(cx(i))**2 - ss(1,n,i)=sx ! Pol = 0 + ss(n,i)=sx ! Pol = 0 savg(i)=savg(i) + sx ssz5a(i)=sx enddo diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index bdbdef326..77fc27258 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -34,7 +34,7 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) ! excised. Candidates are returned in the structure array cand(). parameter (MAX_PEAKS=100) - real ss(4,322,NFFT),savg(NFFT) + real ss(322,NFFT),savg(NFFT) real pavg(-20:20) integer indx(NFFT) logical xpol,skip,ldecoded @@ -72,10 +72,10 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) ipol=sync(n)%ipol pavg=0. do j=1,j1 - pavg=pavg + ss(ipol,j,n-20:n+20) + pavg=pavg + ss(j,n-20:n+20) enddo do j=j2,jz - pavg=pavg + ss(ipol,j,n-20:n+20) + pavg=pavg + ss(j,n-20:n+20) enddo jsum=j1 + (jz-j2+1) pmax=maxval(pavg(-2:2)) !### Why not just pavg(0) ? @@ -121,7 +121,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) use timer_module, only: timer parameter (NFFT=32768) parameter (LAGMAX=30) - real ss(4,322,NFFT) + real ss(322,NFFT) real savg(NFFT) real savg_med real a(3) @@ -178,8 +178,8 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,22 !Test for Q65 sync k=isync(j) + lag - ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) & - + ss(1,k+2,i+1) + ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) & + + ss(k+2,i+1) enddo ccf4=ccf4 - savg(i+1)*3*22/float(jz) ccf=ccf4 @@ -196,7 +196,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,63 !Test for JT65 sync, std msg k=jsync0(j) + lag - ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) + ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) enddo ccf4=ccf4 - savg(i+1)*2*63/float(jz) ccf=ccf4 @@ -213,7 +213,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) ccf4=0. do j=1,63 !Test for JT65 sync, OOO msg k=jsync1(j) + lag - ccf4=ccf4 + ss(1,k,i+1) + ss(1,k+1,i+1) + ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) enddo ccf4=ccf4 - savg(i+1)*2*63/float(jz) ccf=ccf4 @@ -256,12 +256,6 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) sync(i0)%ccfmax=spk enddo -! do i=ia,ib -! write(15,3015) 0.001*(i-1)*df3+32.0,sync(i)%ccfmax,sync(i)%xdt, & -! sync(i)%ipol,sync(i)%iflip,sync(i)%birdie -!3015 format(3f10.3,2i6,L5) -! enddo - return end subroutine wb_sync diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 42d473fd1..4f6811353 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -15,7 +15,7 @@ extern "C" struct { double d8[2*60*96000]; //This is "common/datcom/..." in fortran - float ss[4*322*NFFT]; + float ss[322*NFFT]; float savg[NFFT]; double fcenter; int nutc; From 173aab72e79c5a2d0fe3719982d579eab68b79a1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 15:15:18 -0500 Subject: [PATCH 101/251] Cleaning up compiler warnings ... --- lib/qra/q65/q65_set_list.f90 | 4 ++-- q65w/libq65/q65wa.f90 | 2 +- q65w/libq65/wideband_sync.f90 | 11 +++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/qra/q65/q65_set_list.f90 b/lib/qra/q65/q65_set_list.f90 index 22d501a5f..0b836bdeb 100644 --- a/lib/qra/q65/q65_set_list.f90 +++ b/lib/qra/q65/q65_set_list.f90 @@ -3,7 +3,7 @@ subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) parameter (MAX_NCW=206) character*12 mycall,hiscall character*6 hisgrid - character*37 msg0,msg,msgsent + character*37 msg,msgsent logical my_std,his_std integer codewords(63,MAX_NCW) integer itone(85) @@ -45,7 +45,7 @@ subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) endif endif -10 call genq65(msg,0,msgsent,itone,i3,n3) + call genq65(msg,0,msgsent,itone,i3,n3) i0=1 j=0 do k=1,85 diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 73574efb1..dd3194625 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -54,7 +54,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & if(nagain.eq.0) then call timer('get_cand',0) - call get_candidates(ss,savg,xpol,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) call timer('get_cand',1) candec=.false. endif diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index 77fc27258..d98045600 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -26,7 +26,7 @@ module wideband_sync contains -subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) +subroutine get_candidates(ss,savg,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) ! Search symbol spectra ss() over frequency range nfa to nfb (in kHz) for ! JT65 and Q65 sync patterns. The nts_* variables are the submode tone @@ -37,12 +37,12 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) real ss(322,NFFT),savg(NFFT) real pavg(-20:20) integer indx(NFFT) - logical xpol,skip,ldecoded + logical skip,ldecoded type(candidate) :: cand(MAX_CANDIDATES) type(candidate) :: cand0(MAX_CANDIDATES) common/early/nhsym1,nhsym2,ldecoded(32768) - call wb_sync(ss,savg,xpol,jz,nfa,nfb) !Output to sync() array + call wb_sync(ss,savg,jz,nfa,nfb) !Output to sync() array tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 df3=96000.0/NFFT @@ -114,7 +114,7 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) return end subroutine get_candidates -subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) +subroutine wb_sync(ss,savg,jz,nfa,nfb) ! Compute "orange sync curve" using the Q65 sync pattern @@ -124,8 +124,7 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb) real ss(322,NFFT) real savg(NFFT) real savg_med - real a(3) - logical first,xpol + logical first integer isync(22) integer jsync0(63),jsync1(63) integer ip(1) From 079927a8d8bac45aa367acc0923b6a6afb4be90a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 15:23:51 -0500 Subject: [PATCH 102/251] Compiler warnings... --- q65w/libq65/decode0.f90 | 2 +- q65w/libq65/filbig.f90 | 14 ++++++-------- q65w/libq65/ftnquit.f90 | 2 +- q65w/libq65/q65c.f90 | 3 +-- q65w/libq65/q65wa.f90 | 2 +- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index e15924c02..205924c86 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -1,4 +1,4 @@ -subroutine decode0(dd,ss,savg,nstandalone) +subroutine decode0(dd,ss,savg) use timer_module, only: timer parameter (NSMAX=60*96000) diff --git a/q65w/libq65/filbig.f90 b/q65w/libq65/filbig.f90 index 82c27ee83..415c9bb90 100644 --- a/q65w/libq65/filbig.f90 +++ b/q65w/libq65/filbig.f90 @@ -1,4 +1,4 @@ -subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) +subroutine filbig(dd,nmax,f0,newdat,nfsample,c4a,n4) ! Filter and downsample complex data stored in array dd(4,nmax). ! Output is downsampled from 96000 Hz to 1375.125 Hz. @@ -6,14 +6,14 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) use timer_module, only: timer parameter (MAXFFT1=5376000,MAXFFT2=77175) real*4 dd(4,nmax) !Input data - complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of input + complex ca(MAXFFT1) !FFT of input complex c4a(MAXFFT2) !Output data real*8 df real halfpulse(8) !Impulse response of filter (one sided) complex cfilt(MAXFFT2) !Filter (complex; imag = 0) real rfilt(MAXFFT2) !Filter (real) integer*8 plan1,plan2,plan3,plan4,plan5 - logical first,xpol + logical first include 'fftw3.f' common/cacb/ca equivalence (rfilt,cfilt) @@ -41,9 +41,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) ! Plan the FFTs just once call timer('FFTplans ',0) call sfftw_plan_dft_1d(plan1,nfft1,ca,ca,FFTW_BACKWARD,nflags) - call sfftw_plan_dft_1d(plan2,nfft1,cb,cb,FFTW_BACKWARD,nflags) call sfftw_plan_dft_1d(plan3,nfft2,c4a,c4a,FFTW_FORWARD,nflags) - call sfftw_plan_dft_1d(plan4,nfft2,c4b,c4b,FFTW_FORWARD,nflags) call sfftw_plan_dft_1d(plan5,nfft2,cfilt,cfilt,FFTW_BACKWARD,nflags) call timer('FFTplans ',1) @@ -70,7 +68,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) endif ! When new data comes along, we need to compute a new "big FFT" -! If we just have a new f0, continue with the existing ca and cb. +! If we just have a new f0, continue with the existing ca. if(newdat.ne.0 .or. sum(abs(ca)).eq.0.0) then !### Test on ca should be unnecessary? nz=min(nmax,nfft1) @@ -90,11 +88,11 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4) endif ! NB: f0 is the frequency at which we want our filter centered. -! i0 is the bin number in ca and cb closest to f0. +! i0 is the bin number in ca closest to f0. i0=nint(f0/df) + 1 nh=nfft2/2 - do i=1,nh !Copy data into c4a and c4b, + do i=1,nh !Copy data into c4a j=i0+i-1 !and apply the filter function if(j.ge.1 .and. j.le.nfft1) then c4a(i)=rfilt(i)*ca(j) diff --git a/q65w/libq65/ftnquit.f90 b/q65w/libq65/ftnquit.f90 index b74e2b9e5..fe64fac29 100644 --- a/q65w/libq65/ftnquit.f90 +++ b/q65w/libq65/ftnquit.f90 @@ -2,7 +2,7 @@ subroutine ftnquit ! Destroy the FFTW plans call four2a(a,-1,1,1,1) - call filbig(id,-1,1,f0,newdat,nfsample,c4a,c4b,n4) + call filbig(id,-1,f0,newdat,nfsample,c4a,n4) return end subroutine ftnquit diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index 13df3b68f..0ae531b06 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -44,9 +44,8 @@ subroutine q65c(itimer) ! first=.false. npatience=1 - nstandalone=0 call timer('decode0 ',0) - call decode0(dd,ss,savg,nstandalone) + call decode0(dd,ss,savg) call timer('decode0 ',1) return diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index dd3194625..cd873b719 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -105,7 +105,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & jpz=1 call timer('filbig ',0) - call filbig(dd,NSMAX,f0,newdat,nfsample,xpol,cx,cy,n5) + call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) call timer('filbig ',1) ! Do the wideband Q65 decode From d9211aee2809643249a6327010b76db06bd4522b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 15:37:06 -0500 Subject: [PATCH 103/251] Compiler warnings... --- q65w/libq65/ftninit.f90 | 5 +---- q65w/libq65/symspec.f90 | 19 ++++--------------- q65w/libq65/timf2.f90 | 5 +---- q65w/mainwindow.cpp | 11 +++-------- q65w/mainwindow.h | 7 ++----- 5 files changed, 11 insertions(+), 36 deletions(-) diff --git a/q65w/libq65/ftninit.f90 b/q65w/libq65/ftninit.f90 index 2741d662c..c55249866 100644 --- a/q65w/libq65/ftninit.f90 +++ b/q65w/libq65/ftninit.f90 @@ -27,9 +27,6 @@ subroutine ftninit ! Import FFTW wisdom, if available wisfile=trim(appd)//'/m65_wisdom.dat'// C_NULL_CHAR iret=fftwf_import_wisdom_from_filename(wisfile) + return - -950 write(0,*) '!Error opening ALL65.TXT' - stop - end subroutine ftninit diff --git a/q65w/libq65/symspec.f90 b/q65w/libq65/symspec.f90 index ecd4068ab..00de817ef 100644 --- a/q65w/libq65/symspec.f90 +++ b/q65w/libq65/symspec.f90 @@ -1,15 +1,11 @@ -subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & - fgreen,gainx,gainy,phasex,phasey,rejectx,rejecty, & - pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) +subroutine symspec(k,ndiskdat,nb,nbslider,nfsample, & + pxdb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong) ! k pointer to the most recent new data ! ndiskdat 0/1 to indicate if data from disk ! nb 0/1 status of noise blanker -! idphi Phase correction for Y channel, degrees ! nfsample sample rate (Hz) -! fgreen Frequency of green marker in I/Q calibrate mode (-48.0 to +48.0 kHz) ! pxdb power in x channel (0-60 dB) -! pydb power in y channel (0-60 dB) ! ssz5a polarized spectrum, for waterfall display ! nkhz integer kHz portion of center frequency, e.g., 125 for 144.125 ! ihsym index number of this half-symbol (1-322) @@ -23,8 +19,6 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & common/datcom/dd(4,5760000),ss(322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) real*4 ssz5a(NFFT),w(NFFT),w2a(NFFT),w2b(NFFT) - complex z - complex zsumx,zsumy complex cx(NFFT) complex cx00(NFFT) complex cx0(0:1023),cx1(0:1023) @@ -69,7 +63,6 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & peaklimit=sigmas*max(10.0,rms) faclim=3.0 px=0. - py=0. nwindow=2 nfft2=1024 @@ -82,8 +75,8 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & cx0(i)=cmplx(dd(1,j+i),dd(2,j+i)) enddo call timf2(k,nfft2,nwindow,nb,peaklimit, & - faclim,cx0,gainx,gainy,phasex,phasey,cx1,slimit,lstrong, & - px,py,nzap) + faclim,cx0,cx1,slimit,lstrong, & + px,nzap) do i=0,kstep-1 dd(1,j+i)=real(cx1(i)) @@ -111,15 +104,11 @@ subroutine symspec(k,ndiskdat,nb,nbslider,idphi,nfsample, & nsum=nblks*kstep - nzap if(nsum.le.0) nsum=1 rmsx=sqrt(0.5*px/nsum) - rmsy=sqrt(0.5*py/nsum) rms=rmsx endif pxdb=0. - pydb=0. if(rmsx.gt.1.0) pxdb=20.0*log10(rmsx) - if(rmsy.gt.1.0) pydb=20.0*log10(rmsy) if(pxdb.gt.60.0) pxdb=60.0 - if(pydb.gt.60.0) pydb=60.0 cx00=cx diff --git a/q65w/libq65/timf2.f90 b/q65w/libq65/timf2.f90 index 681e1dc24..c22f3ce05 100644 --- a/q65w/libq65/timf2.f90 +++ b/q65w/libq65/timf2.f90 @@ -1,5 +1,5 @@ subroutine timf2(k,nfft,nwindow,nb,peaklimit,faclim, & - cx0,gainx,gainy,phasex,phasey,cx1,slimit,lstrong,px,py,nzap) + cx0,cx1,slimit,lstrong,px,nzap) ! Sequential processing of time-domain I/Q data, using Linrad-like ! "first FFT" and "first backward FFT". @@ -7,8 +7,6 @@ subroutine timf2(k,nfft,nwindow,nb,peaklimit,faclim, & ! cx0 - complex input data ! nfft - length of FFTs ! nwindow - 0 for no window, 2 for sin^2 window -! gainx,y - gain error in Q channel, relative to I -! phasex,y - phase error ! cx1 - output data ! Non-windowed processing means no overlap, so kstep=nfft. @@ -29,7 +27,6 @@ subroutine timf2(k,nfft,nwindow,nb,peaklimit,faclim, & real*4 s(0:MAXFFT-1) logical*1 lstrong(0:MAXFFT-1),lprev integer ia(MAXSIGS),ib(MAXSIGS) - complex h,u,v logical first data first/.true./ data k0/99999999/ diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index d2e4f55a4..2856dae6f 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -325,13 +325,10 @@ void MainWindow::dataSink(int k) static int nfsample=96000; static int nsec0=0; static int nsum=0; - static float fgreen; static int ndiskdat; static int nb; - static float px=0.0,py=0.0; + static float px=0.0; static uchar lstrong[1024]; - static float rejectx; - static float rejecty; static float slimit; static double xsum=0.0; @@ -347,10 +344,8 @@ void MainWindow::dataSink(int k) if(m_NB) nb=1; nfsample=96000; if(!m_fs96000) nfsample=95238; - fgreen=m_wide_graph_window->fGreen(); - symspec_(&k, &ndiskdat, &nb, &m_NBslider, &m_dPhi, &nfsample, &fgreen, - &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, - &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); + symspec_(&k, &ndiskdat, &nb, &m_NBslider, &nfsample, + &px, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); int nsec=QDateTime::currentSecsSinceEpoch(); if(nsec==nsec0) { diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 8eb557063..eb924ed07 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -205,11 +205,8 @@ extern int killbyname(const char* progName); extern "C" { //----------------------------------------------------- C and Fortran routines - void symspec_(int* k, int* ndiskdat, int* nb, - int* m_NBslider, int* idphi, int* nfsample, float* fgreen, - float* gainx, float* gainy, - float* phasex, float* phasey, float* rejectx, float* rejecty, - float* px, float* py, float s[], int* nkhz, int* nhsym, + void symspec_(int* k, int* ndiskdat, int* nb, int* m_NBslider, int* nfsample, + float* px, float s[], int* nkhz, int* nhsym, int* nzap, float* slimit, uchar lstrong[]); void astrosub00_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, From bb47b65e9b0c17fa79d0a54ee2b6397dbdd5a2ef Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 15:50:08 -0500 Subject: [PATCH 104/251] Compiler warnings... --- q65w/libq65/q65b.f90 | 34 +++++++++------------------------- q65w/libq65/q65wa.f90 | 6 +++--- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 9922f06a5..d477adfc1 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -1,13 +1,11 @@ -subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & - mycall0,mygrid,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & - max_drift,nhsym,ndop00,idec) +subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & + max_drift,ndop00,idec) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. ! Raw Rx data are available as the 96 kHz complex spectrum ca(MAXFFT1) -! in common/cacb. If xpol is true, we also have cb(MAXFFT1) for the -! orthogonal polarization. Decoded messages are sent back to the GUI -! on stdout. +! in common/cacb. Decoded messages are sent back to the GUI on stdout. use q65_decode use wideband_sync @@ -19,19 +17,18 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & parameter (RAD=57.2957795) ! type(hdr) h !Header for the .wav file integer*2 iwave(60*12000) - complex ca(MAXFFT1),cb(MAXFFT1) !FFTs of raw x,y data + complex ca(MAXFFT1) !FFTs of raw x,y data complex cx(0:MAXFFT2-1),cz(0:MAXFFT2) - logical xpol,ldecoded + logical ldecoded integer ipk1(1) real*8 fcenter,freq0,freq1 character*12 mycall0,hiscall0 character*12 mycall,hiscall - character*6 mygrid,hisgrid + character*6 hisgrid character*4 grid4 character*28 msg00 character*80 line - character*80 wsjtx_dir - character*1 cp,cmode*2 + character*1 cmode*2 character*60 result common/decodes/ndecodes,ncand,result(50) common/cacb/ca @@ -39,11 +36,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & data nutc00/-1/,msg00/' '/ save - if(newdat.eq.1) nutc00=-1 -! open(9,file='wsjtx_dir.txt',status='old') -! read(9,'(a)') wsjtx_dir !Establish the working directory -! close(9) - + if(newdat.eq.1) nutc00=-1 if(mycall0(1:1).ne.' ') mycall=mycall0 if(hiscall0(1:1).ne.' ') hiscall=hiscall0 if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) @@ -156,18 +149,12 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & cmode=': ' cmode(2:2)=char(ichar('A') + mode_q65-1) freq1=freq0 + 0.001d0*(ikhz1-ikhz) -! write(26,1014) freq1,ndf,0,0,0,xdt0,npol,0,nsnr0,nutc,msg0(1:22), & -! ':',cp,cmode -!1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,1x,2a1,2x,a2) ! Suppress writing duplicates (same time, decoded message, and frequency) ! to map65_rx.log if(nutc.ne.nutc00 .or. msg0(1:28).ne.msg00 .or. freq1.ne.freq1_00) then ! Write to file map65_rx.log: ndecodes=ndecodes+1 -! write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28), & -! cmode(2:2),cq0 -!1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': ',a1,2x,a3) nutc00=nutc msg00=msg0(1:28) freq1_00=freq1 @@ -176,10 +163,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) 1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) -! print*,ndecodes,result(ndecodes) result(ndecodes)=trim(result(ndecodes))//char(0) -! write(*,1121) nutc,fsked,xdt0,nsnr0,trim(msg0) -!1121 format('~',i4.4,f9.3,f7.2,i5,2x,a,i6) endif endif diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index cd873b719..2fa51089c 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -116,9 +116,9 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & ikhz=nint(freq) f0=cand(icand)%f call timer('q65b ',0) - call q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & - xpol,mycall,mygrid,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,nhsym,ndop00,idec) + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + nagain,max_drift,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand From d3be147d35c19bfef65d1db5cc9dd63ae85b642e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 15:55:46 -0500 Subject: [PATCH 105/251] Finished first pass at fixing compiler warnings. --- q65w/libq65/decode0.f90 | 4 ++-- q65w/libq65/q65wa.f90 | 11 +++++------ q65w/libq65/txpol.f90 | 33 --------------------------------- 3 files changed, 7 insertions(+), 41 deletions(-) delete mode 100644 q65w/libq65/txpol.f90 diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 205924c86..542b8ca6d 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -49,9 +49,9 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,nxant,mycall,mygrid, & + nfcal,nsum,nxant,mycall, & hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00) + ndiskdat,nmode,ndop00) call timer('q65wa ',1) flush(6) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 2fa51089c..6b2dbdbe4 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,8 +1,8 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,nxant,mycall,mygrid, & + nfcal,nsum,nxant,mycall, & hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nxpol,nmode,ndop00) + ndiskdat,nmode,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. @@ -11,13 +11,13 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & parameter (MAXMSG=1000) !Size of decoded message list parameter (NSMAX=60*96000) - complex cx(NSMAX/64), cy(NSMAX/64) !Data at 1378.125 samples/s + complex cx(NSMAX/64) !Data at 1378.125 samples/s real dd(4,NSMAX) real*4 ss(322,NFFT),savg(NFFT) real*8 fcenter character*3 shmsg0(4) - character mycall*12,hiscall*12,mygrid*6,hisgrid*6,cm*1 - logical xpol,bq65 + character mycall*12,hiscall*12,hisgrid*6,cm*1 + logical bq65 logical candec(MAX_CANDIDATES) logical ldecoded character blank*22 @@ -47,7 +47,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mode_q65=nmode/10 nts_jt65=mode65 !JT65 tone separation factor nts_q65=2**(mode_q65-1) !Q65 tone separation factor - xpol=(nxpol.ne.0) ! No second decode for JT65? if(nhsym.eq.nhsym2 .and. nagain.eq.0 .and.ndiskdat.eq.0) mode65=0 diff --git a/q65w/libq65/txpol.f90 b/q65w/libq65/txpol.f90 deleted file mode 100644 index 042d3e549..000000000 --- a/q65w/libq65/txpol.f90 +++ /dev/null @@ -1,33 +0,0 @@ -subroutine txpol(xpol,decoded,mygrid,npol,nxant,ntxpol,cp) - -! If Tx station's grid is in decoded message, compute optimum TxPol - character*22 decoded - character*6 mygrid,grid - character*1 cp - logical xpol - - ntxpol=0 - i1=index(decoded,' ') - i2=index(decoded(i1+1:),' ') + i1 - grid=' ' - if(i2.ge.8 .and. i2.le.18) grid=decoded(i2+1:i2+4)//'mm' - ntxpol=0 - cp=' ' - if(xpol .and.grid(1:4).ne.'RR73') then - if(grid(1:1).ge.'A' .and. grid(1:1).le.'R' .and. & - grid(2:2).ge.'A' .and. grid(2:2).le.'R' .and. & - grid(3:3).ge.'0' .and. grid(3:3).le.'9' .and. & - grid(4:4).ge.'0' .and. grid(4:4).le.'9') then - ntxpol=mod(npol-nint(2.0*dpol(mygrid,grid))+720,180) - if(nxant.eq.0) then - cp='H' - if(ntxpol.gt.45 .and. ntxpol.le.135) cp='V' - else - cp='/' - if(ntxpol.ge.90 .and. ntxpol.lt.180) cp='\' - endif - endif - endif - - return -end subroutine txpol From 63bc2a64959b65e9f0f570ca2ef693974616bb53 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 17:05:54 -0500 Subject: [PATCH 106/251] Two more compiler warnings... --- q65w/libq65/decode0.f90 | 5 ++--- q65w/libq65/q65wa.f90 | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 542b8ca6d..14b2e75f3 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -48,9 +48,8 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,nxant,mycall, & - hiscall,hisgrid,nhsym,nfsample, & + mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & + nfcal,nsum,mycall,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nmode,ndop00) call timer('q65wa ',1) flush(6) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 6b2dbdbe4..273081b41 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,7 +1,6 @@ -subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & +subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,nxant,mycall, & - hiscall,hisgrid,nhsym,nfsample, & + nfcal,nsum,mycall,hiscall,hisgrid,nhsym,nfsample, & ndiskdat,nmode,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. From 516c83d4f9b9e62b1a42fee827f6532018b2c23d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 18:52:45 -0500 Subject: [PATCH 107/251] Cut the size of arrays d4() d8() dd() in half, because no xpol. --- q65w/commons.h | 4 ++-- q65w/getfile.cpp | 6 +++--- q65w/libq65/decode0.f90 | 10 +++++----- q65w/libq65/filbig.f90 | 4 ++-- q65w/libq65/q65c.f90 | 2 +- q65w/libq65/q65wa.f90 | 2 +- q65w/libq65/recvpkt.f90 | 20 +------------------- q65w/libq65/symspec.f90 | 4 ++-- q65w/soundin.cpp | 3 ++- 9 files changed, 19 insertions(+), 36 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index aa4485eaa..e145c2693 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -6,7 +6,7 @@ extern "C" { extern struct { //This is "common/datcom/..." in Fortran - float d4[4*5760000]; //Raw I/Q data from Linrad + float d4[2*5760000]; //Raw I/Q data from Linrad float ss[322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) @@ -45,7 +45,7 @@ extern struct { //This is "common/datcom/..." in Fortran } datcom_; extern struct { //This is "common/datcom/..." in Fortran - float d4[4*5760000]; //Raw I/Q data from Linrad + float d4[2*5760000]; //Raw I/Q data from Linrad float ss[322*NFFT]; //Half-symbol spectra at 0,45,90,135 deg pol float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index 01b17469d..edbae0337 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -31,13 +31,13 @@ void getfile(QString fname, bool xpol, int dbDgrd) for(int i=0; i Date: Mon, 12 Dec 2022 19:25:41 -0500 Subject: [PATCH 108/251] WIP toward implementing 'nagain=1' decodes. --- q65w/libq65/decode0.f90 | 4 ---- q65w/libq65/q65wa.f90 | 34 +++++++--------------------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 2676944eb..7b05d9415 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -28,10 +28,6 @@ subroutine decode0(dd,ss,savg) hist(j1)=hist(j1)+1 j2=min(abs(dd(2,i)),32768.0) hist(j2)=hist(j2)+1 -! j3=min(abs(dd(3,i)),32768.0) -! hist(j3)=hist(j3)+1 -! j4=min(abs(dd(4,i)),32768.0) -! hist(j4)=hist(j4)+1 enddo m=0 do i=0,32768 diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index fb119e193..c6fe35334 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -20,7 +20,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & logical candec(MAX_CANDIDATES) logical ldecoded character blank*22 - real short(3,NFFT) !SNR dt ipol for potential shorthands type(candidate) :: cand(MAX_CANDIDATES) character*60 result common/decodes/ndecodes,ncand,result(50) @@ -32,6 +31,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ save + nagain=0 !### TEMPORARY ### rewind 12 ! Clean start for Q65 at early decode @@ -41,21 +41,15 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 - mode65=mod(nmode,10) - if(mode65.eq.3) mode65=4 mode_q65=nmode/10 - nts_jt65=mode65 !JT65 tone separation factor nts_q65=2**(mode_q65-1) !Q65 tone separation factor - -! No second decode for JT65? - if(nhsym.eq.nhsym2 .and. nagain.eq.0 .and.ndiskdat.eq.0) mode65=0 - if(nagain.eq.0) then +! if(nagain.eq.0) then call timer('get_cand',0) call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) call timer('get_cand',1) candec=.false. - endif +! endif !### ! do k=1,ncand ! freq=cand(k)%f+nkhz_center-48.0 @@ -83,24 +77,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nutc0=nutc nqd=0 - fa=-1000*0.5*(nfb-nfa) + 1000*nfshift - fb= 1000*0.5*(nfb-nfa) + 1000*nfshift - ia=nint(fa/df) + 16385 - ib=nint(fb/df) + 16385 - ia=max(51,ia) - ib=min(32768-51,ib) - if(ndiskdat.eq.1 .and. mode65.eq.0) ib=ia - - km=0 - nkm=1 - nz=n/8 - freq0=-999. - sync10=-999. - fshort0=-999. - syncshort0=-999. - ntry=0 - short=0. !Zero the whole short array - jpz=1 call timer('filbig ',0) call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) @@ -113,6 +89,10 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) f0=cand(icand)%f + +! write(*,3301) nqd,ikhz,mousedf,ntol,newdat,nagain,max_drift,f0,fqso +!3301 format('DDD',7i5,2f8.3) + call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & From d1d92334bd9e5750f2c6a797297676d0ff0be460 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 12 Dec 2022 19:45:41 -0500 Subject: [PATCH 109/251] Clean up what the Erase button does. --- q65w/mainwindow.cpp | 7 ++----- q65w/mainwindow.h | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2856dae6f..d85911c6d 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -36,7 +36,7 @@ MainWindow::MainWindow(QWidget *parent) : m_gui_timer {new QTimer {this}} { ui->setupUi(this); - on_EraseButton_clicked(); +// ui->decodedTextBrowser->clear(); ui->labUTC->setStyleSheet( \ "QLabel { background-color : black; color : yellow; }"); ui->labTol1->setStyleSheet( \ @@ -903,11 +903,8 @@ void MainWindow::decode() //decode() void MainWindow::on_EraseButton_clicked() { - qint64 ms=QDateTime::currentMSecsSinceEpoch(); ui->decodedTextBrowser->clear(); - if((ms-m_msErase)<500) { - } - m_msErase=ms; + lab5->clear(); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index eb924ed07..4bd676a70 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -96,7 +96,6 @@ private: QScopedPointer m_astro_window; QScopedPointer m_wide_graph_window; QPointer m_gui_timer; - qint64 m_msErase; qint32 m_idInt; qint32 m_waterfallAvg; qint32 m_DF; From 5579c0a72988d5d1df6686940ba6b5458e315aae Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 09:23:25 -0500 Subject: [PATCH 110/251] Remove the 1.27 kHz offset from the spectrum plotted in Wide Graph. --- q65w/widegraph.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/q65w/widegraph.cpp b/q65w/widegraph.cpp index 7ae1685b2..bc64fd50b 100644 --- a/q65w/widegraph.cpp +++ b/q65w/widegraph.cpp @@ -104,15 +104,15 @@ void WideGraph::dataSink2(float s[], int nkhz, int ihsym, int ndiskdata, n++; if (n>=m_waterfallAvg) { - for (int i=0; iwidePlot->plotWidth(); qint64 sf = nkhz - 0.5*w*nbpp*df/1000.0; if(sf != ui->widePlot->startFreq()) ui->widePlot->SetStartFreq(sf); - int i0=16384.0+(ui->widePlot->startFreq()-nkhz+1.27046+0.001*m_fCal) * - 1000.0/df + 0.5; + int i0=16384.0+(ui->widePlot->startFreq()-nkhz+0.001*m_fCal) * 1000.0/df + 0.5; int i=i0; for (int j=0; j<2048; j++) { smax=0; From 01df4a8c1e693f76fbd1369aa63bda7a53c6d4c8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 11:51:52 -0500 Subject: [PATCH 111/251] Allow Max Age up to 60, rather than 10. --- widgets/activeStations.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/activeStations.ui b/widgets/activeStations.ui index 50730a9c6..262fa7d09 100644 --- a/widgets/activeStations.ui +++ b/widgets/activeStations.ui @@ -98,7 +98,7 @@ 0 - 10 + 60 4 From 9d89042d4433429d93fef64c8868771474d9f1d1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 12:58:15 -0500 Subject: [PATCH 112/251] Remove another instance of the 1.27 kHz offset. --- q65w/plotter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/q65w/plotter.cpp b/q65w/plotter.cpp index ab53a4efb..c43ffb768 100644 --- a/q65w/plotter.cpp +++ b/q65w/plotter.cpp @@ -102,8 +102,7 @@ void CPlotter::paintEvent(QPaintEvent *) // paintEvent() painter.drawPixmap(target,m_ZoomScalePixmap,source); float df=m_fSample/32768.0; - int x0=16384 + (0.001*(m_ZoomStartFreq+m_fCal)+m_fQSO-m_nkhz+1.27046) * \ - 1000.0/df + 0.5; + int x0=16384 + (0.001*(m_ZoomStartFreq+m_fCal)+m_fQSO-m_nkhz) * 1000.0/df + 0.5; QPainter painter1(&m_WaterfallPixmap); QPainter painter2(&m_ZoomWaterfallPixmap); From f68d4e2e6feb366ff817c435a3a5e00d2fb3ca9c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 12:58:52 -0500 Subject: [PATCH 113/251] Remove common/early/ and its variables -- they are not used in q65w. --- q65w/libq65/decode0.f90 | 2 -- q65w/libq65/q65b.f90 | 4 ---- q65w/libq65/q65c.f90 | 3 +-- q65w/libq65/q65wa.f90 | 25 ++++--------------------- q65w/libq65/wideband_sync.f90 | 3 +-- 5 files changed, 6 insertions(+), 31 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 7b05d9415..2d0e2565f 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -6,7 +6,6 @@ subroutine decode0(dd,ss,savg) real*4 dd(2,NSMAX),ss(322,NFFT),savg(NFFT) real*8 fcenter integer hist(0:32768) - logical ldecoded character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 character mycall0*12,hiscall0*12,hisgrid0*6 character*60 result @@ -15,7 +14,6 @@ subroutine decode0(dd,ss,savg) ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime - common/early/nhsym1,nhsym2,ldecoded(32768) data neme0/-99/ save diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index d477adfc1..be72331a3 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -19,7 +19,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & integer*2 iwave(60*12000) complex ca(MAXFFT1) !FFTs of raw x,y data complex cx(0:MAXFFT2-1),cz(0:MAXFFT2) - logical ldecoded integer ipk1(1) real*8 fcenter,freq0,freq1 character*12 mycall0,hiscall0 @@ -32,7 +31,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & character*60 result common/decodes/ndecodes,ncand,result(50) common/cacb/ca - common/early/nhsym1,nhsym2,ldecoded(32768) data nutc00/-1/,msg00/' '/ save @@ -48,7 +46,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ib=nint(ifreq+ntol/df3) ipk1=maxloc(sync(ia:ib)%ccfmax) ipk=ia+ipk1(1)-1 - if(ldecoded(ipk)) go to 900 snr1=sync(ipk)%ccfmax ipol=1 @@ -129,7 +126,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & freq0=MHz + 0.001d0*ikhz if(nsnr0.gt.-99) then - ldecoded(ipk)=.true. nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal nq65df=nq65df + nfreq0 - 1000 npol=nint(poldeg) diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index 2f663fdd9..57667b32e 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -11,7 +11,7 @@ subroutine q65c(itimer) include 'njunk.f90' real*8 fcenter integer nparams0(NJUNK+3),nparams(NJUNK+3) - logical ldecoded,first + logical first character*12 mycall,hiscall character*6 mygrid,hisgrid character*20 datetime @@ -26,7 +26,6 @@ subroutine q65c(itimer) datetime,junk1,junk2 !### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### - common/early/nhsym1,nhsym2,ldecoded(32768) equivalence (nparams,fcenter) data first/.true./ save first diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index c6fe35334..0aac6fd85 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -18,13 +18,11 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & character mycall*12,hiscall*12,hisgrid*6,cm*1 logical bq65 logical candec(MAX_CANDIDATES) - logical ldecoded character blank*22 type(candidate) :: cand(MAX_CANDIDATES) character*60 result common/decodes/ndecodes,ncand,result(50) common/testcom/ifreq - common/early/nhsym1,nhsym2,ldecoded(32768) data blank/' '/,cm/'#'/ data shmsg0/'ATT','RO ','RRR','73 '/ @@ -34,31 +32,16 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nagain=0 !### TEMPORARY ### rewind 12 -! Clean start for Q65 at early decode - if(nhsym.eq.nhsym1 .or. nagain.ne.0) ldecoded=.false. - if(ndiskdat.eq.1) ldecoded=.false. - nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 mode_q65=nmode/10 nts_q65=2**(mode_q65-1) !Q65 tone separation factor -! if(nagain.eq.0) then - call timer('get_cand',0) - call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) - call timer('get_cand',1) - candec=.false. -! endif -!### -! do k=1,ncand -! freq=cand(k)%f+nkhz_center-48.0 -! ipk=cand(k)%indx -! write(71,3071) k,db(cand(k)%snr),freq,cand(k)%xdt, & -! cand(k)%ipol,cand(k)%iflip,ipk,ldecoded(ipk) -!3071 format(i3,f8.2,f10.3,f8.2,2i3,i6,L4) -! enddo -!### + call timer('get_cand',0) + call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call timer('get_cand',1) + candec=.false. nwrite_q65=0 bq65=mode_q65.gt.0 diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index d98045600..080258c8d 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -37,10 +37,9 @@ subroutine get_candidates(ss,savg,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) real ss(322,NFFT),savg(NFFT) real pavg(-20:20) integer indx(NFFT) - logical skip,ldecoded + logical skip type(candidate) :: cand(MAX_CANDIDATES) type(candidate) :: cand0(MAX_CANDIDATES) - common/early/nhsym1,nhsym2,ldecoded(32768) call wb_sync(ss,savg,jz,nfa,nfb) !Output to sync() array From db00402aad5263857f7949b725330bf5a9d78434 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 14:00:41 -0500 Subject: [PATCH 114/251] Add jt_daemon.cpp. This may be TEMPORARY. --- CMakeLists.txt | 5 +- UDPExamples/jt_daemon.cpp | 333 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 337 insertions(+), 1 deletion(-) create mode 100644 UDPExamples/jt_daemon.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e7c6893c..3c7636617 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1513,6 +1513,9 @@ generate_version_info (udp_daemon_VERSION_RESOURCES add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) target_link_libraries (udp_daemon wsjtx_udp-static) +add_executable (jt_daemon UDPExamples/jt_daemon.cpp ${udp_daemon_VERSION_RESOURCES}) +target_link_libraries (jt_daemon wsjtx_udp-static) + generate_version_info (wsjtx_app_version_VERSION_RESOURCES NAME wsjtx_app_version BUNDLE ${PROJECT_BUNDLE_NAME} @@ -1581,7 +1584,7 @@ install (TARGETS wsjtx # DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx # ) -install (TARGETS udp_daemon message_aggregator wsjtx_app_version +install (TARGETS udp_daemon jt_daemon message_aggregator wsjtx_app_version RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) diff --git a/UDPExamples/jt_daemon.cpp b/UDPExamples/jt_daemon.cpp new file mode 100644 index 000000000..47cc1ee14 --- /dev/null +++ b/UDPExamples/jt_daemon.cpp @@ -0,0 +1,333 @@ +// +// UDPDaemon - an example console application that utilizes the WSJT-X +// messaging facility +// +// This application is only provided as a simple console application +// example to demonstrate the WSJT-X messaging facility. It allows +// the user to set the server details either as a unicast UDP server +// or, if a multicast group address is provided, as a multicast +// server. The benefit of the multicast server is that multiple +// servers can be active at once each receiving all WSJT-X broadcast +// messages and each able to respond to individual WSJT_X clients. To +// utilize the multicast group features each WSJT-X client must set +// the same multicast group address as the UDP server address for +// example 239.255.0.0 for a site local multicast group. +// +// + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "MessageServer.hpp" +#include "Radio.hpp" + +#include "qt_helpers.hpp" + +using port_type = MessageServer::port_type; +using Frequency = MessageServer::Frequency; + +class Client + : public QObject +{ + Q_OBJECT + + using ClientKey = MessageServer::ClientKey; + +public: + explicit Client (ClientKey const& key, QObject * parent = nullptr) + : QObject {parent} + , key_ {key} + , dial_frequency_ {0u} + { + } + + Q_SLOT void update_status (ClientKey const& key, Frequency f, QString const& mode, QString const& /*dx_call*/ + , QString const& /*report*/, QString const& /*tx_mode*/, bool /*tx_enabled*/ + , bool transmitting, bool decoding, qint32 /*rx_df*/, qint32 /*tx_df*/ + , QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/ + , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/ + , quint8 /*special_op_mode*/, quint32 /*frequency_tolerance*/, quint32 /*tr_period*/ + , QString const& /*configuration_name*/, QString const& /*tx_message*/) + { + if (key == key_) + { + if (f != dial_frequency_) + { + std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () + << QString {"Dial frequency changed to %1"}.arg (f).toStdString () << std::endl; + dial_frequency_ = f; + } + if (mode + sub_mode != mode_) + { + std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () + << QString {"Mode changed to %1"}.arg (mode + sub_mode).toStdString () << transmitting << std::endl; + mode_ = mode + sub_mode; + } + qDebug() << "aa" << transmitting << decoding; + } + } + + Q_SLOT void decode_added (bool is_new, ClientKey const& key, QTime time, qint32 snr + , float delta_time, quint32 delta_frequency, QString const& mode + , QString const& message, bool low_confidence, bool off_air) + { + if (key == key_) + { + qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr + << "Dt:" << delta_time << "Df:" << delta_frequency + << "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high") + << "On air:" << !off_air; + std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () + << QString {"Decoded %1"}.arg (message).toStdString () << std::endl; + } + } + + Q_SLOT void beacon_spot_added (bool is_new, ClientKey const& key, QTime time, qint32 snr + , float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign + , QString const& grid, qint32 power, bool off_air) + { + if (key == key_) + { + qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr + << "Dt:" << delta_time << "Df:" << delta_frequency + << "drift:" << drift; + std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () + << QString {"WSPR decode %1 grid %2 power: %3"} + .arg (callsign).arg (grid).arg (power).toStdString () + << "On air:" << !off_air << std::endl; + } + } + + Q_SLOT void qso_logged (ClientKey const& key, QDateTime time_off, QString const& dx_call, QString const& dx_grid + , Frequency dial_frequency, QString const& mode, QString const& report_sent + , QString const& report_received, QString const& tx_power + , QString const& comments, QString const& name, QDateTime time_on + , QString const& operator_call, QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd, QString const& prop_mode) + { + if (key == key_) + { + qDebug () << "time_on:" << time_on << "time_off:" << time_off << "dx_call:" + << dx_call << "grid:" << dx_grid + << "freq:" << dial_frequency << "mode:" << mode << "rpt_sent:" << report_sent + << "rpt_rcvd:" << report_received << "Tx_pwr:" << tx_power << "comments:" << comments + << "name:" << name << "operator_call:" << operator_call << "my_call:" << my_call + << "my_grid:" << my_grid << "exchange_sent:" << exchange_sent + << "exchange_rcvd:" << exchange_rcvd << "prop_mode:" << prop_mode; + std::cout << QByteArray {80, '-'}.data () << '\n'; + std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () + << QString {"Logged %1 grid: %2 power: %3 sent: %4 recd: %5 freq: %6 time_off: %7 op: %8 my_call: %9 my_grid: %10 exchange_sent: %11 exchange_rcvd: %12 comments: %13 prop_mode: %14"} + .arg (dx_call).arg (dx_grid).arg (tx_power) + .arg (report_sent).arg (report_received) + .arg (dial_frequency).arg (time_off.toString("yyyy-MM-dd hh:mm:ss.z")).arg (operator_call) + .arg (my_call).arg (my_grid).arg (exchange_sent).arg (exchange_rcvd) + .arg (comments).arg (prop_mode).toStdString () + << std::endl; + } + } + + Q_SLOT void logged_ADIF (ClientKey const& key, QByteArray const& ADIF) + { + if (key == key_) + { + qDebug () << "ADIF:" << ADIF; + std::cout << QByteArray {80, '-'}.data () << '\n'; + std::cout << ADIF.data () << std::endl; + } + } + +private: + ClientKey key_; + Frequency dial_frequency_; + QString mode_; + bool transmitting_; + bool decoding_; +}; + +class Server + : public QObject +{ + Q_OBJECT + + using ClientKey = MessageServer::ClientKey; + +public: + Server (port_type port, QHostAddress const& multicast_group, QStringList const& network_interface_names) + : server_ {new MessageServer {this}} + { + // connect up server + connect (server_, &MessageServer::error, [] (QString const& message) { + std::cerr << tr ("Network Error: %1").arg ( message).toStdString () << std::endl; + }); + connect (server_, &MessageServer::client_opened, this, &Server::add_client); + connect (server_, &MessageServer::client_closed, this, &Server::remove_client); + +#if QT_VERSION >= QT_VERSION_CHECK (5, 14, 0) + server_->start (port, multicast_group, QSet {network_interface_names.begin (), network_interface_names.end ()}); +#else + server_->start (port, multicast_group, network_interface_names.toSet ()); +#endif + } + +private: + void add_client (ClientKey const& key, QString const& version, QString const& revision) + { + auto client = new Client {key}; + connect (server_, &MessageServer::status_update, client, &Client::update_status); + connect (server_, &MessageServer::decode, client, &Client::decode_added); + connect (server_, &MessageServer::WSPR_decode, client, &Client::beacon_spot_added); + connect (server_, &MessageServer::qso_logged, client, &Client::qso_logged); + connect (server_, &MessageServer::logged_ADIF, client, &Client::logged_ADIF); + clients_[key] = client; + server_->replay (key); + std::cout << "Discovered WSJT-X instance: " << key.second.toStdString () + << '(' << key.first.toString ().toStdString () << ')'; + if (version.size ()) + { + std::cout << " v" << version.toStdString (); + } + if (revision.size ()) + { + std::cout << " (" << revision.toStdString () << ")"; + } + std::cout << std::endl; + } + + void remove_client (ClientKey const& key) + { + auto iter = clients_.find (key); + if (iter != std::end (clients_)) + { + clients_.erase (iter); + (*iter)->deleteLater (); + } + std::cout << "Removed WSJT-X instance: " << key.second.toStdString () + << '(' << key.first.toString ().toStdString () << ')' << std::endl; + } + + MessageServer * server_; + + // maps client key to clients + QHash clients_; +}; + +void list_interfaces () +{ + for (auto const& net_if : QNetworkInterface::allInterfaces ()) + { + if (net_if.flags () & QNetworkInterface::IsUp) + { + std::cout << net_if.humanReadableName ().toStdString () << ":\n" + " id: " << net_if.name ().toStdString () << " (" << net_if.index () << ")\n" + " addr: " << net_if.hardwareAddress ().toStdString () << "\n" + " flags: "; + if (net_if.flags () & QNetworkInterface::IsRunning) + { + std::cout << "Running "; + } + if (net_if.flags () & QNetworkInterface::CanBroadcast) + { + std::cout << "Broadcast "; + } + if (net_if.flags () & QNetworkInterface::CanMulticast) + { + std::cout << "Multicast "; + } + if (net_if.flags () & QNetworkInterface::IsLoopBack) + { + std::cout << "Loop-back "; + } + std::cout << "\n addresses:\n"; + for (auto const& ae : net_if.addressEntries ()) + { + std::cout << " " << ae.ip ().toString ().toStdString () << '\n'; + } + std::cout << '\n'; + } + } +} + +#include "jt_daemon.moc" + +int main (int argc, char * argv[]) +{ + QCoreApplication app {argc, argv}; + try + { + // ensure number forms are in consistent format, do this after + // instantiating QApplication so that GUI has correct l18n + std::locale::global (std::locale::classic ()); + + app.setApplicationName ("WSJT-X UDP Message Server Daemon"); + app.setApplicationVersion ("1.0"); + + QCommandLineParser parser; + parser.setApplicationDescription ("\nWSJT-X UDP Message Server Daemon."); + auto help_option = parser.addHelpOption (); + auto version_option = parser.addVersionOption (); + + QCommandLineOption list_option (QStringList {"l", "list-interfaces"}, + app.translate ("UDPDaemon", + "Print the available network interfaces.")); + parser.addOption (list_option); + + QCommandLineOption port_option (QStringList {"p", "port"}, + app.translate ("UDPDaemon", + "Where is the UDP service port number to listen on.\n" + "The default service port is 2237."), + app.translate ("UDPDaemon", "PORT"), + "2237"); + parser.addOption (port_option); + + QCommandLineOption multicast_addr_option (QStringList {"g", "multicast-group"}, + app.translate ("UDPDaemon", + "Where is the multicast group to join.\n" + "The default is a unicast server listening on all interfaces."), + app.translate ("UDPDaemon", "GROUP")); + parser.addOption (multicast_addr_option); + + QCommandLineOption network_interface_option (QStringList {"i", "network-interface"}, + app.translate ("UDPDaemon", + "Where is the network interface name to join on.\n" + "This option can be passed more than once to specify multiple network interfaces\n" + "The default is use just the loop back interface."), + app.translate ("UDPDaemon", "INTERFACE")); + parser.addOption (network_interface_option); + + parser.process (app); + + if (parser.isSet (list_option)) + { + list_interfaces (); + return EXIT_SUCCESS; + } + + Server server {static_cast (parser.value (port_option).toUInt ()) + , QHostAddress {parser.value (multicast_addr_option).trimmed ()} + , parser.values (network_interface_option)}; + + return app.exec (); + } + catch (std::exception const & e) + { + std::cerr << "Error: " << e.what () << '\n'; + } + catch (...) + { + std::cerr << "Unexpected error\n"; + } + return -1; +} From 68d036913acf3a46b28eb6b885bb1a6779bb7639 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 14:14:51 -0500 Subject: [PATCH 115/251] Remove test jt_daemon: forget it, for now. --- CMakeLists.txt | 5 +- UDPExamples/jt_daemon.cpp | 333 -------------------------------------- 2 files changed, 1 insertion(+), 337 deletions(-) delete mode 100644 UDPExamples/jt_daemon.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c7636617..1e7c6893c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1513,9 +1513,6 @@ generate_version_info (udp_daemon_VERSION_RESOURCES add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) target_link_libraries (udp_daemon wsjtx_udp-static) -add_executable (jt_daemon UDPExamples/jt_daemon.cpp ${udp_daemon_VERSION_RESOURCES}) -target_link_libraries (jt_daemon wsjtx_udp-static) - generate_version_info (wsjtx_app_version_VERSION_RESOURCES NAME wsjtx_app_version BUNDLE ${PROJECT_BUNDLE_NAME} @@ -1584,7 +1581,7 @@ install (TARGETS wsjtx # DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx # ) -install (TARGETS udp_daemon jt_daemon message_aggregator wsjtx_app_version +install (TARGETS udp_daemon message_aggregator wsjtx_app_version RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) diff --git a/UDPExamples/jt_daemon.cpp b/UDPExamples/jt_daemon.cpp deleted file mode 100644 index 47cc1ee14..000000000 --- a/UDPExamples/jt_daemon.cpp +++ /dev/null @@ -1,333 +0,0 @@ -// -// UDPDaemon - an example console application that utilizes the WSJT-X -// messaging facility -// -// This application is only provided as a simple console application -// example to demonstrate the WSJT-X messaging facility. It allows -// the user to set the server details either as a unicast UDP server -// or, if a multicast group address is provided, as a multicast -// server. The benefit of the multicast server is that multiple -// servers can be active at once each receiving all WSJT-X broadcast -// messages and each able to respond to individual WSJT_X clients. To -// utilize the multicast group features each WSJT-X client must set -// the same multicast group address as the UDP server address for -// example 239.255.0.0 for a site local multicast group. -// -// - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "MessageServer.hpp" -#include "Radio.hpp" - -#include "qt_helpers.hpp" - -using port_type = MessageServer::port_type; -using Frequency = MessageServer::Frequency; - -class Client - : public QObject -{ - Q_OBJECT - - using ClientKey = MessageServer::ClientKey; - -public: - explicit Client (ClientKey const& key, QObject * parent = nullptr) - : QObject {parent} - , key_ {key} - , dial_frequency_ {0u} - { - } - - Q_SLOT void update_status (ClientKey const& key, Frequency f, QString const& mode, QString const& /*dx_call*/ - , QString const& /*report*/, QString const& /*tx_mode*/, bool /*tx_enabled*/ - , bool transmitting, bool decoding, qint32 /*rx_df*/, qint32 /*tx_df*/ - , QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/ - , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/ - , quint8 /*special_op_mode*/, quint32 /*frequency_tolerance*/, quint32 /*tr_period*/ - , QString const& /*configuration_name*/, QString const& /*tx_message*/) - { - if (key == key_) - { - if (f != dial_frequency_) - { - std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () - << QString {"Dial frequency changed to %1"}.arg (f).toStdString () << std::endl; - dial_frequency_ = f; - } - if (mode + sub_mode != mode_) - { - std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () - << QString {"Mode changed to %1"}.arg (mode + sub_mode).toStdString () << transmitting << std::endl; - mode_ = mode + sub_mode; - } - qDebug() << "aa" << transmitting << decoding; - } - } - - Q_SLOT void decode_added (bool is_new, ClientKey const& key, QTime time, qint32 snr - , float delta_time, quint32 delta_frequency, QString const& mode - , QString const& message, bool low_confidence, bool off_air) - { - if (key == key_) - { - qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr - << "Dt:" << delta_time << "Df:" << delta_frequency - << "mode:" << mode << "Confidence:" << (low_confidence ? "low" : "high") - << "On air:" << !off_air; - std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () - << QString {"Decoded %1"}.arg (message).toStdString () << std::endl; - } - } - - Q_SLOT void beacon_spot_added (bool is_new, ClientKey const& key, QTime time, qint32 snr - , float delta_time, Frequency delta_frequency, qint32 drift, QString const& callsign - , QString const& grid, qint32 power, bool off_air) - { - if (key == key_) - { - qDebug () << "new:" << is_new << "t:" << time << "snr:" << snr - << "Dt:" << delta_time << "Df:" << delta_frequency - << "drift:" << drift; - std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () - << QString {"WSPR decode %1 grid %2 power: %3"} - .arg (callsign).arg (grid).arg (power).toStdString () - << "On air:" << !off_air << std::endl; - } - } - - Q_SLOT void qso_logged (ClientKey const& key, QDateTime time_off, QString const& dx_call, QString const& dx_grid - , Frequency dial_frequency, QString const& mode, QString const& report_sent - , QString const& report_received, QString const& tx_power - , QString const& comments, QString const& name, QDateTime time_on - , QString const& operator_call, QString const& my_call, QString const& my_grid - , QString const& exchange_sent, QString const& exchange_rcvd, QString const& prop_mode) - { - if (key == key_) - { - qDebug () << "time_on:" << time_on << "time_off:" << time_off << "dx_call:" - << dx_call << "grid:" << dx_grid - << "freq:" << dial_frequency << "mode:" << mode << "rpt_sent:" << report_sent - << "rpt_rcvd:" << report_received << "Tx_pwr:" << tx_power << "comments:" << comments - << "name:" << name << "operator_call:" << operator_call << "my_call:" << my_call - << "my_grid:" << my_grid << "exchange_sent:" << exchange_sent - << "exchange_rcvd:" << exchange_rcvd << "prop_mode:" << prop_mode; - std::cout << QByteArray {80, '-'}.data () << '\n'; - std::cout << QString {"%1(%2): "}.arg (key_.second).arg (key_.first.toString ()).toStdString () - << QString {"Logged %1 grid: %2 power: %3 sent: %4 recd: %5 freq: %6 time_off: %7 op: %8 my_call: %9 my_grid: %10 exchange_sent: %11 exchange_rcvd: %12 comments: %13 prop_mode: %14"} - .arg (dx_call).arg (dx_grid).arg (tx_power) - .arg (report_sent).arg (report_received) - .arg (dial_frequency).arg (time_off.toString("yyyy-MM-dd hh:mm:ss.z")).arg (operator_call) - .arg (my_call).arg (my_grid).arg (exchange_sent).arg (exchange_rcvd) - .arg (comments).arg (prop_mode).toStdString () - << std::endl; - } - } - - Q_SLOT void logged_ADIF (ClientKey const& key, QByteArray const& ADIF) - { - if (key == key_) - { - qDebug () << "ADIF:" << ADIF; - std::cout << QByteArray {80, '-'}.data () << '\n'; - std::cout << ADIF.data () << std::endl; - } - } - -private: - ClientKey key_; - Frequency dial_frequency_; - QString mode_; - bool transmitting_; - bool decoding_; -}; - -class Server - : public QObject -{ - Q_OBJECT - - using ClientKey = MessageServer::ClientKey; - -public: - Server (port_type port, QHostAddress const& multicast_group, QStringList const& network_interface_names) - : server_ {new MessageServer {this}} - { - // connect up server - connect (server_, &MessageServer::error, [] (QString const& message) { - std::cerr << tr ("Network Error: %1").arg ( message).toStdString () << std::endl; - }); - connect (server_, &MessageServer::client_opened, this, &Server::add_client); - connect (server_, &MessageServer::client_closed, this, &Server::remove_client); - -#if QT_VERSION >= QT_VERSION_CHECK (5, 14, 0) - server_->start (port, multicast_group, QSet {network_interface_names.begin (), network_interface_names.end ()}); -#else - server_->start (port, multicast_group, network_interface_names.toSet ()); -#endif - } - -private: - void add_client (ClientKey const& key, QString const& version, QString const& revision) - { - auto client = new Client {key}; - connect (server_, &MessageServer::status_update, client, &Client::update_status); - connect (server_, &MessageServer::decode, client, &Client::decode_added); - connect (server_, &MessageServer::WSPR_decode, client, &Client::beacon_spot_added); - connect (server_, &MessageServer::qso_logged, client, &Client::qso_logged); - connect (server_, &MessageServer::logged_ADIF, client, &Client::logged_ADIF); - clients_[key] = client; - server_->replay (key); - std::cout << "Discovered WSJT-X instance: " << key.second.toStdString () - << '(' << key.first.toString ().toStdString () << ')'; - if (version.size ()) - { - std::cout << " v" << version.toStdString (); - } - if (revision.size ()) - { - std::cout << " (" << revision.toStdString () << ")"; - } - std::cout << std::endl; - } - - void remove_client (ClientKey const& key) - { - auto iter = clients_.find (key); - if (iter != std::end (clients_)) - { - clients_.erase (iter); - (*iter)->deleteLater (); - } - std::cout << "Removed WSJT-X instance: " << key.second.toStdString () - << '(' << key.first.toString ().toStdString () << ')' << std::endl; - } - - MessageServer * server_; - - // maps client key to clients - QHash clients_; -}; - -void list_interfaces () -{ - for (auto const& net_if : QNetworkInterface::allInterfaces ()) - { - if (net_if.flags () & QNetworkInterface::IsUp) - { - std::cout << net_if.humanReadableName ().toStdString () << ":\n" - " id: " << net_if.name ().toStdString () << " (" << net_if.index () << ")\n" - " addr: " << net_if.hardwareAddress ().toStdString () << "\n" - " flags: "; - if (net_if.flags () & QNetworkInterface::IsRunning) - { - std::cout << "Running "; - } - if (net_if.flags () & QNetworkInterface::CanBroadcast) - { - std::cout << "Broadcast "; - } - if (net_if.flags () & QNetworkInterface::CanMulticast) - { - std::cout << "Multicast "; - } - if (net_if.flags () & QNetworkInterface::IsLoopBack) - { - std::cout << "Loop-back "; - } - std::cout << "\n addresses:\n"; - for (auto const& ae : net_if.addressEntries ()) - { - std::cout << " " << ae.ip ().toString ().toStdString () << '\n'; - } - std::cout << '\n'; - } - } -} - -#include "jt_daemon.moc" - -int main (int argc, char * argv[]) -{ - QCoreApplication app {argc, argv}; - try - { - // ensure number forms are in consistent format, do this after - // instantiating QApplication so that GUI has correct l18n - std::locale::global (std::locale::classic ()); - - app.setApplicationName ("WSJT-X UDP Message Server Daemon"); - app.setApplicationVersion ("1.0"); - - QCommandLineParser parser; - parser.setApplicationDescription ("\nWSJT-X UDP Message Server Daemon."); - auto help_option = parser.addHelpOption (); - auto version_option = parser.addVersionOption (); - - QCommandLineOption list_option (QStringList {"l", "list-interfaces"}, - app.translate ("UDPDaemon", - "Print the available network interfaces.")); - parser.addOption (list_option); - - QCommandLineOption port_option (QStringList {"p", "port"}, - app.translate ("UDPDaemon", - "Where is the UDP service port number to listen on.\n" - "The default service port is 2237."), - app.translate ("UDPDaemon", "PORT"), - "2237"); - parser.addOption (port_option); - - QCommandLineOption multicast_addr_option (QStringList {"g", "multicast-group"}, - app.translate ("UDPDaemon", - "Where is the multicast group to join.\n" - "The default is a unicast server listening on all interfaces."), - app.translate ("UDPDaemon", "GROUP")); - parser.addOption (multicast_addr_option); - - QCommandLineOption network_interface_option (QStringList {"i", "network-interface"}, - app.translate ("UDPDaemon", - "Where is the network interface name to join on.\n" - "This option can be passed more than once to specify multiple network interfaces\n" - "The default is use just the loop back interface."), - app.translate ("UDPDaemon", "INTERFACE")); - parser.addOption (network_interface_option); - - parser.process (app); - - if (parser.isSet (list_option)) - { - list_interfaces (); - return EXIT_SUCCESS; - } - - Server server {static_cast (parser.value (port_option).toUInt ()) - , QHostAddress {parser.value (multicast_addr_option).trimmed ()} - , parser.values (network_interface_option)}; - - return app.exec (); - } - catch (std::exception const & e) - { - std::cerr << "Error: " << e.what () << '\n'; - } - catch (...) - { - std::cerr << "Unexpected error\n"; - } - return -1; -} From 8507f6ff466443819ec269e3cc0ccf9772a8fc96 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 15:04:50 -0500 Subject: [PATCH 116/251] Code cleanup... --- q65w/libq65/decode0.f90 | 3 +-- q65w/libq65/q65b.f90 | 5 ----- q65w/libq65/q65wa.f90 | 31 ++++++++----------------------- 3 files changed, 9 insertions(+), 30 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 2d0e2565f..2a1beb97b 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -43,8 +43,7 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,mycall,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nmode,ndop00) + nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndop00) call timer('q65wa ',1) flush(6) diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index be72331a3..ce8375248 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -104,11 +104,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & enddo iwave(2*nfft2+1:)=0 -! open(30,file='000000_0001.wav',status='unknown',access='stream') -! h=default_header(12000,NMAX) -! write(30) h,iwave -! close(30) - nsubmode=mode_q65-1 nfa=990 !Tight limits around ipk for the wideband decode nfb=1010 diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 0aac6fd85..176fc19d5 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,7 +1,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,nsum,mycall,hiscall,hisgrid,nhsym,nfsample, & - ndiskdat,nmode,ndop00) + nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. @@ -14,22 +13,19 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & real dd(2,NSMAX) real*4 ss(322,NFFT),savg(NFFT) real*8 fcenter - character*3 shmsg0(4) - character mycall*12,hiscall*12,hisgrid*6,cm*1 + character mycall*12,hiscall*12,hisgrid*6 logical bq65 logical candec(MAX_CANDIDATES) - character blank*22 type(candidate) :: cand(MAX_CANDIDATES) character*60 result common/decodes/ndecodes,ncand,result(50) common/testcom/ifreq - - data blank/' '/,cm/'#'/ - data shmsg0/'ATT','RO ','RRR','73 '/ - data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ save - nagain=0 !### TEMPORARY ### +! write(*,3001) newdat,ntol,nfa,nfb,mousedf,mousefqso,nagain,nfshift,max_drift +!3001 format(9i6) + + nagain=0 !### TEMPORARY ? ### rewind 12 nkhz_center=nint(1000.0*(fcenter-int(fcenter))) @@ -45,36 +41,25 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nwrite_q65=0 bq65=mode_q65.gt.0 - - mousefqso0=mousefqso - nsum=0 - df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz if(nfsample.eq.95238) df=95238.1/NFFT ftol=0.010 !Frequency tolerance (kHz) foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) iloop=0 - - if(nutc.ne.nutc0) nfile=nfile+1 - nutc0=nutc - nqd=0 call timer('filbig ',0) call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) call timer('filbig ',1) -! Do the wideband Q65 decode +! Do the wideband Q65 decode do icand=1,ncand + f0=cand(icand)%f if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here if(candec(icand)) cycle !Skip if already decoded freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) - f0=cand(icand)%f - -! write(*,3301) nqd,ikhz,mousedf,ntol,newdat,nagain,max_drift,f0,fqso -!3301 format('DDD',7i5,2f8.3) call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & From 388f61b45cc01e75d8f5ebf11df9f161162bd474 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 15:27:33 -0500 Subject: [PATCH 117/251] Code cleanup... --- q65w/libq65/q65b.f90 | 54 ++++++++------------------------------ q65w/libq65/q65wa.f90 | 2 +- q65w/libq65/s3avg.f90 | 60 ------------------------------------------- 3 files changed, 12 insertions(+), 104 deletions(-) delete mode 100644 q65w/libq65/s3avg.f90 diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index ce8375248..ecc1ee41e 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -1,6 +1,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & - max_drift,ndop00,idec) + max_drift,ndop00) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. @@ -25,21 +25,16 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & character*12 mycall,hiscall character*6 hisgrid character*4 grid4 - character*28 msg00 - character*80 line - character*1 cmode*2 character*60 result common/decodes/ndecodes,ncand,result(50) common/cacb/ca - data nutc00/-1/,msg00/' '/ save - if(newdat.eq.1) nutc00=-1 if(mycall0(1:1).ne.' ') mycall=mycall0 if(hiscall0(1:1).ne.' ') hiscall=hiscall0 if(hisgrid(1:4).ne.' ') grid4=hisgrid(1:4) -! Find best frequency and ipol from sync_dat, the "orange sync curve". +! Find best frequency from sync_dat, the "orange sync curve". df3=96000.0/32768.0 ifreq=nint((1000.0*f0)/df3) ia=nint(ifreq-ntol/df3) @@ -47,7 +42,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ipk1=maxloc(sync(ia:ib)%ccfmax) ipk=ia+ipk1(1)-1 snr1=sync(ipk)%ccfmax - ipol=1 nfft1=MAXFFT1 nfft2=MAXFFT2 @@ -81,7 +75,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! 96000 5376000 0.017857143 336000 6000.000 ! 95238 5120000 0.018601172 322560 5999.994 - poldeg=0. cz(0:MAXFFT2-1)=cx cz(MAXFFT2)=0. @@ -123,47 +116,22 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & if(nsnr0.gt.-99) then nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal nq65df=nq65df + nfreq0 - 1000 - npol=nint(poldeg) ikhz1=ikhz ndf=nq65df if(ndf.gt.500) ikhz1=ikhz + (nq65df+500)/1000 if(ndf.lt.-500) ikhz1=ikhz + (nq65df-500)/1000 ndf=nq65df - 1000*(ikhz1-ikhz) - if(nqd.eq.1 .and. abs(nq65df-mousedf).lt.ntol) then - write(line,1020) ikhz1,ndf,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0 -1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3) - write(*,1100) trim(line) -1100 format(a) - endif - -! Write to lu 26, for Messages and Band Map windows - cmode=': ' - cmode(2:2)=char(ichar('A') + mode_q65-1) freq1=freq0 + 0.001d0*(ikhz1-ikhz) - -! Suppress writing duplicates (same time, decoded message, and frequency) -! to map65_rx.log - if(nutc.ne.nutc00 .or. msg0(1:28).ne.msg00 .or. freq1.ne.freq1_00) then -! Write to file map65_rx.log: - ndecodes=ndecodes+1 - nutc00=nutc - msg00=msg0(1:28) - freq1_00=freq1 - frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal - fsked=frx - 0.001*ndop00/2.0 - 1.5 - write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) - write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) -1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) - result(ndecodes)=trim(result(ndecodes))//char(0) - endif + ndecodes=ndecodes+1 + frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal + fsked=frx - 0.001*ndop00/2.0 - 1.5 + write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) + write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) +1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) + result(ndecodes)=trim(result(ndecodes))//char(0) endif - -900 continue -! close(13) -! close(17) - call flush(6) - idec=-1 - read(cq0(2:2),*) idec + +900 call flush(6) return end subroutine q65b diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 176fc19d5..0aeaf9d5b 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -64,7 +64,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,ndop00,idec) + nagain,max_drift,ndop00) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand diff --git a/q65w/libq65/s3avg.f90 b/q65w/libq65/s3avg.f90 deleted file mode 100644 index 9d76637c4..000000000 --- a/q65w/libq65/s3avg.f90 +++ /dev/null @@ -1,60 +0,0 @@ -subroutine s3avg(nsave,mode65,nutc,nhz,xdt,npol,ntol,s3,nsum,nkv,decoded) - -! Save the current synchronized spectra, s3(64,63), for possible -! decoding of average. - - real s3(64,63) !Synchronized spectra for 63 symbols - real s3a(64,63,64) !Saved spectra - real s3b(64,63) !Average spectra - integer iutc(64),ihz(64),ipol(64) - real dt(64) - character*22 decoded - logical ltext,first - data first/.true./ - save - - if(first) then - iutc=-1 - ihz=0 - ipol=0 - first=.false. - ihzdiff=min(100,ntol) - dtdiff=0.2 - endif - - do i=1,64 - if(nutc.eq.iutc(i) .and. abs(nhz-ihz(i)).lt.ihzdiff) then - nsave=mod(nsave-1+64,64)+1 - go to 10 - endif - enddo - - iutc(nsave)=nutc !Save UTC - ihz(nsave)=nhz !Save freq in Hz - ipol(nsave)=npol !Save pol - dt(nsave)=xdt !Save DT - s3a(1:64,1:63,nsave)=s3 !Save the spectra - -10 s3b=0. - do i=1,64 !Accumulate avg spectra - if(iutc(i).lt.0) cycle - if(mod(iutc(i),2).ne.mod(nutc,2)) cycle !Use only same sequence - if(abs(nhz-ihz(i)).gt.ihzdiff) cycle !Freq must match - if(abs(xdt-dt(i)).gt.dtdiff) cycle !DT must match - s3b=s3b + s3a(1:64,1:63,i) - nsum=nsum+1 - enddo - - decoded=' ' - if(nsum.ge.2) then !Try decoding the sverage - nadd=mode65*nsum - call extract(s3b,nadd,ncount,nhist,decoded,ltext) !Extract the message - nkv=nsum - if(ncount.lt.0) then - nkv=0 - decoded=' ' - endif - endif - - return -end subroutine s3avg From b288b20289f5e9ed794ca04c5f2c9715e0be2b8a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 13 Dec 2022 20:42:01 -0500 Subject: [PATCH 118/251] WIP toward communication between Q65W and WSJT-X by means of shared memory. --- q65w/mainwindow.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index d85911c6d..a08ae3a1a 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -21,7 +21,7 @@ qint16 id[2*60*96000]; -//QSharedMemory mem_m65("mem_m65"); +QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with WSJT-X extern const int RxDataFrequency = 96000; @@ -101,6 +101,24 @@ MainWindow::MainWindow(QWidget *parent) : xSignalMeter = new SignalMeter(ui->xMeterFrame); xSignalMeter->resize(50, 160); +//### +//Attach or create a memory segment to be shared with WSJT-X. + int memSize=4096; + if(!mem_q65w.attach()) { + if(!mem_q65w.create(memSize)) { + msgBox("Unable to create shared memory segment."); + } + } + qDebug() << "aa" << memSize << mem_q65w.size(); + char *to = (char*)mem_q65w.data(); + int *to4 = (int*)mem_q65w.data(); + mem_q65w.lock(); +// memset(to,0,memSize); //Zero all of shared memory + memset(to,1,memSize); //Zero all of shared memory + qDebug() << "bb" << int(to[0]) << int(to[10]) << to4[0] << to4[1]; + mem_q65w.unlock(); +//### + fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); readSettings(); //Restore user's setup params From 439f17c12329c4ce36278bbfac8f0b6124e92566 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 09:21:01 -0500 Subject: [PATCH 119/251] Implement simple shared memory between WSJT-X and Q65W. --- q65w/mainwindow.cpp | 20 ++++++++------------ widgets/mainwindow.cpp | 21 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index a08ae3a1a..ddb5f1db9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -22,6 +22,7 @@ qint16 id[2*60*96000]; QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with WSJT-X +int* ipc_wsjtx; extern const int RxDataFrequency = 96000; @@ -101,23 +102,17 @@ MainWindow::MainWindow(QWidget *parent) : xSignalMeter = new SignalMeter(ui->xMeterFrame); xSignalMeter->resize(50, 160); -//### //Attach or create a memory segment to be shared with WSJT-X. int memSize=4096; if(!mem_q65w.attach()) { if(!mem_q65w.create(memSize)) { - msgBox("Unable to create shared memory segment."); + msgBox("Unable to create shared memory segment mem_q65w."); } } - qDebug() << "aa" << memSize << mem_q65w.size(); - char *to = (char*)mem_q65w.data(); - int *to4 = (int*)mem_q65w.data(); + ipc_wsjtx = (int*)mem_q65w.data(); mem_q65w.lock(); -// memset(to,0,memSize); //Zero all of shared memory - memset(to,1,memSize); //Zero all of shared memory - qDebug() << "bb" << int(to[0]) << int(to[10]) << to4[0] << to4[1]; + memset(ipc_wsjtx,0,memSize); //Zero all of shared memory mem_q65w.unlock(); -//### fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); @@ -965,9 +960,10 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << decodes_.ndecodes << decodes_.ncand; -// soundInThread.setForceCenterFreqMHz(m_wide_graph_window->m_dForceCenterFreq); -// soundInThread.setForceCenterFreqBool(m_wide_graph_window->m_bForceCenterFreq); +// mem_q65w.lock(); +// ipc_wsjtx[1]=nsec%60; +// qDebug() << "AAA" << nsec%60 << ipc_wsjtx[0] << ipc_wsjtx[1]; +// mem_q65w.unlock(); if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index cc29951a1..f563a0dac 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -212,6 +212,9 @@ bool m_displayBand = false; bool no_a7_decodes = false; bool keep_frequency = false; +QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with Q65W +int* ipc_q65w; + namespace { Radio::Frequency constexpr default_frequency {14076000}; @@ -453,6 +456,19 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_optimizingProgress.setAutoReset (false); m_optimizingProgress.setMinimumDuration (15000); // only show after 15s delay + //Attach or create a memory segment to be shared with Q65W. + int memSize=4096; + if(!mem_q65w.attach()) { + if(!mem_q65w.create(memSize)) { + MessageBox::information_message (this, + "Unable to create shared memory segment mem_q65w."); + } + } + ipc_q65w = (int*)mem_q65w.data(); + mem_q65w.lock(); + memset(ipc_q65w,0,memSize); //Zero all of shared memory + mem_q65w.unlock(); + // Closedown. connect (ui->actionExit, &QAction::triggered, this, &QMainWindow::close); @@ -4790,7 +4806,10 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { -// qDebug() << "AAA" << nsec << m_bFastMode << m_bFast9; +// mem_q65w.lock(); +// ipc_q65w[0]=nsec; +// qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1]; +// mem_q65w.unlock(); if(m_mode=="Q65") { QFileInfo fi(m_appDir+"/q65w_decodes.txt"); From a60edeb607b94c3298144f5ce053bf917c88adb8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 11:51:01 -0500 Subject: [PATCH 120/251] WIP toward sending decodes from Q65W to WSJT-X through shared memory. --- q65w/libq65/CMakeLists.txt | 6 +++--- q65w/libq65/ipcomm.cpp | 34 ---------------------------------- q65w/libq65/q65c.f90 | 6 ------ q65w/mainwindow.cpp | 7 +++++++ widgets/mainwindow.cpp | 19 +++++++++++++++---- widgets/mainwindow.h | 1 + 6 files changed, 26 insertions(+), 47 deletions(-) delete mode 100644 q65w/libq65/ipcomm.cpp diff --git a/q65w/libq65/CMakeLists.txt b/q65w/libq65/CMakeLists.txt index 015cd3253..e0ac18ede 100644 --- a/q65w/libq65/CMakeLists.txt +++ b/q65w/libq65/CMakeLists.txt @@ -33,9 +33,9 @@ set (libq65_FSRCS f77_wisdom.f ) -set (libq65_CXXSRCS - ipcomm.cpp - ) +#set (libq65_CXXSRCS +# ipcomm.cpp +# ) set (libq65_C_and_CXXSRCS ${libq65_CSRCS} diff --git a/q65w/libq65/ipcomm.cpp b/q65w/libq65/ipcomm.cpp deleted file mode 100644 index b40a09998..000000000 --- a/q65w/libq65/ipcomm.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -QSharedMemory mem_m65("mem_m65"); -QSystemSemaphore sem_m65("sem_m65", 1, QSystemSemaphore::Open); - -extern "C" { - bool attach_m65_(); - bool create_m65_(int nsize); - bool detach_m65_(); - bool lock_m65_(); - bool unlock_m65_(); - char* address_m65_(); - int size_m65_(); - - bool acquire_m65_(); - bool release_m65_(); - - extern struct { - char c[10]; - } m65com_; -} - -bool attach_m65_() {return mem_m65.attach();} -bool create_m65_(int nsize) {return mem_m65.create(nsize);} -bool detach_m65_() {return mem_m65.detach();} -bool lock_m65_() {return mem_m65.lock();} -bool unlock_m65_() {return mem_m65.unlock();} -char* address_m65_() {return (char*)mem_m65.constData();} -int size_m65_() {return (int)mem_m65.size();} - -bool acquire_m65_() {return sem_m65.acquire();} -bool release_m65_() {return sem_m65.release();} diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index 57667b32e..f2b9d89ab 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -24,8 +24,6 @@ subroutine q65c(itimer) mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & datetime,junk1,junk2 -!### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### - equivalence (nparams,fcenter) data first/.true./ save first @@ -38,10 +36,6 @@ subroutine q65c(itimer) endif datetime(18:20)=':00' - -! if(first) call timer('q65w ',0) -! first=.false. - npatience=1 call timer('decode0 ',0) call decode0(dd,ss,savg) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index ddb5f1db9..249cdaf7f 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -957,6 +957,13 @@ void MainWindow::guiUpdate() ui->decodedTextBrowser->append(t.trimmed()); m_fetched++; } + mem_q65w.lock(); + +// char *from = (char*) decodes_.ndecodes; +// char *from = (char*) &decodes_; + memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); + + mem_q65w.unlock(); } if(nsec != m_sec0) { //Once per second diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f563a0dac..784713eb8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -191,7 +191,6 @@ int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols int volatile itone0[MAX_NUM_SYMBOLS]; //Dummy array, data not actually used int volatile icw[NUM_CW_SYMBOLS]; //Dits for CW ID dec_data_t dec_data; // for sharing with Fortran - int outBufSize; int rc; qint32 g_iptt {0}; @@ -213,6 +212,11 @@ bool no_a7_decodes = false; bool keep_frequency = false; QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with Q65W +struct { + int ndecodes; + int ncand; + char result[50][60]; +} q65wcom; int* ipc_q65w; namespace @@ -3404,6 +3408,7 @@ void MainWindow::decode() //decode() narg[13]=-1; narg[14]=m_config.aggressive(); memcpy(d2b,dec_data.d2,2*360000); + m_fetched=0; 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))); @@ -4806,12 +4811,18 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { -// mem_q65w.lock(); -// ipc_q65w[0]=nsec; // qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1]; -// mem_q65w.unlock(); if(m_mode=="Q65") { + + mem_q65w.lock(); + memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); + qDebug() << "AAA" << nsec << q65wcom.ndecodes << q65wcom.ncand << m_fetched; + QString t0=QString::fromLatin1(q65wcom.result[0]); + QString t1=QString::fromLatin1(q65wcom.result[1]); + qDebug() << "BBB" << t0 << "\n" << t1; + mem_q65w.unlock(); + QFileInfo fi(m_appDir+"/q65w_decodes.txt"); QDateTime fileTime=fi.lastModified(); QDateTime now = QDateTime::currentDateTimeUtc (); diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 821e5f496..e0bf019f7 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -509,6 +509,7 @@ private: qint32 m_score=0; qint32 m_fDop=0; qint32 m_echoSec0=0; + qint32 m_fetched=0; bool m_btxok; //True if OK to transmit bool m_diskData; From 31524396d22264cb807fd74c7252bbbda2c12ea3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 13:26:24 -0500 Subject: [PATCH 121/251] Further WIP toward communication between WSJT-X and Q65W. --- q65w/mainwindow.cpp | 4 --- widgets/mainwindow.cpp | 57 +++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 249cdaf7f..8e58166b9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -958,11 +958,7 @@ void MainWindow::guiUpdate() m_fetched++; } mem_q65w.lock(); - -// char *from = (char*) decodes_.ndecodes; -// char *from = (char*) &decodes_; memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); - mem_q65w.unlock(); } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 784713eb8..8e059304a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4817,17 +4817,22 @@ void MainWindow::guiUpdate() mem_q65w.lock(); memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); - qDebug() << "AAA" << nsec << q65wcom.ndecodes << q65wcom.ncand << m_fetched; - QString t0=QString::fromLatin1(q65wcom.result[0]); - QString t1=QString::fromLatin1(q65wcom.result[1]); - qDebug() << "BBB" << t0 << "\n" << t1; +// qDebug() << "AAA" << nsec << q65wcom.ndecodes << q65wcom.ncand << m_fetched; +// QString t0=QString::fromLatin1(q65wcom.result[0]); +// QString t1=QString::fromLatin1(q65wcom.result[1]); +// qDebug() << "BBB" << t0 << "\n" << t1; mem_q65w.unlock(); + if(q65wcom.ndecodes>m_fetched) { + readWidebandDecodes(); + } + /* QFileInfo fi(m_appDir+"/q65w_decodes.txt"); QDateTime fileTime=fi.lastModified(); QDateTime now = QDateTime::currentDateTimeUtc (); int age=fileTime.msecsTo(now)/1000; if(age==1) readWidebandDecodes(); + */ } if(m_mode=="FST4") chk_FST4_freq_range(); @@ -9210,32 +9215,28 @@ void MainWindow::write_transmit_entry (QString const& file_name) void MainWindow::readWidebandDecodes() { if(m_ActiveStationsWidget==NULL) return; -// Update "m_wEMECall" by reading q65w_decodes.txt + int nhr=0; int nmin=0; - QFile f(m_appDir+"/q65w_decodes.txt"); - f.open(QIODevice::ReadOnly); - if(f.isOpen()) { - QTextStream in(&f); - QString line,callsign; - for(int i=0; i<99999; i++) { - line=in.readLine(); - if(line.length()<=0) break; - nhr=line.mid(0,2).toInt(); - nmin=line.mid(2,2).toInt(); - double fsked=line.mid(4,9).toDouble(); - QString msg=line.mid(27,-1); - int i1=msg.indexOf(" "); - int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); - QString dxcall=msg.mid(i1+1,i2-i1-1); - QString w3=msg.mid(i2+1,-1); - m_EMECall[dxcall].fsked=fsked; - m_EMECall[dxcall].t=60*nhr + nmin; - m_EMECall[dxcall].worked=false; //### TEMPORARY ### - if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; - } - f.close(); + while(m_fetched < q65wcom.ndecodes) { + QString line=QString::fromLatin1(q65wcom.result[m_fetched]); + nhr=line.mid(0,2).toInt(); + nmin=line.mid(2,2).toInt(); + double fsked=line.mid(4,9).toDouble(); + QString msg=line.mid(27,-1); + int i1=msg.indexOf(" "); + int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); + QString dxcall=msg.mid(i1+1,i2-i1-1); + QString w3=msg.mid(i2+1,-1); + m_EMECall[dxcall].fsked=fsked; + m_EMECall[dxcall].t=60*nhr + nmin; + m_EMECall[dxcall].worked=false; //### TEMPORARY ### + if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; + qDebug() << "aa" << q65wcom.ndecodes << m_fetched << line; + m_fetched++; + } +// Update "m_wEMECall" by reading q65w_decodes.txt QMap::iterator i; QString t=""; QString t1; @@ -9282,7 +9283,7 @@ void MainWindow::readWidebandDecodes() m_ActiveStationsWidget->erase(); m_ActiveStationsWidget->displayRecentStations(m_mode,t); } - } + } // -------------------------- Code for FT8 DXpedition Mode --------------------------- From 90c1598f1e6d3809e32c5ba06544bf513bf5ac91 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 14:28:55 -0500 Subject: [PATCH 122/251] More WIP on interprocess communication. --- widgets/mainwindow.cpp | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8e059304a..a3a48c03d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -215,6 +215,9 @@ QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optio struct { int ndecodes; int ncand; +// int nDecoderDone; +// int nDecoderBusy; +// int nTransmitting; char result[50][60]; } q65wcom; int* ipc_q65w; @@ -4809,32 +4812,19 @@ void MainWindow::guiUpdate() } if(m_mode=="Echo" and !m_monitoring and !m_auto and !m_diskData) m_echoRunning=false; + mem_q65w.lock(); + if(m_mode=="Q65" and (ipc_q65w[0] > m_fetched)) { //ndecodes + memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); + mem_q65w.unlock(); + readWidebandDecodes(); + } else { + mem_q65w.unlock(); + } + //Once per second (onesec) if(nsec != m_sec0) { // qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1]; - if(m_mode=="Q65") { - - mem_q65w.lock(); - memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); -// qDebug() << "AAA" << nsec << q65wcom.ndecodes << q65wcom.ncand << m_fetched; -// QString t0=QString::fromLatin1(q65wcom.result[0]); -// QString t1=QString::fromLatin1(q65wcom.result[1]); -// qDebug() << "BBB" << t0 << "\n" << t1; - mem_q65w.unlock(); - if(q65wcom.ndecodes>m_fetched) { - readWidebandDecodes(); - } - - /* - QFileInfo fi(m_appDir+"/q65w_decodes.txt"); - QDateTime fileTime=fi.lastModified(); - QDateTime now = QDateTime::currentDateTimeUtc (); - int age=fileTime.msecsTo(now)/1000; - if(age==1) readWidebandDecodes(); - */ - } - if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); if( SpecOp::HOUND == m_specOp ) { From ca9406664ecd41c9b0a0d70b9dcb42db0123c4ed Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 16:52:06 -0500 Subject: [PATCH 123/251] More ipc variables. --- q65w/libq65/decode0.f90 | 5 +++-- q65w/libq65/ftninit.f90 | 1 - q65w/libq65/q65b.f90 | 4 ++-- q65w/libq65/q65wa.f90 | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 2a1beb97b..ffb330f90 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -9,7 +9,8 @@ subroutine decode0(dd,ss,savg) character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 character mycall0*12,hiscall0*12,hisgrid0*6 character*60 result - common/decodes/ndecodes,ncand,result(50) + common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & + nWTransmitting,result(50) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & @@ -17,7 +18,7 @@ subroutine decode0(dd,ss,savg) data neme0/-99/ save - call sec0(0,tquick) + nQDecoderDone=0 if(newdat.ne.0) then nz=96000*nhsym/5.3833 hist=0 diff --git a/q65w/libq65/ftninit.f90 b/q65w/libq65/ftninit.f90 index c55249866..565398565 100644 --- a/q65w/libq65/ftninit.f90 +++ b/q65w/libq65/ftninit.f90 @@ -15,7 +15,6 @@ subroutine ftninit appd='.' addpfx=' ' - open(12,file=appd//'/q65w_decodes.txt',status='unknown') open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') open(71,file=appd//'/debug.tmp',status='unknown') diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index ecc1ee41e..4dd038de0 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -26,7 +26,8 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & character*6 hisgrid character*4 grid4 character*60 result - common/decodes/ndecodes,ncand,result(50) + common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & + nWTransmitting,result(50) common/cacb/ca save @@ -126,7 +127,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal fsked=frx - 0.001*ndop00/2.0 - 1.5 write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) - write(12,1120) nutc,fsked,xdt0,nsnr0,trim(msg0) 1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) result(ndecodes)=trim(result(ndecodes))//char(0) endif diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 0aeaf9d5b..479e1294a 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -18,7 +18,8 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & logical candec(MAX_CANDIDATES) type(candidate) :: cand(MAX_CANDIDATES) character*60 result - common/decodes/ndecodes,ncand,result(50) + common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & + nWTransmitting,result(50) common/testcom/ifreq save @@ -68,9 +69,8 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand - call sec0(1,tsec0) ndecdone=2 - call flush(12) + nQDecoderDone=1 return end subroutine q65wa From cbad491438b35c10f8584c3110c183d22bccd1ca Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 16:54:37 -0500 Subject: [PATCH 124/251] WIP on IPC. --- widgets/activeStations.cpp | 4 ++ widgets/mainwindow.cpp | 98 +++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 3c429b83d..cee4b8078 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -94,6 +94,10 @@ void ActiveStations::select() if((msec-m_msec0)<500) return; m_msec0=msec; int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber(); + + qDebug() << "aa" << nline << ui->RecentStationsPlainTextEdit->textCursor().position(); + + if(nline!=-99) return; //TEMPORARY emit callSandP(nline); } } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a3a48c03d..00a9600b3 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -213,12 +213,12 @@ bool keep_frequency = false; QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with Q65W struct { - int ndecodes; - int ncand; -// int nDecoderDone; -// int nDecoderBusy; -// int nTransmitting; - char result[50][60]; + int ndecodes; //Number of Q65W decodes available (so far) + int ncand; //Number of Q65W candidates considered for decoding + int nQDecoderDone; //Q65W decoder is finished (0 or 1) + int nWDecoderBusy; //WSJT-X decoder is busy (0 or 1) + int nWTransmitting; //WSJT-X is transmitting (0 or 1) + char result[50][60]; //Decodes as character*60 arrays } q65wcom; int* ipc_q65w; @@ -3687,6 +3687,7 @@ void MainWindow::callSandP2(int n) m_deGrid=""; m_txFirst=(w[i0+1]=="0"); ui->TxFreqSpinBox->setValue(1500); + qDebug() << "bb" << n << w; } else { m_deCall=w[0]; m_deGrid=w[1]; @@ -9222,58 +9223,59 @@ void MainWindow::readWidebandDecodes() m_EMECall[dxcall].t=60*nhr + nmin; m_EMECall[dxcall].worked=false; //### TEMPORARY ### if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; - qDebug() << "aa" << q65wcom.ndecodes << m_fetched << line; m_fetched++; +// qDebug() << "aa" << q65wcom.ndecodes << m_fetched << q65wcom.nQDecoderDone << line; } // Update "m_wEMECall" by reading q65w_decodes.txt - QMap::iterator i; - QString t=""; - QString t1; - QString dxcall; - QStringList list; - float f[100]; - int indx[100]; - int maxAge=m_ActiveStationsWidget->maxAge(); + QMap::iterator i; + QString t=""; + QString t1; + QString dxcall; + QStringList list; + float f[100]; + int indx[100]; + int maxAge=m_ActiveStationsWidget->maxAge(); - m_ActiveStationsWidget->setClickOK(false); - int k=0; - for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { - int odd=1 - (i->t)%2; - int age=60*nhr + nmin - (i->t); - if(age<0) age += 1440; - if(age<=maxAge) { - dxcall=(i.key()+" ").left(8); - if(i->worked) { - t1=t1.asprintf("%5.1f %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); - } else { - t1=t1.asprintf("%5.1f * %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); - } - f[k]=i->fsked; - list.append(t1); - k++; + m_ActiveStationsWidget->setClickOK(false); + int k=0; + for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { + int odd=1 - (i->t)%2; + int age=60*nhr + nmin - (i->t); + if(age<0) age += 1440; + if(age<=maxAge) { + dxcall=(i.key()+" ").left(8); + if(i->worked) { + t1=t1.asprintf("%5.1f %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); + } else { + t1=t1.asprintf("%5.1f * %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); } - m_ActiveStationsWidget->setClickOK(true); + f[k]=i->fsked; + list.append(t1); + k++; } + m_ActiveStationsWidget->setClickOK(true); + } - if(k>0) { - t1=""; - int kz=k; - indexx_(f,&kz,indx); - for(int k=0; kerase(); - m_ActiveStationsWidget->displayRecentStations(m_mode,t); + if(k>0) { + t1=""; + int kz=k; + indexx_(f,&kz,indx); + for(int k=0; kerase(); + m_ActiveStationsWidget->displayRecentStations(m_mode,t); + m_ActiveStationsWidget->setClickOK(true); + } + if(q65wcom.nQDecoderDone==1) m_fetched=0; } // -------------------------- Code for FT8 DXpedition Mode --------------------------- From 6f59ddeab196932e599601e00ddc89c19253f12f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 14 Dec 2022 21:32:09 -0500 Subject: [PATCH 125/251] WIP on IPC. Clicking on Active Stations window works in FT8, fails in Q65. --- widgets/activeStations.cpp | 8 +++++++- widgets/mainwindow.cpp | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index cee4b8078..2e047b4c2 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -75,6 +75,11 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->score->setVisible(!b); ui->sbMaxRecent->setVisible(!b); ui->RecentStationsPlainTextEdit->setPlainText(t); + + QString t1= " 1. R7BI KN96 41 -12 764 0 0 18\n 2. LA6OP JP67 29 +07 696 0 0* 13\n 3. G0OUC IO93 49 -20 1628 0 0 13\n 4. G5EA IO93 49 -13 1747 0 0 13\n 5. G7BHU IO93 49 -17 1191 0 0 13\n 6. ON4EB JO11 50 -01 2188 0 0 13\n 7. K2AK DM41 264 +03 1432 0 0 8\n 8. N2DEE DM79 277 -01 1297 0 0 7\n 9. AK0MR DM59 279 +07 2478 0 0 7\n10. NK5G EM20 245 -07 2149 0 0 6\n"; //TEMP + ui->RecentStationsPlainTextEdit->setPlainText(t1); + + } int ActiveStations::maxRecent() @@ -96,8 +101,9 @@ void ActiveStations::select() int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber(); qDebug() << "aa" << nline << ui->RecentStationsPlainTextEdit->textCursor().position(); + qDebug() << "bb" << ui->RecentStationsPlainTextEdit->toPlainText(); - if(nline!=-99) return; //TEMPORARY +// if(nline!=-99) return; //TEMPORARY emit callSandP(nline); } } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 00a9600b3..91879a4b8 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3423,8 +3423,8 @@ void MainWindow::decode() //decode() decodeBusy(true); } } - if((m_mode=="FT4" or (m_mode=="FT8" and m_ihsym==41) or m_diskData) and - m_ActiveStationsWidget != NULL) m_ActiveStationsWidget->erase(); + if((m_mode=="FT4" or (m_mode=="FT8" and m_ihsym==41) or m_diskData or m_mode=="Q65") and + m_ActiveStationsWidget != NULL) m_ActiveStationsWidget->erase(); //TEMP } void::MainWindow::fast_decode_done() @@ -3687,7 +3687,7 @@ void MainWindow::callSandP2(int n) m_deGrid=""; m_txFirst=(w[i0+1]=="0"); ui->TxFreqSpinBox->setValue(1500); - qDebug() << "bb" << n << w; +// qDebug() << "cc" << n << w; } else { m_deCall=w[0]; m_deGrid=w[1]; From 1773a70d795bf12e95a5679ad27a0e5fcbcbf87d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 15 Dec 2022 09:15:35 -0500 Subject: [PATCH 126/251] WIP: Still trying to get mouse-click to yield line number. --- widgets/activeStations.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 2e047b4c2..055b347b0 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -76,8 +76,8 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->sbMaxRecent->setVisible(!b); ui->RecentStationsPlainTextEdit->setPlainText(t); - QString t1= " 1. R7BI KN96 41 -12 764 0 0 18\n 2. LA6OP JP67 29 +07 696 0 0* 13\n 3. G0OUC IO93 49 -20 1628 0 0 13\n 4. G5EA IO93 49 -13 1747 0 0 13\n 5. G7BHU IO93 49 -17 1191 0 0 13\n 6. ON4EB JO11 50 -01 2188 0 0 13\n 7. K2AK DM41 264 +03 1432 0 0 8\n 8. N2DEE DM79 277 -01 1297 0 0 7\n 9. AK0MR DM59 279 +07 2478 0 0 7\n10. NK5G EM20 245 -07 2149 0 0 6\n"; //TEMP - ui->RecentStationsPlainTextEdit->setPlainText(t1); +// QString t1= " 1. R7BI KN96 41 -12 764 0 0 18\n 2. LA6OP JP67 29 +07 696 0 0* 13\n 3. G0OUC IO93 49 -20 1628 0 0 13\n 4. G5EA IO93 49 -13 1747 0 0 13\n 5. G7BHU IO93 49 -17 1191 0 0 13\n 6. ON4EB JO11 50 -01 2188 0 0 13\n 7. K2AK DM41 264 +03 1432 0 0 8\n 8. N2DEE DM79 277 -01 1297 0 0 7\n 9. AK0MR DM59 279 +07 2478 0 0 7\n10. NK5G EM20 245 -07 2149 0 0 6\n"; //TEMP +// ui->RecentStationsPlainTextEdit->setPlainText(t1); } @@ -101,7 +101,7 @@ void ActiveStations::select() int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber(); qDebug() << "aa" << nline << ui->RecentStationsPlainTextEdit->textCursor().position(); - qDebug() << "bb" << ui->RecentStationsPlainTextEdit->toPlainText(); +// qDebug() << "bb" << ui->RecentStationsPlainTextEdit->toPlainText(); // if(nline!=-99) return; //TEMPORARY emit callSandP(nline); From 469caa7d0c63dd245c96bd84495eca1783242d05 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 15 Dec 2022 12:14:06 -0500 Subject: [PATCH 127/251] Finally(!) selecting an Active Station is now working for both FT8 and Q65. --- widgets/activeStations.cpp | 28 +++++++++++++++------------- widgets/activeStations.h | 4 +++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 055b347b0..9c41e7073 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -23,8 +23,8 @@ ActiveStations::ActiveStations(QSettings * settings, QFont const& font, QWidget changeFont (font); read_settings (); ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); - connect(ui->RecentStationsPlainTextEdit, SIGNAL(selectionChanged()), this, SLOT(select())); connect(ui->cbReadyOnly, SIGNAL(toggled(bool)), this, SLOT(on_cbReadyOnly_toggled(bool))); + connect(ui->RecentStationsPlainTextEdit, SIGNAL(cursorPositionChanged()), this, SLOT(on_textEdit_clicked())); } ActiveStations::~ActiveStations() @@ -74,7 +74,8 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->label_3->setVisible(!b); ui->score->setVisible(!b); ui->sbMaxRecent->setVisible(!b); - ui->RecentStationsPlainTextEdit->setPlainText(t); +// ui->RecentStationsPlainTextEdit->setPlainText(t); + ui->RecentStationsPlainTextEdit->insertPlainText(t); // QString t1= " 1. R7BI KN96 41 -12 764 0 0 18\n 2. LA6OP JP67 29 +07 696 0 0* 13\n 3. G0OUC IO93 49 -20 1628 0 0 13\n 4. G5EA IO93 49 -13 1747 0 0 13\n 5. G7BHU IO93 49 -17 1191 0 0 13\n 6. ON4EB JO11 50 -01 2188 0 0 13\n 7. K2AK DM41 264 +03 1432 0 0 8\n 8. N2DEE DM79 277 -01 1297 0 0 7\n 9. AK0MR DM59 279 +07 2478 0 0 7\n10. NK5G EM20 245 -07 2149 0 0 6\n"; //TEMP // ui->RecentStationsPlainTextEdit->setPlainText(t1); @@ -92,19 +93,20 @@ int ActiveStations::maxAge() return ui->sbMaxAge->value(); } -void ActiveStations::select() +void ActiveStations::on_textEdit_clicked() { if(m_clickOK) { - qint64 msec=QDateTime::currentMSecsSinceEpoch(); - if((msec-m_msec0)<500) return; - m_msec0=msec; - int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber(); - - qDebug() << "aa" << nline << ui->RecentStationsPlainTextEdit->textCursor().position(); -// qDebug() << "bb" << ui->RecentStationsPlainTextEdit->toPlainText(); - -// if(nline!=-99) return; //TEMPORARY - emit callSandP(nline); + QTextCursor cursor; + QString text; + cursor = ui->RecentStationsPlainTextEdit->textCursor(); + cursor.movePosition(QTextCursor::StartOfBlock); + cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); + text = cursor.selectedText(); + if(text!="") { + int nline=text.left(2).toInt()-1; + qDebug() << "aa" << text << nline; + emit callSandP(nline); + } } } diff --git a/widgets/activeStations.h b/widgets/activeStations.h index 324908434..207668ddd 100644 --- a/widgets/activeStations.h +++ b/widgets/activeStations.h @@ -29,7 +29,6 @@ public: void setRate(int n); void setBandChanges(int n); void setScore(int n); - Q_SLOT void select(); bool m_clickOK=false; bool m_bReadyOnly; @@ -38,6 +37,9 @@ signals: void callSandP(int nline); void activeStationsDisplay(); +private slots: + void on_textEdit_clicked(); + private: void read_settings (); void write_settings (); From 58964d1f87a062329c360bd0fd76802fc9113355 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 15 Dec 2022 12:15:36 -0500 Subject: [PATCH 128/251] Remove a diagnostic write. --- widgets/activeStations.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 9c41e7073..433eb9cd3 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -104,7 +104,7 @@ void ActiveStations::on_textEdit_clicked() text = cursor.selectedText(); if(text!="") { int nline=text.left(2).toInt()-1; - qDebug() << "aa" << text << nline; +// qDebug() << "aa" << text << nline; emit callSandP(nline); } } From e4dd4b98a8ebd83716f78bd51ef4c236b0016ff6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 15 Dec 2022 13:59:59 -0500 Subject: [PATCH 129/251] Improved display of workable Q65 stations in Active Stations window. --- q65w/mainwindow.cpp | 3 --- widgets/activeStations.cpp | 9 +-------- widgets/mainwindow.cpp | 39 +++++++++++++++++++++++--------------- widgets/mainwindow.h | 1 + 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 8e58166b9..2c57f0ce7 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -963,10 +963,7 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// mem_q65w.lock(); -// ipc_wsjtx[1]=nsec%60; // qDebug() << "AAA" << nsec%60 << ipc_wsjtx[0] << ipc_wsjtx[1]; -// mem_q65w.unlock(); if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 433eb9cd3..39dbda71e 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -62,7 +62,7 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) m_mode=mode; bool b=(m_mode=="Q65"); if(b) { - ui->header_label2->setText(" N Freq Call Tx Age"); + ui->header_label2->setText(" N Freq S/N Call Grid Tx Age"); ui->label->setText("QSOs:"); } else { ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); @@ -74,13 +74,7 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->label_3->setVisible(!b); ui->score->setVisible(!b); ui->sbMaxRecent->setVisible(!b); -// ui->RecentStationsPlainTextEdit->setPlainText(t); ui->RecentStationsPlainTextEdit->insertPlainText(t); - -// QString t1= " 1. R7BI KN96 41 -12 764 0 0 18\n 2. LA6OP JP67 29 +07 696 0 0* 13\n 3. G0OUC IO93 49 -20 1628 0 0 13\n 4. G5EA IO93 49 -13 1747 0 0 13\n 5. G7BHU IO93 49 -17 1191 0 0 13\n 6. ON4EB JO11 50 -01 2188 0 0 13\n 7. K2AK DM41 264 +03 1432 0 0 8\n 8. N2DEE DM79 277 -01 1297 0 0 7\n 9. AK0MR DM59 279 +07 2478 0 0 7\n10. NK5G EM20 245 -07 2149 0 0 6\n"; //TEMP -// ui->RecentStationsPlainTextEdit->setPlainText(t1); - - } int ActiveStations::maxRecent() @@ -104,7 +98,6 @@ void ActiveStations::on_textEdit_clicked() text = cursor.selectedText(); if(text!="") { int nline=text.left(2).toInt()-1; -// qDebug() << "aa" << text << nline; emit callSandP(nline); } } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 91879a4b8..45cbaee7d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3676,18 +3676,16 @@ void MainWindow::ARRL_Digi_Display() void MainWindow::callSandP2(int n) { - if(m_ready2call[n]=="") return; + if(m_mode!="Q65" and m_ready2call[n]=="") return; QStringList w=m_ready2call[n].split(' ', SkipEmptyParts); if(m_mode=="Q65") { - int nkhz=int(w[0].toFloat()+0.5); - m_freqNominal=(1296*1000 + nkhz)* 1000; - int i0=1; - if(w[1]=="*") i0=2; - m_deCall=w[i0]; - m_deGrid=""; - m_txFirst=(w[i0+1]=="0"); - ui->TxFreqSpinBox->setValue(1500); -// qDebug() << "cc" << n << w; + double kHz=w[0].toDouble(); + m_freqNominal=(1296*1000 + kHz)* 1000; + m_deCall=w[2]; + m_deGrid=w[3]; + m_txFirst=(w[4]=="0"); +// ui->TxFreqSpinBox->setValue(1500); +// qDebug() << "aa" << n << w; } else { m_deCall=w[0]; m_deGrid=w[1]; @@ -3697,7 +3695,11 @@ void MainWindow::callSandP2(int n) m_bDoubleClicked=true; //### needed? ui->dxCallEntry->setText(m_deCall); ui->dxGridEntry->setText(m_deGrid); - genStdMsgs(w[3]); //### real SNR would be better here? + if(m_mode=="Q65") { + genStdMsgs(w[1]); + } else { + genStdMsgs(w[3]); + } setTxMsg(1); ui->txFirstCheckBox->setChecked(m_txFirst); if (!ui->autoButton->isChecked()) ui->autoButton->click(); // Enable Tx @@ -9209,6 +9211,7 @@ void MainWindow::readWidebandDecodes() int nhr=0; int nmin=0; + int nsnr=0; while(m_fetched < q65wcom.ndecodes) { QString line=QString::fromLatin1(q65wcom.result[m_fetched]); nhr=line.mid(0,2).toInt(); @@ -9219,12 +9222,13 @@ void MainWindow::readWidebandDecodes() int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); QString dxcall=msg.mid(i1+1,i2-i1-1); QString w3=msg.mid(i2+1,-1); + nsnr=line.mid(22,3).toInt(); m_EMECall[dxcall].fsked=fsked; + m_EMECall[dxcall].nsnr=nsnr; m_EMECall[dxcall].t=60*nhr + nmin; m_EMECall[dxcall].worked=false; //### TEMPORARY ### if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; m_fetched++; -// qDebug() << "aa" << q65wcom.ndecodes << m_fetched << q65wcom.nQDecoderDone << line; } // Update "m_wEMECall" by reading q65w_decodes.txt @@ -9232,6 +9236,7 @@ void MainWindow::readWidebandDecodes() QString t=""; QString t1; QString dxcall; + QString dxgrid4; QStringList list; float f[100]; int indx[100]; @@ -9240,15 +9245,19 @@ void MainWindow::readWidebandDecodes() m_ActiveStationsWidget->setClickOK(false); int k=0; for(i=m_EMECall.begin(); i!=m_EMECall.end(); i++) { + int snr=i->nsnr; int odd=1 - (i->t)%2; int age=60*nhr + nmin - (i->t); if(age<0) age += 1440; if(age<=maxAge) { dxcall=(i.key()+" ").left(8); + dxgrid4=(i->grid4+"... ").left(4); if(i->worked) { - t1=t1.asprintf("%5.1f %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); + t1=t1.asprintf("%5.1f %+03d %8s %4s %3d %3d\n",i->fsked,snr,dxcall.toLatin1().constData(), + dxgrid4.toLatin1().constData(),odd,age); } else { - t1=t1.asprintf("%5.1f * %8s %3d %3d\n",i->fsked,dxcall.toLatin1().constData(),odd,age); + t1=t1.asprintf("%5.1f %+03d %8s %4s %3d %3d*\n",i->fsked,snr,dxcall.toLatin1().constData(), + dxgrid4.toLatin1().constData(),odd,age); } f[k]=i->fsked; list.append(t1); @@ -9263,7 +9272,7 @@ void MainWindow::readWidebandDecodes() indexx_(f,&kz,indx); for(int k=0; k Date: Thu, 15 Dec 2022 15:26:48 -0500 Subject: [PATCH 130/251] Q65W waterfall should not scroll if WSJT-X is transmitting. --- q65w/commons.h | 2 ++ q65w/mainwindow.cpp | 7 ++++--- widgets/mainwindow.cpp | 22 ++++++++++++++-------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index e145c2693..405d44fd9 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -86,6 +86,8 @@ extern struct { //This is "common/datcom/..." in Fortran extern struct { int ndecodes; int ncand; + int nQDecoderBusy; + int nWTransmitting; char result[50][60]; } decodes_; diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2c57f0ce7..46885a83e 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -382,8 +382,9 @@ void MainWindow::dataSink(int k) ); xSignalMeter->setValue(px); // Update the signal meters - if(m_monitoring || m_diskData) { - m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); + //Suppress scrolling if WSJT-X is transmitting + if((m_monitoring and ipc_wsjtx[4] != 1) or m_diskData) { + m_wide_graph_window->dataSink2(s,nkhz,ihsym,m_diskData,lstrong); } //Average over specified number of spectra @@ -963,7 +964,7 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << ipc_wsjtx[0] << ipc_wsjtx[1]; +// qDebug() << "AAA" << nsec%60 << ipc_wsjtx[3] << ipc_wsjtx[4]<< m_monitoring; if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 45cbaee7d..8706c0f60 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -473,7 +473,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, } ipc_q65w = (int*)mem_q65w.data(); mem_q65w.lock(); - memset(ipc_q65w,0,memSize); //Zero all of shared memory + memset(ipc_q65w,0,memSize); //Zero all of Q65W shared memory mem_q65w.unlock(); // Closedown. @@ -1134,6 +1134,7 @@ MainWindow::~MainWindow() m_audioThread.quit (); m_audioThread.wait (); remove_child_from_event_filter (this); + memset(ipc_q65w,0,4096); //Zero all of Q65W shared memory } //-------------------------------------------------------- writeSettings() @@ -3685,7 +3686,6 @@ void MainWindow::callSandP2(int n) m_deGrid=w[3]; m_txFirst=(w[4]=="0"); // ui->TxFreqSpinBox->setValue(1500); -// qDebug() << "aa" << n << w; } else { m_deCall=w[0]; m_deGrid=w[1]; @@ -4815,12 +4815,18 @@ void MainWindow::guiUpdate() } if(m_mode=="Echo" and !m_monitoring and !m_auto and !m_diskData) m_echoRunning=false; - mem_q65w.lock(); - if(m_mode=="Q65" and (ipc_q65w[0] > m_fetched)) { //ndecodes - memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); - mem_q65w.unlock(); - readWidebandDecodes(); - } else { + if(m_mode=="Q65") { + mem_q65w.lock(); + int n=0; + if(m_decoderBusy) n=1; + ipc_q65w[3]=n; + n=0; + if(m_transmitting) n=1; + ipc_q65w[4]=n; + if(ipc_q65w[0] > m_fetched) { //ndecodes + memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); + readWidebandDecodes(); + } mem_q65w.unlock(); } From 2fcf6c45fe82b9ece9745ff6d5141a1170295d19 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 16 Dec 2022 13:06:44 -0500 Subject: [PATCH 131/251] Fix a flaw that prevented Q65W decodes from being displayed in its main window. --- q65w/commons.h | 3 ++- q65w/libq65/decode0.f90 | 1 - q65w/libq65/q65wa.f90 | 1 - q65w/mainwindow.cpp | 7 +++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index 405d44fd9..c5244be57 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -86,7 +86,8 @@ extern struct { //This is "common/datcom/..." in Fortran extern struct { int ndecodes; int ncand; - int nQDecoderBusy; + int nQDecoderDone; + int nWDecoderBusy; int nWTransmitting; char result[50][60]; } decodes_; diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index ffb330f90..772b3bb4a 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -46,7 +46,6 @@ subroutine decode0(dd,ss,savg) mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndop00) call timer('q65wa ',1) - flush(6) return end subroutine decode0 diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 479e1294a..1bd8bcb65 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -70,7 +70,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & if(idec.ge.0) candec(icand)=.true. enddo ! icand ndecdone=2 - nQDecoderDone=1 return end subroutine q65wa diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 46885a83e..e9492b304 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -743,7 +743,7 @@ void MainWindow::decoderFinished() //diskWriteFinished m_startAnother=m_loopall; ui->DecodeButton->setStyleSheet(""); decodeBusy(false); - + decodes_.nQDecoderDone=1; QString t1; t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); lab5->setText(t1); @@ -908,6 +908,7 @@ void MainWindow::decode() //decode() decodes_.ndecodes=0; decodes_.ncand=0; + decodes_.nQDecoderDone=0; m_fetched=0; int itimer=0; watcher3.setFuture(QtConcurrent::run (std::bind (q65c_, &itimer))); @@ -952,9 +953,10 @@ void MainWindow::guiUpdate() on_actionOpen_next_in_directory_triggered(); } - if(decodes_.ndecodes>m_fetched) { + if(decodes_.ndecodes > m_fetched) { while(m_fetcheddecodedTextBrowser->append(t.trimmed()); m_fetched++; } @@ -965,6 +967,7 @@ void MainWindow::guiUpdate() if(nsec != m_sec0) { //Once per second // qDebug() << "AAA" << nsec%60 << ipc_wsjtx[3] << ipc_wsjtx[4]<< m_monitoring; +// qDebug() << "BBB" << nsec%60 << decodes_.ndecodes << m_fetched; if(m_pctZap>30.0) { lab4->setStyleSheet("QLabel{background-color: #ff0000}"); From 042ff589fb8d83a3e7781a24dd173635f294498a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 16 Dec 2022 14:01:22 -0500 Subject: [PATCH 132/251] Another fix for communication between Q65W and WSJT-X. --- q65w/mainwindow.cpp | 6 +++--- widgets/mainwindow.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index e9492b304..b0dbcb46f 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -744,6 +744,9 @@ void MainWindow::decoderFinished() //diskWriteFinished ui->DecodeButton->setStyleSheet(""); decodeBusy(false); decodes_.nQDecoderDone=1; + mem_q65w.lock(); + memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); + mem_q65w.unlock(); QString t1; t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); lab5->setText(t1); @@ -960,9 +963,6 @@ void MainWindow::guiUpdate() ui->decodedTextBrowser->append(t.trimmed()); m_fetched++; } - mem_q65w.lock(); - memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); - mem_q65w.unlock(); } if(nsec != m_sec0) { //Once per second diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8706c0f60..d748f8931 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4824,7 +4824,7 @@ void MainWindow::guiUpdate() if(m_transmitting) n=1; ipc_q65w[4]=n; if(ipc_q65w[0] > m_fetched) { //ndecodes - memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); + memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); //Fetch the new decode(s) readWidebandDecodes(); } mem_q65w.unlock(); @@ -4832,7 +4832,8 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { -// qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1]; +// qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1] << ipc_q65w[2] +// << ipc_q65w[3] << ipc_q65w[4] << m_fetched; if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); @@ -9290,7 +9291,11 @@ void MainWindow::readWidebandDecodes() m_ActiveStationsWidget->displayRecentStations(m_mode,t); m_ActiveStationsWidget->setClickOK(true); } - if(q65wcom.nQDecoderDone==1) m_fetched=0; + if(ipc_q65w[2]==1) { + m_fetched=0; + ipc_q65w[0]=0; + ipc_q65w[2]=0; + } } // -------------------------- Code for FT8 DXpedition Mode --------------------------- From 8d0186bd2a9b52a64acf1b1ae065d8a02a58cfcb Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 17 Dec 2022 08:28:48 -0500 Subject: [PATCH 133/251] Minimal solution to activate double-click decodes in narrow frequency range. --- q65w/libq65/q65c.f90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index f2b9d89ab..9a127757b 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -37,6 +37,12 @@ subroutine q65c(itimer) datetime(18:20)=':00' npatience=1 + + if(newdat.eq.0 .and. nagain.eq.1) then + nfa=nint(mousefqso+0.001*mousedf) - 1 !Minimal solution for + nfb=nint(mousefqso+0.001*mousedf) + 1 !double-click decodes + endif + call timer('decode0 ',0) call decode0(dd,ss,savg) call timer('decode0 ',1) From 6771bd7970c2a1c80a03faa24f16df78b321abf6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 17 Dec 2022 09:41:42 -0500 Subject: [PATCH 134/251] Attempting to solve the "decoder not always called" problem. --- q65w/mainwindow.cpp | 64 +++++++++++++++++++++++++++------------------ q65w/mainwindow.h | 6 +++++ 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index b0dbcb46f..1b1f226ce 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -375,7 +375,7 @@ void MainWindow::dataSink(int k) QString t; m_pctZap=nzap/178.3; - lab4->setText ( + lab2->setText ( QString {" Rx: %1 %2 % "} .arg (px, 5, 'f', 1) .arg (m_pctZap, 5, 'f', 1) @@ -414,14 +414,18 @@ void MainWindow::dataSink(int k) n=0; } - if(ihsym==302) { //Decode at t=56 s (for Q65 and data from disk) + lab5->setText(QString::number(ihsym)); + if(ihsym < m_hsymStop) m_decode_called=false; + if(ihsym >= m_hsymStop and !m_decode_called) { //Decode at t=56 s (for Q65 and data from disk) m_RxState=2; datcom_.newdat=1; datcom_.nagain=0; datcom_.nhsym=ihsym; QDateTime t = QDateTime::currentDateTimeUtc(); m_dateTime=t.toString("yyyy-MMM-dd hh:mm"); + qDebug() << "aa" << "Decoder called" << ihsym;; decode(); //Start the decoder + m_decode_called=true; if(m_saveAll and !m_diskData) { QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + t.time().toString("hhmm"); @@ -592,9 +596,21 @@ void MainWindow::createStatusBar() //createStatusBar lab1->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab1); + lab2 = new QLabel(""); + lab2->setAlignment(Qt::AlignHCenter); + lab2->setMinimumSize(QSize(80,10)); + lab2->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab2); + + lab3 = new QLabel(""); + lab3->setAlignment(Qt::AlignHCenter); + lab3->setMinimumSize(QSize(50,10)); + lab3->setFrameStyle(QFrame::Panel | QFrame::Sunken); + statusBar()->addWidget(lab3); + lab4 = new QLabel(""); lab4->setAlignment(Qt::AlignHCenter); - lab4->setMinimumSize(QSize(80,10)); + lab4->setMinimumSize(QSize(50,10)); lab4->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab4); @@ -603,12 +619,6 @@ void MainWindow::createStatusBar() //createStatusBar lab5->setMinimumSize(QSize(50,10)); lab5->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab5); - - lab6 = new QLabel(""); - lab6->setAlignment(Qt::AlignHCenter); - lab6->setMinimumSize(QSize(50,10)); - lab6->setFrameStyle(QFrame::Panel | QFrame::Sunken); - statusBar()->addWidget(lab6); } void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox @@ -749,7 +759,10 @@ void MainWindow::decoderFinished() //diskWriteFinished mem_q65w.unlock(); QString t1; t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); - lab5->setText(t1); + lab3->setText(t1); + QDateTime now=QDateTime::currentDateTimeUtc(); + float secToDecode=0.001*m_decoder_start_time.msecsTo(now); + qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode; } void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() @@ -801,8 +814,6 @@ void MainWindow::on_actionSave_all_triggered() //Save All //Display list of keyboard shortcuts //Display list of mouse commands //Diaplay list of Add-On pfx/sfx void MainWindow::on_DecodeButton_clicked() //Decode request { - int n=m_sec0%m_TRperiod; - if(m_monitoring and n>47 and (n<52 or m_decoderBusy)) return; if(!m_decoderBusy) { datcom_.newdat=0; datcom_.nagain=1; @@ -914,6 +925,7 @@ void MainWindow::decode() //decode() decodes_.nQDecoderDone=0; m_fetched=0; int itimer=0; + m_decoder_start_time=QDateTime::currentDateTimeUtc(); watcher3.setFuture(QtConcurrent::run (std::bind (q65c_, &itimer))); decodeBusy(true); @@ -922,7 +934,7 @@ void MainWindow::decode() //decode() void MainWindow::on_EraseButton_clicked() { ui->decodedTextBrowser->clear(); - lab5->clear(); + lab3->clear(); } @@ -970,10 +982,12 @@ void MainWindow::guiUpdate() // qDebug() << "BBB" << nsec%60 << decodes_.ndecodes << m_fetched; if(m_pctZap>30.0) { - lab4->setStyleSheet("QLabel{background-color: #ff0000}"); + lab2->setStyleSheet("QLabel{background-color: #ff0000}"); } else { - lab4->setStyleSheet(""); + lab2->setStyleSheet(""); } +// lab5->setText("Q65A"); + if(m_monitoring) { lab1->setStyleSheet("QLabel{background-color: #00ff00}"); @@ -1165,36 +1179,36 @@ void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; - lab6->setStyleSheet("QLabel{background-color: #ffb266}"); - lab6->setText("Q65A"); + lab4->setStyleSheet("QLabel{background-color: #ffb266}"); + lab4->setText("Q65A"); } void MainWindow::on_actionQ65B_triggered() { m_modeQ65=2; - lab6->setStyleSheet("QLabel{background-color: #b2ff66}"); - lab6->setText("Q65B"); + lab4->setStyleSheet("QLabel{background-color: #b2ff66}"); + lab4->setText("Q65B"); } void MainWindow::on_actionQ65C_triggered() { m_modeQ65=3; - lab6->setStyleSheet("QLabel{background-color: #66ffff}"); - lab6->setText("Q65C"); + lab4->setStyleSheet("QLabel{background-color: #66ffff}"); + lab4->setText("Q65C"); } void MainWindow::on_actionQ65D_triggered() { m_modeQ65=4; - lab6->setStyleSheet("QLabel{background-color: #b266ff}"); - lab6->setText("Q65D"); + lab4->setStyleSheet("QLabel{background-color: #b266ff}"); + lab4->setText("Q65D"); } void MainWindow::on_actionQ65E_triggered() { m_modeQ65=5; - lab6->setStyleSheet("QLabel{background-color: #ff66ff}"); - lab6->setText("Q65E"); + lab4->setStyleSheet("QLabel{background-color: #ff66ff}"); + lab4->setText("Q65E"); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 4bd676a70..341dc1ffd 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -122,6 +122,7 @@ private: qint32 m_RxState; qint32 m_dB; qint32 m_fetched=0; + qint32 m_hsymStop=302; double m_fAdd; double m_xavg; @@ -138,6 +139,7 @@ private: bool m_kb8rq; bool m_NB; bool m_fs96000; + bool m_decode_called=false; float m_gainx; float m_gainy; @@ -148,6 +150,8 @@ private: QRect m_wideGraphGeom; QLabel* lab1; // labels in status bar + QLabel* lab2; // labels in status bar + QLabel* lab3; // labels in status bar QLabel* lab4; QLabel* lab5; QLabel* lab6; @@ -162,6 +166,8 @@ private: QFutureWatcher watcher3; //For decoder + QDateTime m_decoder_start_time; + QString m_path; QString m_pbdecoding_style1; QString m_pbmonitor_style; From 7105d67e2bd4ed067f47e5121ba5988a636e8b0d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 17 Dec 2022 15:08:26 -0500 Subject: [PATCH 135/251] Rationalize use of ndepth (1-3) and datetime (yymmdd_hhmm). Add output tp all_q65w.txt. --- lib/map65_mmdec.f90 | 5 +---- q65w/libq65/decode0.f90 | 3 ++- q65w/libq65/ftninit.f90 | 1 + q65w/libq65/q65b.f90 | 9 ++++++--- q65w/libq65/q65wa.f90 | 11 +++++------ q65w/mainwindow.cpp | 15 ++++++++++----- q65w/mainwindow.h | 3 --- 7 files changed, 25 insertions(+), 22 deletions(-) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index dc62e6e7e..3e28e5464 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -1,5 +1,5 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & - nagain,max_drift,mycall,hiscall,hisgrid) + nagain,max_drift,ndepth,mycall,hiscall,hisgrid) use prog_args use timer_module, only: timer @@ -15,7 +15,6 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & logical single_decode,bVHF,lnewdat,lagain,lclearave,lapcqonly integer*2 id2(300*12000) ! type(params_block) :: params - character(len=20) :: datetime character(len=12) :: mycall, hiscall character(len=6) :: hisgrid data ntr0/-1/ @@ -28,7 +27,6 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & ! hiscall=transfer(params%hiscall,hiscall) ! mygrid=transfer(params%mygrid,mygrid) ! hisgrid=transfer(params%hisgrid,hisgrid) - datetime=' ' my_q65%decoded = 0 ncontest=0 @@ -40,7 +38,6 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & lagain=(nagain.ne.0) bVHF=.true. emedelay=2.5 - ndepth=2 !Does this make it too slow? ntrperiod=60 call timer('dec_q65 ',0) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 772b3bb4a..916eb62b2 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -44,7 +44,8 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndop00) + nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndepth, & + datetime,ndop00) call timer('q65wa ',1) return diff --git a/q65w/libq65/ftninit.f90 b/q65w/libq65/ftninit.f90 index 565398565..2255452b0 100644 --- a/q65w/libq65/ftninit.f90 +++ b/q65w/libq65/ftninit.f90 @@ -15,6 +15,7 @@ subroutine ftninit appd='.' addpfx=' ' + open(12,file=appd//'/all_q65w.txt',status='unknown',position='append') open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') open(71,file=appd//'/debug.tmp',status='unknown') diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 4dd038de0..7e0447e28 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -1,6 +1,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & - max_drift,ndop00) + max_drift,ndepth,datetime,ndop00) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. @@ -26,6 +26,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & character*6 hisgrid character*4 grid4 character*60 result + character*20 datetime common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & nWTransmitting,result(50) common/cacb/ca @@ -110,7 +111,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! NB: Frequency of ipk is now shifted to 1000 Hz. call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & - newdat,nagain,max_drift,mycall,hiscall,hisgrid) + newdat,nagain,max_drift,ndepth,mycall,hiscall,hisgrid) MHz=fcenter freq0=MHz + 0.001d0*ikhz @@ -128,10 +129,12 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & fsked=frx - 0.001*ndop00/2.0 - 1.5 write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) 1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) + write(12,1130) datetime,trim(result(ndecodes)(5:)) +1130 format(a11,1x,a) result(ndecodes)=trim(result(ndecodes))//char(0) endif -900 call flush(6) +900 flush(12) return end subroutine q65b diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 1bd8bcb65..6968c22e8 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,6 +1,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndop00) + nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndepth, & + datetime,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. @@ -18,16 +19,14 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & logical candec(MAX_CANDIDATES) type(candidate) :: cand(MAX_CANDIDATES) character*60 result + character*20 datetime common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & nWTransmitting,result(50) common/testcom/ifreq save -! write(*,3001) newdat,ntol,nfa,nfb,mousedf,mousefqso,nagain,nfshift,max_drift -!3001 format(9i6) - + if(nagain.eq.1) ndepth=3 nagain=0 !### TEMPORARY ? ### - rewind 12 nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 @@ -65,7 +64,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,ndop00) + nagain,max_drift,ndepth,datetime,ndop00) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 1b1f226ce..7d561e801 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -422,7 +422,7 @@ void MainWindow::dataSink(int k) datcom_.nagain=0; datcom_.nhsym=ihsym; QDateTime t = QDateTime::currentDateTimeUtc(); - m_dateTime=t.toString("yyyy-MMM-dd hh:mm"); + m_dateTime=t.toString("yymmdd_hhmm"); qDebug() << "aa" << "Decoder called" << ihsym;; decode(); //Start the decoder m_decode_called=true; @@ -762,7 +762,7 @@ void MainWindow::decoderFinished() //diskWriteFinished lab3->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); float secToDecode=0.001*m_decoder_start_time.msecsTo(now); - qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode; + qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode << now.toString("hh:mm:ss.z"); } void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() @@ -840,6 +840,7 @@ void MainWindow::freezeDecode(int n) //freezeDecode() void MainWindow::decode() //decode() { + QString fname=" "; ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); if(datcom_.nagain==0 && (!m_diskData)) { @@ -853,7 +854,7 @@ void MainWindow::decode() //decode() datcom_.idphi=m_dPhi; datcom_.mousedf=m_wide_graph_window->DF(); datcom_.mousefqso=m_wide_graph_window->QSOfreq(); - datcom_.ndepth=m_ndepth; + datcom_.ndepth=m_ndepth+1; datcom_.ndiskdat=0; if(m_diskData) { datcom_.ndiskdat=1; @@ -870,6 +871,7 @@ void MainWindow::decode() //decode() int ndop00; astrosub00_(&nyear, &month, &nday, &uth, &nfreq, m_myGrid.toLatin1(),&ndop00,6); datcom_.ndop00=ndop00; //Send self Doppler to decoder, via datcom + fname=m_path.mid(i0-11,11); } } datcom_.neme=0; @@ -909,7 +911,11 @@ void MainWindow::decode() //decode() memcpy(datcom_.mygrid, mgrid.toLatin1(), 6); memcpy(datcom_.hiscall, hcall.toLatin1(), 12); memcpy(datcom_.hisgrid, hgrid.toLatin1(), 6); - memcpy(datcom_.datetime, m_dateTime.toLatin1(), 17); + if(m_diskData) { + memcpy(datcom_.datetime, fname.toLatin1(), 11); + } else { + memcpy(datcom_.datetime, m_dateTime.toLatin1(), 11); + } datcom_.junk1=1234; //Cecck for these values in m65 datcom_.junk2=5678; @@ -971,7 +977,6 @@ void MainWindow::guiUpdate() if(decodes_.ndecodes > m_fetched) { while(m_fetcheddecodedTextBrowser->append(t.trimmed()); m_fetched++; } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 341dc1ffd..265815b72 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -182,9 +182,6 @@ private: QString m_palette; QString m_dateTime; QString m_mode; - QString m_colors; //Why still needed? - QString m_editorCommand; //Why still needed? - QString m_modeTx; //Why still needed? QHash m_worked; From 8dcb41c47e7485602f6df161f0b20d59e189b98d Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 18 Dec 2022 08:29:04 -0500 Subject: [PATCH 136/251] Minor cleanup, and remove two qDebug()s. --- q65w/mainwindow.cpp | 19 ++++++++++--------- q65w/mainwindow.h | 1 - 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7d561e801..d42dbadb9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -416,16 +416,17 @@ void MainWindow::dataSink(int k) lab5->setText(QString::number(ihsym)); if(ihsym < m_hsymStop) m_decode_called=false; + if(ihsym >= m_hsymStop and !m_decode_called) { //Decode at t=56 s (for Q65 and data from disk) - m_RxState=2; + m_decode_called=true; datcom_.newdat=1; datcom_.nagain=0; datcom_.nhsym=ihsym; QDateTime t = QDateTime::currentDateTimeUtc(); m_dateTime=t.toString("yymmdd_hhmm"); - qDebug() << "aa" << "Decoder called" << ihsym;; +// qDebug() << "aa" << "Decoder called" << ihsym << ipc_wsjtx[0] << ipc_wsjtx[1] +// << ipc_wsjtx[2] << ipc_wsjtx[3] << ipc_wsjtx[4] ; decode(); //Start the decoder - m_decode_called=true; if(m_saveAll and !m_diskData) { QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + t.time().toString("hhmm"); @@ -762,7 +763,7 @@ void MainWindow::decoderFinished() //diskWriteFinished lab3->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); float secToDecode=0.001*m_decoder_start_time.msecsTo(now); - qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode << now.toString("hh:mm:ss.z"); +// qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode << now.toString("hh:mm:ss.z"); } void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() @@ -1185,35 +1186,35 @@ void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; lab4->setStyleSheet("QLabel{background-color: #ffb266}"); - lab4->setText("Q65A"); + lab4->setText("Q65-60A"); } void MainWindow::on_actionQ65B_triggered() { m_modeQ65=2; lab4->setStyleSheet("QLabel{background-color: #b2ff66}"); - lab4->setText("Q65B"); + lab4->setText("Q65-60B"); } void MainWindow::on_actionQ65C_triggered() { m_modeQ65=3; lab4->setStyleSheet("QLabel{background-color: #66ffff}"); - lab4->setText("Q65C"); + lab4->setText("Q65-60C"); } void MainWindow::on_actionQ65D_triggered() { m_modeQ65=4; lab4->setStyleSheet("QLabel{background-color: #b266ff}"); - lab4->setText("Q65D"); + lab4->setText("Q65-60D"); } void MainWindow::on_actionQ65E_triggered() { m_modeQ65=5; lab4->setStyleSheet("QLabel{background-color: #ff66ff}"); - lab4->setText("Q65E"); + lab4->setText("Q65-60E"); } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 265815b72..837581137 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -119,7 +119,6 @@ private: qint32 m_nsave; qint32 m_TRperiod; qint32 m_modeQ65; - qint32 m_RxState; qint32 m_dB; qint32 m_fetched=0; qint32 m_hsymStop=302; From 291410f3c208937d23d4d5f8943b45856fe42daf Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 18 Dec 2022 08:31:15 -0500 Subject: [PATCH 137/251] Oops! Remove an unused variable. --- q65w/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index d42dbadb9..404ce2c62 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -762,7 +762,7 @@ void MainWindow::decoderFinished() //diskWriteFinished t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); lab3->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); - float secToDecode=0.001*m_decoder_start_time.msecsTo(now); +// float secToDecode=0.001*m_decoder_start_time.msecsTo(now); // qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode << now.toString("hh:mm:ss.z"); } From 8b165d81b84270528c8d0ff3a3d48693752af354 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 20 Dec 2022 14:17:33 -0500 Subject: [PATCH 138/251] Allow use of Fortran files 71, 72, 73 for debugging. --- q65w/libq65/ftninit.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/q65w/libq65/ftninit.f90 b/q65w/libq65/ftninit.f90 index 565398565..caa80f78e 100644 --- a/q65w/libq65/ftninit.f90 +++ b/q65w/libq65/ftninit.f90 @@ -17,7 +17,9 @@ subroutine ftninit addpfx=' ' open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') - open(71,file=appd//'/debug.tmp',status='unknown') + open(71,file=appd//'/fort.71',status='unknown') + open(72,file=appd//'/fort.72',status='unknown') + open(73,file=appd//'/fort.73',status='unknown') ! Import FFTW wisdom, if available: iret=fftwf_init_threads() !Initialize FFTW threading From c2fdba0b6e44394bc3f6a5ba4fbe0d7fbc77ce5b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 20 Dec 2022 14:25:04 -0500 Subject: [PATCH 139/251] WIP -- temporary commit. --- q65w/libq65/q65wa.f90 | 63 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 6968c22e8..31258c107 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -26,7 +26,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & save if(nagain.eq.1) ndepth=3 - nagain=0 !### TEMPORARY ? ### nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 @@ -35,10 +34,16 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nts_q65=2**(mode_q65-1) !Q65 tone separation factor call timer('get_cand',0) - call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) +! call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) + call getcand2(savg,nts_q65,cand,ncand) call timer('get_cand',1) - candec=.false. + do i=1,ncand + write(71,3071) i,cand(i)%f,cand(i)%xdt,cand(i)%snr +3071 format(i2,3f10.3) + enddo + + candec=.false. nwrite_q65=0 bq65=mode_q65.gt.0 df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz @@ -61,6 +66,9 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) +! print*,'AAA',icand,nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & +! mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & +! nagain,max_drift,ndop00 call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & @@ -72,3 +80,52 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & return end subroutine q65wa + +subroutine getcand2(savg0,nts_q65,cand,ncand) + + use wideband_sync +! parameter(NFFT=32768) + real savg0(NFFT),savg(NFFT) + integer ipk1(1) + type(candidate) :: cand(MAX_CANDIDATES) + + savg=savg0 + df=96000.0/NFFT + bw=65*nts_q65*1.666666667 + nbw=bw/df + 1 + smin=140.0 + nguard=5 + j=0 + sync(1:NFFT)%ccfmax=0. + + do i=1,NFFT-2*nbw + if(savg(i).lt.smin) cycle + spk=maxval(savg(i:i+nbw)) + ipk1=maxloc(savg(i:i+nbw)) + i0=ipk1(1) + i - 1 + fpk=0.001*i*df + j=j+1 +! write(*,3020) j,fpk,spk +!3020 format(i3,f12.6,f8.1) + cand(j)%f=fpk + cand(j)%xdt=2.5 + cand(j)%snr=spk + cand(j)%iflip=0 + + sync(i0)%ccfmax=spk + + ia=min(i,i0-nguard) + ib=i0+nbw+nguard + savg(ia:ib)=0. +! sync(ia:ib)%ccfmax=0. + if(j.ge.30) exit + enddo + ncand=j + + do i=1,NFFT + write(72,3072) i,0.001*i*df,savg0(i),savg(i),sync(i)%ccfmax +3072 format(i6,f15.6,3f15.3) + enddo + + return +end subroutine getcand2 From 2716b3ed8acb6aae57495e8def815307da6ef755 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 20 Dec 2022 21:04:21 -0500 Subject: [PATCH 140/251] This is a temporary, WIP commit. Many disgnostic statements present! --- q65w/libq65/q65b.f90 | 8 ++++++-- q65w/libq65/q65wa.f90 | 24 ++++++++++++++++-------- q65w/libq65/wideband_sync.f90 | 6 +++--- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 7e0447e28..4f75ab2d9 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -1,6 +1,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & - max_drift,ndepth,datetime,ndop00) + max_drift,ndepth,datetime,ndop00,idec) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. @@ -43,7 +43,10 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ib=nint(ifreq+ntol/df3) ipk1=maxloc(sync(ia:ib)%ccfmax) ipk=ia+ipk1(1)-1 +! f_ipk=ipk*df3 + ipk2=(1000.0*f0-1.0)/df3 snr1=sync(ipk)%ccfmax + ipk=ipk2 !Substitute new ipk value nfft1=MAXFFT1 nfft2=MAXFFT2 @@ -55,7 +58,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & endif nh=nfft2/2 f_mouse=1000.0*(fqso+48.0) + mousedf - f_ipk=ipk*df3 k0=nint((ipk*df3-1000.0)/df) if(nagain.eq.1) k0=nint((f_mouse-1000.0)/df) @@ -132,6 +134,8 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & write(12,1130) datetime,trim(result(ndecodes)(5:)) 1130 format(a11,1x,a) result(ndecodes)=trim(result(ndecodes))//char(0) +! print*,'AAA',f_ipk,k0*df,f0,ipk,ipk2,trim(msg0) + idec=0 endif 900 flush(12) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 31258c107..f34a47071 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -38,10 +38,10 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call getcand2(savg,nts_q65,cand,ncand) call timer('get_cand',1) - do i=1,ncand - write(71,3071) i,cand(i)%f,cand(i)%xdt,cand(i)%snr -3071 format(i2,3f10.3) - enddo +! do i=1,ncand +! write(71,3071) i,cand(i)%f,cand(i)%xdt,cand(i)%snr +!3071 format(i2,3f10.3) +! enddo candec=.false. nwrite_q65=0 @@ -65,6 +65,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & if(candec(icand)) cycle !Skip if already decoded freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) + idec=-1 ! print*,'AAA',icand,nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & @@ -72,9 +73,14 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,max_drift,ndepth,datetime,ndop00) + nagain,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. + + write(71,3071) icand,cand(icand)%f,32.0+cand(icand)%f, & + cand(icand)%xdt,cand(icand)%snr,idec,ndecodes +3071 format(i2,4f10.3,2i5) + enddo ! icand ndecdone=2 @@ -93,8 +99,10 @@ subroutine getcand2(savg0,nts_q65,cand,ncand) df=96000.0/NFFT bw=65*nts_q65*1.666666667 nbw=bw/df + 1 - smin=140.0 + smin=70.0 nguard=5 + +! print*,'aaa',nts_q65,bw j=0 sync(1:NFFT)%ccfmax=0. @@ -108,7 +116,7 @@ subroutine getcand2(savg0,nts_q65,cand,ncand) ! write(*,3020) j,fpk,spk !3020 format(i3,f12.6,f8.1) cand(j)%f=fpk - cand(j)%xdt=2.5 + cand(j)%xdt=2.8 cand(j)%snr=spk cand(j)%iflip=0 @@ -123,7 +131,7 @@ subroutine getcand2(savg0,nts_q65,cand,ncand) ncand=j do i=1,NFFT - write(72,3072) i,0.001*i*df,savg0(i),savg(i),sync(i)%ccfmax + write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax 3072 format(i6,f15.6,3f15.3) enddo diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index 080258c8d..57ee103fc 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -41,7 +41,7 @@ subroutine get_candidates(ss,savg,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) type(candidate) :: cand(MAX_CANDIDATES) type(candidate) :: cand0(MAX_CANDIDATES) - call wb_sync(ss,savg,jz,nfa,nfb) !Output to sync() array + call wb_sync(ss,savg,jz,nfa,nfb,nts_q65) !Output to sync() array tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 df3=96000.0/NFFT @@ -113,7 +113,7 @@ subroutine get_candidates(ss,savg,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) return end subroutine get_candidates -subroutine wb_sync(ss,savg,jz,nfa,nfb) +subroutine wb_sync(ss,savg,jz,nfa,nfb,nts_q65) ! Compute "orange sync curve" using the Q65 sync pattern @@ -239,7 +239,7 @@ subroutine wb_sync(ss,savg,jz,nfa,nfb) call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) sync(ia:ib)%ccfmax=sync(ia:ib)%ccfmax/base - bw=65*4*1.66666667 !Q65-60C bandwidth + bw=65*nts_q65*1.66666667 !Q65-60x bandwidth nbw=bw/df3 + 1 !Number of bins to blank syncmin=2.0 nguard=10 From e398b6a33d5c329bd76712af79647030a83f6cf6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 21 Dec 2022 13:29:32 -0500 Subject: [PATCH 141/251] New "getcand2" is now working well. --- q65w/libq65/decode0.f90 | 2 +- q65w/libq65/q65wa.f90 | 104 +++++++++++++++++++++++++++++++++------- 2 files changed, 87 insertions(+), 19 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 916eb62b2..c6771a1cc 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -44,7 +44,7 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndepth, & + nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & datetime,ndop00) call timer('q65wa ',1) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index f34a47071..5b00625f6 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,6 +1,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mycall,hiscall,hisgrid,nhsym,nfsample,nmode,ndepth, & + nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & datetime,ndop00) ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. @@ -35,7 +35,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('get_cand',0) ! call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) - call getcand2(savg,nts_q65,cand,ncand) + call getcand2(ss,savg,nts_q65,cand,ncand) call timer('get_cand',1) ! do i=1,ncand @@ -77,9 +77,9 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. - write(71,3071) icand,cand(icand)%f,32.0+cand(icand)%f, & - cand(icand)%xdt,cand(icand)%snr,idec,ndecodes -3071 format(i2,4f10.3,2i5) +! write(71,3071) icand,cand(icand)%f,32.0+cand(icand)%f, & +! cand(icand)%xdt,cand(icand)%snr,idec,ndecodes +!3071 format(i2,4f10.3,2i5) enddo ! icand ndecdone=2 @@ -87,22 +87,33 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & return end subroutine q65wa -subroutine getcand2(savg0,nts_q65,cand,ncand) +subroutine getcand2(ss,savg0,nts_q65,cand,ncand) use wideband_sync ! parameter(NFFT=32768) + real ss(322,NFFT) real savg0(NFFT),savg(NFFT) integer ipk1(1) + logical sync_ok type(candidate) :: cand(MAX_CANDIDATES) + data nseg/16/,npct/40/ savg=savg0 + nlen=NFFT/nseg + do iseg=1,nseg + ja=(iseg-1)*nlen + 1 + jb=ja + nlen - 1 + call pctile(savg(ja),nlen,npct,base) + savg(ja:jb)=savg(ja:jb)/(1.015*base) + savg0(ja:jb)=savg0(ja:jb)/(1.015*base) + enddo + df=96000.0/NFFT bw=65*nts_q65*1.666666667 nbw=bw/df + 1 - smin=70.0 + smin=1.4 nguard=5 -! print*,'aaa',nts_q65,bw j=0 sync(1:NFFT)%ccfmax=0. @@ -111,29 +122,86 @@ subroutine getcand2(savg0,nts_q65,cand,ncand) spk=maxval(savg(i:i+nbw)) ipk1=maxloc(savg(i:i+nbw)) i0=ipk1(1) + i - 1 - fpk=0.001*i*df + fpk=0.001*i0*df +! Check to see if sync tone is present. + call q65_sync(ss,i0,nts_q65,sync_ok,snr_sync,xdt) + if(.not.sync_ok) cycle j=j+1 -! write(*,3020) j,fpk,spk -!3020 format(i3,f12.6,f8.1) +! write(73,3073) j,fpk+32.0-2.270,snr_sync,xdt +!3073 format(i3,3f10.3) cand(j)%f=fpk cand(j)%xdt=2.8 cand(j)%snr=spk cand(j)%iflip=0 - sync(i0)%ccfmax=spk - ia=min(i,i0-nguard) ib=i0+nbw+nguard savg(ia:ib)=0. -! sync(ia:ib)%ccfmax=0. if(j.ge.30) exit enddo ncand=j - do i=1,NFFT - write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax -3072 format(i6,f15.6,3f15.3) - enddo +! do i=1,NFFT +! write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax +!3072 format(i6,f15.6,3f15.3) +! enddo return end subroutine getcand2 + +subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) + + parameter (NFFT=32768) + parameter (LAGMAX=33) + real ss(322,NFFT) + real ccf(0:LAGMAX) + logical sync_ok + logical first + integer isync(22),ipk(1) + +! Q65 sync symbols + data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ + data first/.true./ + save first,isync + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + if(first) then + fac=0.6/tstep !3.230 + do i=1,22 !Expand the Q65 sync stride + isync(i)=nint((isync(i)-1)*fac) + 1 + enddo + first=.false. + endif + + m=nts_q65/2 + ccf=0. + do lag=0,LAGMAX + do j=1,22 !Test for Q65 sync + k=isync(j) + lag +! ccf=ccf + ss(k,i0) + ss(k+1,i0) + ss(k+2,i0) + ccf(lag)=ccf(lag) + sum(ss(k,i0-m:i0+m)) + sum(ss(k+1,i0-m:i0+m)) & + + sum(ss(k+2,i0-m:i0+m)) + enddo + enddo + ccfmax=maxval(ccf) + ipk=maxloc(ccf) + lagbest=ipk(1)-1 + xdt=lagbest*tstep - 1.0 + + xsum=0. + sq=0. + nsum=0 + do i=0,lagmax + if(abs(i-lagbest).gt.2) then + xsum=xsum+ccf(i) + sq=sq+ccf(i)**2 + nsum=nsum+1 + endif + enddo + ave=xsum/nsum + rms=sqrt(sq/nsum - ave*ave) + snr=(ccfmax-ave)/rms + sync_ok=snr.ge.5.0 + + return +end subroutine q65_sync From a085b5e3909c3b6621a291733a08669bef5df053 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 21 Dec 2022 16:02:39 -0500 Subject: [PATCH 142/251] another few tweaks, a few more decodes. :-) --- q65w/libq65/q65wa.f90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 5b00625f6..0a949fc1b 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -107,20 +107,21 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) savg(ja:jb)=savg(ja:jb)/(1.015*base) savg0(ja:jb)=savg0(ja:jb)/(1.015*base) enddo - + df=96000.0/NFFT bw=65*nts_q65*1.666666667 nbw=bw/df + 1 + nb0=2*nts_q65 smin=1.4 nguard=5 j=0 sync(1:NFFT)%ccfmax=0. - do i=1,NFFT-2*nbw + do i=1,NFFT-nbw-nguard if(savg(i).lt.smin) cycle - spk=maxval(savg(i:i+nbw)) - ipk1=maxloc(savg(i:i+nbw)) + spk=maxval(savg(i:i+nb0)) + ipk1=maxloc(savg(i:i+nb0)) i0=ipk1(1) + i - 1 fpk=0.001*i0*df ! Check to see if sync tone is present. @@ -130,10 +131,10 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) ! write(73,3073) j,fpk+32.0-2.270,snr_sync,xdt !3073 format(i3,3f10.3) cand(j)%f=fpk - cand(j)%xdt=2.8 - cand(j)%snr=spk + cand(j)%xdt=xdt + cand(j)%snr=snr_sync cand(j)%iflip=0 - sync(i0)%ccfmax=spk + sync(i0)%ccfmax=snr_sync ia=min(i,i0-nguard) ib=i0+nbw+nguard savg(ia:ib)=0. From ceb80ac8100a14be385e971d74b378a506b3919b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 21 Dec 2022 16:13:24 -0500 Subject: [PATCH 143/251] Separate out getcand2.f90 and q65_sync.f90. Minimize wideband_sync module. --- q65w/libq65/CMakeLists.txt | 6 +- q65w/libq65/getcand2.f90 | 62 +++++++++ q65w/libq65/q65_sync.f90 | 56 ++++++++ q65w/libq65/q65wa.f90 | 120 ----------------- q65w/libq65/wideband_sync.f90 | 233 ---------------------------------- 5 files changed, 122 insertions(+), 355 deletions(-) create mode 100644 q65w/libq65/getcand2.f90 create mode 100644 q65w/libq65/q65_sync.f90 diff --git a/q65w/libq65/CMakeLists.txt b/q65w/libq65/CMakeLists.txt index e0ac18ede..b5c21ee62 100644 --- a/q65w/libq65/CMakeLists.txt +++ b/q65w/libq65/CMakeLists.txt @@ -1,6 +1,6 @@ set (libq65_FSRCS # Modules come first: - wideband_sync.f90 +wideband_sync.f90 # Non-module Fortran routines: astro.f90 @@ -14,14 +14,16 @@ set (libq65_FSRCS four2a.f90 ftninit.f90 ftnquit.f90 - q65b.f90 geocentric.f90 + getcand2.f90 grid2deg.f90 indexx.f90 lorentzian.f90 moon2.f90 moondop.f90 + q65b.f90 q65c.f90 + q65_sync.f90 q65wa.f90 recvpkt.f90 sun.f90 diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 new file mode 100644 index 000000000..7ebcc35aa --- /dev/null +++ b/q65w/libq65/getcand2.f90 @@ -0,0 +1,62 @@ +subroutine getcand2(ss,savg0,nts_q65,cand,ncand) + + use wideband_sync +! parameter(NFFT=32768) + real ss(322,NFFT) + real savg0(NFFT),savg(NFFT) + integer ipk1(1) + logical sync_ok + type(candidate) :: cand(MAX_CANDIDATES) + data nseg/16/,npct/40/ + + savg=savg0 + nlen=NFFT/nseg + do iseg=1,nseg + ja=(iseg-1)*nlen + 1 + jb=ja + nlen - 1 + call pctile(savg(ja),nlen,npct,base) + savg(ja:jb)=savg(ja:jb)/(1.015*base) + savg0(ja:jb)=savg0(ja:jb)/(1.015*base) + enddo + + df=96000.0/NFFT + bw=65*nts_q65*1.666666667 + nbw=bw/df + 1 + nb0=2*nts_q65 + smin=1.4 + nguard=5 + + j=0 + sync(1:NFFT)%ccfmax=0. + + do i=1,NFFT-nbw-nguard + if(savg(i).lt.smin) cycle + spk=maxval(savg(i:i+nb0)) + ipk1=maxloc(savg(i:i+nb0)) + i0=ipk1(1) + i - 1 + fpk=0.001*i0*df +! Check to see if sync tone is present. + call q65_sync(ss,i0,nts_q65,sync_ok,snr_sync,xdt) + if(.not.sync_ok) cycle + j=j+1 +! write(73,3073) j,fpk+32.0-2.270,snr_sync,xdt +!3073 format(i3,3f10.3) + cand(j)%f=fpk + cand(j)%xdt=xdt + cand(j)%snr=snr_sync + cand(j)%iflip=0 + sync(i0)%ccfmax=snr_sync + ia=min(i,i0-nguard) + ib=i0+nbw+nguard + savg(ia:ib)=0. + if(j.ge.30) exit + enddo + ncand=j + +! do i=1,NFFT +! write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax +!3072 format(i6,f15.6,3f15.3) +! enddo + + return +end subroutine getcand2 diff --git a/q65w/libq65/q65_sync.f90 b/q65w/libq65/q65_sync.f90 new file mode 100644 index 000000000..bd5f9aa77 --- /dev/null +++ b/q65w/libq65/q65_sync.f90 @@ -0,0 +1,56 @@ +subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) + + parameter (NFFT=32768) + parameter (LAGMAX=33) + real ss(322,NFFT) + real ccf(0:LAGMAX) + logical sync_ok + logical first + integer isync(22),ipk(1) + +! Q65 sync symbols + data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ + data first/.true./ + save first,isync + + tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 + if(first) then + fac=0.6/tstep !3.230 + do i=1,22 !Expand the Q65 sync stride + isync(i)=nint((isync(i)-1)*fac) + 1 + enddo + first=.false. + endif + + m=nts_q65/2 + ccf=0. + do lag=0,LAGMAX + do j=1,22 !Test for Q65 sync + k=isync(j) + lag +! ccf=ccf + ss(k,i0) + ss(k+1,i0) + ss(k+2,i0) + ccf(lag)=ccf(lag) + sum(ss(k,i0-m:i0+m)) + sum(ss(k+1,i0-m:i0+m)) & + + sum(ss(k+2,i0-m:i0+m)) + enddo + enddo + ccfmax=maxval(ccf) + ipk=maxloc(ccf) + lagbest=ipk(1)-1 + xdt=lagbest*tstep - 1.0 + + xsum=0. + sq=0. + nsum=0 + do i=0,lagmax + if(abs(i-lagbest).gt.2) then + xsum=xsum+ccf(i) + sq=sq+ccf(i)**2 + nsum=nsum+1 + endif + enddo + ave=xsum/nsum + rms=sqrt(sq/nsum - ave*ave) + snr=(ccfmax-ave)/rms + sync_ok=snr.ge.5.0 + + return +end subroutine q65_sync diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 0a949fc1b..af0ad6b2d 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -86,123 +86,3 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & return end subroutine q65wa - -subroutine getcand2(ss,savg0,nts_q65,cand,ncand) - - use wideband_sync -! parameter(NFFT=32768) - real ss(322,NFFT) - real savg0(NFFT),savg(NFFT) - integer ipk1(1) - logical sync_ok - type(candidate) :: cand(MAX_CANDIDATES) - data nseg/16/,npct/40/ - - savg=savg0 - nlen=NFFT/nseg - do iseg=1,nseg - ja=(iseg-1)*nlen + 1 - jb=ja + nlen - 1 - call pctile(savg(ja),nlen,npct,base) - savg(ja:jb)=savg(ja:jb)/(1.015*base) - savg0(ja:jb)=savg0(ja:jb)/(1.015*base) - enddo - - df=96000.0/NFFT - bw=65*nts_q65*1.666666667 - nbw=bw/df + 1 - nb0=2*nts_q65 - smin=1.4 - nguard=5 - - j=0 - sync(1:NFFT)%ccfmax=0. - - do i=1,NFFT-nbw-nguard - if(savg(i).lt.smin) cycle - spk=maxval(savg(i:i+nb0)) - ipk1=maxloc(savg(i:i+nb0)) - i0=ipk1(1) + i - 1 - fpk=0.001*i0*df -! Check to see if sync tone is present. - call q65_sync(ss,i0,nts_q65,sync_ok,snr_sync,xdt) - if(.not.sync_ok) cycle - j=j+1 -! write(73,3073) j,fpk+32.0-2.270,snr_sync,xdt -!3073 format(i3,3f10.3) - cand(j)%f=fpk - cand(j)%xdt=xdt - cand(j)%snr=snr_sync - cand(j)%iflip=0 - sync(i0)%ccfmax=snr_sync - ia=min(i,i0-nguard) - ib=i0+nbw+nguard - savg(ia:ib)=0. - if(j.ge.30) exit - enddo - ncand=j - -! do i=1,NFFT -! write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax -!3072 format(i6,f15.6,3f15.3) -! enddo - - return -end subroutine getcand2 - -subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) - - parameter (NFFT=32768) - parameter (LAGMAX=33) - real ss(322,NFFT) - real ccf(0:LAGMAX) - logical sync_ok - logical first - integer isync(22),ipk(1) - -! Q65 sync symbols - data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ - data first/.true./ - save first,isync - - tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 - if(first) then - fac=0.6/tstep !3.230 - do i=1,22 !Expand the Q65 sync stride - isync(i)=nint((isync(i)-1)*fac) + 1 - enddo - first=.false. - endif - - m=nts_q65/2 - ccf=0. - do lag=0,LAGMAX - do j=1,22 !Test for Q65 sync - k=isync(j) + lag -! ccf=ccf + ss(k,i0) + ss(k+1,i0) + ss(k+2,i0) - ccf(lag)=ccf(lag) + sum(ss(k,i0-m:i0+m)) + sum(ss(k+1,i0-m:i0+m)) & - + sum(ss(k+2,i0-m:i0+m)) - enddo - enddo - ccfmax=maxval(ccf) - ipk=maxloc(ccf) - lagbest=ipk(1)-1 - xdt=lagbest*tstep - 1.0 - - xsum=0. - sq=0. - nsum=0 - do i=0,lagmax - if(abs(i-lagbest).gt.2) then - xsum=xsum+ccf(i) - sq=sq+ccf(i)**2 - nsum=nsum+1 - endif - enddo - ave=xsum/nsum - rms=sqrt(sq/nsum - ave*ave) - snr=(ccfmax-ave)/rms - sync_ok=snr.ge.5.0 - - return -end subroutine q65_sync diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index 57ee103fc..6ef154f46 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -24,237 +24,4 @@ module wideband_sync type(sync_dat) :: sync(NFFT) integer nkhz_center - contains - -subroutine get_candidates(ss,savg,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand) - -! Search symbol spectra ss() over frequency range nfa to nfb (in kHz) for -! JT65 and Q65 sync patterns. The nts_* variables are the submode tone -! spacings: 1 2 4 8 16 for A B C D E. Birdies are detected and -! excised. Candidates are returned in the structure array cand(). - - parameter (MAX_PEAKS=100) - real ss(322,NFFT),savg(NFFT) - real pavg(-20:20) - integer indx(NFFT) - logical skip - type(candidate) :: cand(MAX_CANDIDATES) - type(candidate) :: cand0(MAX_CANDIDATES) - - call wb_sync(ss,savg,jz,nfa,nfb,nts_q65) !Output to sync() array - - tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 - df3=96000.0/NFFT - ia=nint(1000*nfa/df3) + 1 - ib=nint(1000*nfb/df3) + 1 - if(ia.lt.1) ia=1 - if(ib.gt.NFFT-1) ib=NFFT-1 - iz=ib-ia+1 - - call indexx(sync(ia:ib)%ccfmax,iz,indx) !Sort by relative snr - - k=0 - do i=1,MAX_PEAKS - n=indx(iz+1-i) + ia - 1 - f0=0.001*(n-1)*df3 - snr1=sync(n)%ccfmax - if(snr1.lt.SNR1_THRESHOLD) exit - flip=sync(n)%iflip - if(flip.ne.0.0 .and. nts_jt65.eq.0) cycle - if(flip.eq.0.0 .and. nts_q65.eq.0) cycle - if(sync(n)%birdie) cycle - -! Test for signal outside of TxT range and set bw for this signal type - j1=(sync(n)%xdt + 1.0)/tstep - 1.0 - j2=(sync(n)%xdt + 52.0)/tstep + 1.0 - if(flip.ne.0) j2=(sync(n)%xdt + 47.811)/tstep + 1.0 - ipol=sync(n)%ipol - pavg=0. - do j=1,j1 - pavg=pavg + ss(j,n-20:n+20) - enddo - do j=j2,jz - pavg=pavg + ss(j,n-20:n+20) - enddo - jsum=j1 + (jz-j2+1) - pmax=maxval(pavg(-2:2)) !### Why not just pavg(0) ? - base=(sum(pavg)-pmax)/jsum - pmax=pmax/base - if(pmax.gt.5.0) cycle - skip=.false. - do m=1,k !Skip false syncs within signal bw - diffhz=1000.0*(f0-cand(m)%f) - bw=nts_q65*110.0 - if(cand(m)%iflip.ne.0) bw=nts_jt65*178.0 - if(diffhz.gt.-0.03*bw .and. diffhz.lt.1.03*bw) skip=.true. - enddo - if(skip) cycle - k=k+1 - cand(k)%snr=snr1 - cand(k)%f=f0 - cand(k)%xdt=sync(n)%xdt - cand(k)%pol=sync(n)%pol - cand(k)%ipol=sync(n)%ipol - cand(k)%iflip=nint(flip) - cand(k)%indx=n -! write(50,3050) i,k,m,f0+32.0,diffhz,bw,snr1,db(snr1) -!3050 format(3i5,f8.3,2f8.0,2f8.2) - if(k.ge.MAX_CANDIDATES) exit - enddo - ncand=k - - cand0(1:ncand)=cand(1:ncand) - call indexx(cand0(1:ncand)%f,ncand,indx) !Sort by relative snr - do i=1,ncand - k=indx(i) - cand(i)=cand0(k) - enddo - - return -end subroutine get_candidates - -subroutine wb_sync(ss,savg,jz,nfa,nfb,nts_q65) - -! Compute "orange sync curve" using the Q65 sync pattern - - use timer_module, only: timer - parameter (NFFT=32768) - parameter (LAGMAX=30) - real ss(322,NFFT) - real savg(NFFT) - real savg_med - logical first - integer isync(22) - integer jsync0(63),jsync1(63) - integer ip(1) - -! Q65 sync symbols - data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ - data jsync0/ & - 1, 4, 5, 9, 10, 11, 12, 13, 14, 16, 18, 22, 24, 25, 28, 32, & - 33, 34, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 52, 53, 55, 57, & - 59, 60, 63, 64, 66, 68, 70, 73, 80, 81, 89, 90, 92, 95, 97, 98, & - 100,102,104,107,108,111,114,119,120,121,122,123,124,125,126/ - data jsync1/ & - 2, 3, 6, 7, 8, 15, 17, 19, 20, 21, 23, 26, 27, 29, 30, 31, & - 35, 36, 41, 44, 49, 50, 51, 54, 56, 58, 61, 62, 65, 67, 69, 71, & - 72, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 87, 88, 91, 93, & - 94, 96, 99,101,103,105,106,109,110,112,113,115,116,117,118/ - data first/.true./ - save first,isync,jsync0,jsync1 - - tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 - if(first) then - fac=0.6/tstep - do i=1,22 !Expand the Q65 sync stride - isync(i)=nint((isync(i)-1)*fac) + 1 - enddo - do i=1,63 - jsync0(i)=2*(jsync0(i)-1) + 1 - jsync1(i)=2*(jsync1(i)-1) + 1 - enddo - first=.false. - endif - - df3=96000.0/NFFT - ia=nint(1000*nfa/df3) + 1 !Flat frequency range for WSE converters - ib=nint(1000*nfb/df3) + 1 - if(ia.lt.1) ia=1 - if(ib.gt.NFFT-1) ib=NFFT-1 - - call pctile(savg(ia:ib),ib-ia+1,50,savg_med) - - lagbest=0 - ipolbest=1 - flip=0. - - do i=ia,ib - ccfmax=0. - do lag=0,LAGMAX - - ccf=0. - ccf4=0. - do j=1,22 !Test for Q65 sync - k=isync(j) + lag - ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) & - + ss(k+2,i+1) - enddo - ccf4=ccf4 - savg(i+1)*3*22/float(jz) - ccf=ccf4 - ipol=1 - if(ccf.gt.ccfmax) then - ipolbest=ipol - lagbest=lag - ccfmax=ccf - ccf4best=ccf4 - flip=0. - endif - - ccf=0. - ccf4=0. - do j=1,63 !Test for JT65 sync, std msg - k=jsync0(j) + lag - ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) - enddo - ccf4=ccf4 - savg(i+1)*2*63/float(jz) - ccf=ccf4 - ipol=1 - if(ccf.gt.ccfmax) then - ipolbest=ipol - lagbest=lag - ccfmax=ccf - ccf4best=ccf4 - flip=1.0 - endif - - ccf=0. - ccf4=0. - do j=1,63 !Test for JT65 sync, OOO msg - k=jsync1(j) + lag - ccf4=ccf4 + ss(k,i+1) + ss(k+1,i+1) - enddo - ccf4=ccf4 - savg(i+1)*2*63/float(jz) - ccf=ccf4 - ipol=1 - if(ccf.gt.ccfmax) then - ipolbest=ipol - lagbest=lag - ccfmax=ccf - ccf4best=ccf4 - flip=-1.0 - endif - - enddo ! lag - - poldeg=0. - sync(i)%ccfmax=ccfmax - sync(i)%xdt=lagbest*tstep-1.0 - sync(i)%pol=poldeg - sync(i)%ipol=ipolbest - sync(i)%iflip=flip - sync(i)%birdie=.false. - if(ccfmax/(savg(i)/savg_med).lt.3.0) sync(i)%birdie=.true. - enddo ! i (frequency bin) - - call pctile(sync(ia:ib)%ccfmax,ib-ia+1,50,base) - sync(ia:ib)%ccfmax=sync(ia:ib)%ccfmax/base - - bw=65*nts_q65*1.66666667 !Q65-60x bandwidth - nbw=bw/df3 + 1 !Number of bins to blank - syncmin=2.0 - nguard=10 - do i=ia,ib - if(sync(i)%ccfmax.lt.syncmin) cycle - spk=maxval(sync(i:i+nbw)%ccfmax) - ip =maxloc(sync(i:i+nbw)%ccfmax) - i0=ip(1)+i-1 - ja=min(i,i0-nguard) - jb=i0+nbw+nguard - sync(ja:jb)%ccfmax=0. - sync(i0)%ccfmax=spk - enddo - - return -end subroutine wb_sync - end module wideband_sync From b0e5ff00134841d0b3d02e8e2adb5aa6fe715eaa Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 08:20:39 -0500 Subject: [PATCH 144/251] Code cleanup. --- q65w/libq65/getcand2.f90 | 12 ------------ q65w/libq65/q65b.f90 | 18 +----------------- q65w/libq65/q65wa.f90 | 16 ---------------- q65w/libq65/wideband_sync.f90 | 13 ------------- 4 files changed, 1 insertion(+), 58 deletions(-) diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 index 7ebcc35aa..da779e470 100644 --- a/q65w/libq65/getcand2.f90 +++ b/q65w/libq65/getcand2.f90 @@ -1,7 +1,6 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) use wideband_sync -! parameter(NFFT=32768) real ss(322,NFFT) real savg0(NFFT),savg(NFFT) integer ipk1(1) @@ -27,8 +26,6 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) nguard=5 j=0 - sync(1:NFFT)%ccfmax=0. - do i=1,NFFT-nbw-nguard if(savg(i).lt.smin) cycle spk=maxval(savg(i:i+nb0)) @@ -39,13 +36,9 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) call q65_sync(ss,i0,nts_q65,sync_ok,snr_sync,xdt) if(.not.sync_ok) cycle j=j+1 -! write(73,3073) j,fpk+32.0-2.270,snr_sync,xdt -!3073 format(i3,3f10.3) cand(j)%f=fpk cand(j)%xdt=xdt cand(j)%snr=snr_sync - cand(j)%iflip=0 - sync(i0)%ccfmax=snr_sync ia=min(i,i0-nguard) ib=i0+nbw+nguard savg(ia:ib)=0. @@ -53,10 +46,5 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) enddo ncand=j -! do i=1,NFFT -! write(72,3072) i,0.001*i*df+32.0,savg0(i),savg(i),sync(i)%ccfmax -!3072 format(i6,f15.6,3f15.3) -! enddo - return end subroutine getcand2 diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 4f75ab2d9..373e5183a 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -15,11 +15,9 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & parameter (MAXFFT2=336000) !56*6000 (downsampled by 1/16) parameter (NMAX=60*12000) parameter (RAD=57.2957795) -! type(hdr) h !Header for the .wav file integer*2 iwave(60*12000) complex ca(MAXFFT1) !FFTs of raw x,y data complex cx(0:MAXFFT2-1),cz(0:MAXFFT2) - integer ipk1(1) real*8 fcenter,freq0,freq1 character*12 mycall0,hiscall0 character*12 mycall,hiscall @@ -38,16 +36,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! Find best frequency from sync_dat, the "orange sync curve". df3=96000.0/32768.0 - ifreq=nint((1000.0*f0)/df3) - ia=nint(ifreq-ntol/df3) - ib=nint(ifreq+ntol/df3) - ipk1=maxloc(sync(ia:ib)%ccfmax) - ipk=ia+ipk1(1)-1 -! f_ipk=ipk*df3 - ipk2=(1000.0*f0-1.0)/df3 - snr1=sync(ipk)%ccfmax - ipk=ipk2 !Substitute new ipk value - + ipk=(1000.0*f0-1.0)/df3 nfft1=MAXFFT1 nfft2=MAXFFT2 df=96000.0/NFFT1 @@ -62,8 +51,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & if(nagain.eq.1) k0=nint((f_mouse-1000.0)/df) if(k0.lt.nh .or. k0.gt.MAXFFT1-nfft2+1) go to 900 - if(snr1.lt.1.5) go to 900 !### Threshold needs work? ### - fac=1.0/nfft2 cx(0:nfft2-1)=ca(k0:k0+nfft2-1) cx=fac*cx @@ -111,7 +98,6 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & nsnr0=-99 !Default snr for no decode ! NB: Frequency of ipk is now shifted to 1000 Hz. - call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & newdat,nagain,max_drift,ndepth,mycall,hiscall,hisgrid) MHz=fcenter @@ -134,11 +120,9 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & write(12,1130) datetime,trim(result(ndecodes)(5:)) 1130 format(a11,1x,a) result(ndecodes)=trim(result(ndecodes))//char(0) -! print*,'AAA',f_ipk,k0*df,f0,ipk,ipk2,trim(msg0) idec=0 endif 900 flush(12) - return end subroutine q65b diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index af0ad6b2d..d9f7d1b10 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -26,7 +26,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & save if(nagain.eq.1) ndepth=3 - nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 @@ -34,15 +33,9 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nts_q65=2**(mode_q65-1) !Q65 tone separation factor call timer('get_cand',0) -! call get_candidates(ss,savg,nhsym,mfa,mfb,nts_jt65,nts_q65,cand,ncand) call getcand2(ss,savg,nts_q65,cand,ncand) call timer('get_cand',1) -! do i=1,ncand -! write(71,3071) i,cand(i)%f,cand(i)%xdt,cand(i)%snr -!3071 format(i2,3f10.3) -! enddo - candec=.false. nwrite_q65=0 bq65=mode_q65.gt.0 @@ -61,26 +54,17 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & ! Do the wideband Q65 decode do icand=1,ncand f0=cand(icand)%f - if(cand(icand)%iflip.ne.0) cycle !Do only Q65 candidates here if(candec(icand)) cycle !Skip if already decoded freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) idec=-1 -! print*,'AAA',icand,nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & -! mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & -! nagain,max_drift,ndop00 call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & nagain,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. - -! write(71,3071) icand,cand(icand)%f,32.0+cand(icand)%f, & -! cand(icand)%xdt,cand(icand)%snr,idec,ndecodes -!3071 format(i2,4f10.3,2i5) - enddo ! icand ndecdone=2 diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 index 6ef154f46..45702e653 100644 --- a/q65w/libq65/wideband_sync.f90 +++ b/q65w/libq65/wideband_sync.f90 @@ -4,24 +4,11 @@ module wideband_sync real :: snr !Relative S/N of sync detection real :: f !Freq of sync tone, 0 to 96000 Hz real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s - real :: pol !Polarization angle, degrees - integer :: ipol !Polarization angle, 1 to 4 ==> 0, 45, 90, 135 deg - integer :: iflip !Sync type: JT65 = +/- 1, Q65 = 0 - integer :: indx end type candidate - type sync_dat - real :: ccfmax - real :: xdt - real :: pol - integer :: ipol - integer :: iflip - logical :: birdie - end type sync_dat parameter (NFFT=32768) parameter (MAX_CANDIDATES=50) parameter (SNR1_THRESHOLD=4.5) - type(sync_dat) :: sync(NFFT) integer nkhz_center end module wideband_sync From e0e7ac69fae3a93c00feec7a74fe0c349e0e5567 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 08:39:24 -0500 Subject: [PATCH 145/251] More code cleanup. Eliminate wideband_sync.f90. --- q65w/libq65/CMakeLists.txt | 1 - q65w/libq65/getcand2.f90 | 11 ++++++- q65w/libq65/q65b.f90 | 6 ++-- q65w/libq65/q65wa.f90 | 15 +++++++-- q65w/libq65/synctest.f90 | 57 ----------------------------------- q65w/libq65/wideband_sync.f90 | 14 --------- 6 files changed, 25 insertions(+), 79 deletions(-) delete mode 100644 q65w/libq65/synctest.f90 delete mode 100644 q65w/libq65/wideband_sync.f90 diff --git a/q65w/libq65/CMakeLists.txt b/q65w/libq65/CMakeLists.txt index b5c21ee62..e67b20149 100644 --- a/q65w/libq65/CMakeLists.txt +++ b/q65w/libq65/CMakeLists.txt @@ -1,6 +1,5 @@ set (libq65_FSRCS # Modules come first: -wideband_sync.f90 # Non-module Fortran routines: astro.f90 diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 index da779e470..1971f54d8 100644 --- a/q65w/libq65/getcand2.f90 +++ b/q65w/libq65/getcand2.f90 @@ -1,6 +1,15 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) - use wideband_sync +! use wideband_sync + + type candidate + real :: snr !Relative S/N of sync detection + real :: f !Freq of sync tone, 0 to 96000 Hz + real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s + end type candidate + + parameter (NFFT=32768) + parameter (MAX_CANDIDATES=50) real ss(322,NFFT) real savg0(NFFT),savg(NFFT) integer ipk1(1) diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 373e5183a..9c8f330ec 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -1,5 +1,5 @@ -subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & - mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain, & +subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,nkhz_center, newdat,nagain, & max_drift,ndepth,datetime,ndop00,idec) ! This routine provides an interface between MAP65 and the Q65 decoder @@ -8,7 +8,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! in common/cacb. Decoded messages are sent back to the GUI on stdout. use q65_decode - use wideband_sync +! use wideband_sync use timer_module, only: timer parameter (MAXFFT1=5376000) !56*96000 diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index d9f7d1b10..09b757997 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -5,9 +5,18 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & ! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. - use wideband_sync +! use wideband_sync use timer_module, only: timer + type candidate + real :: snr !Relative S/N of sync detection + real :: f !Freq of sync tone, 0 to 96000 Hz + real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s + end type candidate + + parameter (NFFT=32768) + parameter (MAX_CANDIDATES=50) + parameter (MAXMSG=1000) !Size of decoded message list parameter (NSMAX=60*96000) complex cx(NSMAX/64) !Data at 1378.125 samples/s @@ -60,8 +69,8 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & idec=-1 call timer('q65b ',0) - call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & - mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & + call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & + mycall,hiscall,hisgrid,mode_q65,f0,fqso,nkhz_center,newdat, & nagain,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. diff --git a/q65w/libq65/synctest.f90 b/q65w/libq65/synctest.f90 deleted file mode 100644 index a710daa13..000000000 --- a/q65w/libq65/synctest.f90 +++ /dev/null @@ -1,57 +0,0 @@ -program synctest - - ! Program to test an algorithm for detecting sync signals for both - ! JT65 and Q65-60x signals and rejecting birdies in MAP65 data. - ! The important work is done in module wideband_sync. - - use timer_module, only: timer - use timer_impl, only: init_timer, fini_timer - use wideband_sync - - real ss(4,322,NFFT),savg(4,NFFT) -! real candidate(MAX_CANDIDATES,5) !snr1,f0,xdt0,ipol,flip - character*8 arg - type(candidate) :: cand(MAX_CANDIDATES) - - nargs=iargc() - if(nargs.ne.5) then - print*,'Usage: synctest iutc nfa nfb nts_jt65 nts_q65' - print*,'Example: synctest 1814 23 83 2 1' - go to 999 - endif - call getarg(1,arg) - read (arg,*) iutc - call getarg(2,arg) - read (arg,*) nfa - call getarg(3,arg) - read (arg,*) nfb - call getarg(4,arg) - read (arg,*) nts_jt65 - call getarg(5,arg) - read (arg,*) nts_q65 - - open(50,file='50.a',form='unformatted',status='old') - do ifile=1,9999 - read(50,end=998) nutc,npol,ss(1:npol,:,:),savg(1:npol,:) - if(nutc.eq.iutc) exit - enddo - close(50) - - call init_timer('timer.out') - call timer('synctest',0) - - call timer('get_cand',0) - call get_candidates(ss,savg,302,.true.,nfa,nfb,nts_jt65,nts_q65,cand,ncand) - call timer('get_cand',1) - - do k=1,ncand - write(*,1010) k,cand(k)%snr,cand(k)%f,cand(k)%f+77,cand(k)%xdt, & - cand(k)%ipol,cand(k)%iflip -1010 format(i3,4f10.3,2i3) - enddo - -998 call timer('synctest',1) - call timer('synctest',101) - call fini_timer() - -999 end program synctest diff --git a/q65w/libq65/wideband_sync.f90 b/q65w/libq65/wideband_sync.f90 deleted file mode 100644 index 45702e653..000000000 --- a/q65w/libq65/wideband_sync.f90 +++ /dev/null @@ -1,14 +0,0 @@ -module wideband_sync - - type candidate - real :: snr !Relative S/N of sync detection - real :: f !Freq of sync tone, 0 to 96000 Hz - real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s - end type candidate - - parameter (NFFT=32768) - parameter (MAX_CANDIDATES=50) - parameter (SNR1_THRESHOLD=4.5) - integer nkhz_center - -end module wideband_sync From 88cbc521bd534a6fc4d0d29b429e0eb4a633ed92 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 10:06:29 -0500 Subject: [PATCH 146/251] Code cleanup and documentation. --- q65w/libq65/decode0.f90 | 2 +- q65w/libq65/filbig.f90 | 2 +- q65w/libq65/getcand2.f90 | 40 +++++++++++++++++++++------------------- q65w/libq65/q65_sync.f90 | 14 ++++++++------ q65w/libq65/q65b.f90 | 11 ++++------- q65w/libq65/q65wa.f90 | 39 +++++++++++++-------------------------- 6 files changed, 48 insertions(+), 60 deletions(-) diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index c6771a1cc..22421ca31 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -43,7 +43,7 @@ subroutine decode0(dd,ss,savg) call timer('q65wa ',0) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & + mousedf,mousefqso,nagain,nfshift,max_drift, & nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & datetime,ndop00) call timer('q65wa ',1) diff --git a/q65w/libq65/filbig.f90 b/q65w/libq65/filbig.f90 index d7ac29080..5683eeb95 100644 --- a/q65w/libq65/filbig.f90 +++ b/q65w/libq65/filbig.f90 @@ -102,7 +102,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,c4a,n4) enddo do i=nh+1,nfft2 j=i0+i-1-nfft2 - if(j.lt.1) j=j+nfft1 !nfft1 was nfft2 + if(j.lt.1) j=j+nfft1 c4a(i)=rfilt(i)*ca(j) enddo diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 index 1971f54d8..b13adfd50 100644 --- a/q65w/libq65/getcand2.f90 +++ b/q65w/libq65/getcand2.f90 @@ -1,25 +1,25 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) -! use wideband_sync - +! Get candidates for Q65 decodes, based on presence of sync tone. + type candidate real :: snr !Relative S/N of sync detection real :: f !Freq of sync tone, 0 to 96000 Hz real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s end type candidate - parameter (NFFT=32768) + parameter (NFFT=32768) !FFTs done in symspec() parameter (MAX_CANDIDATES=50) - real ss(322,NFFT) - real savg0(NFFT),savg(NFFT) - integer ipk1(1) - logical sync_ok type(candidate) :: cand(MAX_CANDIDATES) + real ss(322,NFFT) !Symbol spectra + real savg0(NFFT),savg(NFFT) !Average spectra over whole Rx sequence + integer ipk1(1) !Peak index of local portion of spectrum + logical sync_ok !True if sync pattern is present data nseg/16/,npct/40/ - savg=savg0 + savg=savg0 !Save the original spectrum nlen=NFFT/nseg - do iseg=1,nseg + do iseg=1,nseg !Normalize spectrum with nearby baseline ja=(iseg-1)*nlen + 1 jb=ja + nlen - 1 call pctile(savg(ja),nlen,npct,base) @@ -28,22 +28,24 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) enddo df=96000.0/NFFT - bw=65*nts_q65*1.666666667 - nbw=bw/df + 1 - nb0=2*nts_q65 - smin=1.4 - nguard=5 + bw=65*nts_q65*1.666666667 !Bandwidth of Q65 signal + nbw=bw/df + 1 !Bandwidth in bins + nb0=2*nts_q65 !Range of peak search, in bins + smin=1.4 !First threshold + nguard=5 !Guard range in bins j=0 - do i=1,NFFT-nbw-nguard + do i=1,NFFT-nbw-nguard !Look for local peaks in average spectrum if(savg(i).lt.smin) cycle spk=maxval(savg(i:i+nb0)) ipk1=maxloc(savg(i:i+nb0)) - i0=ipk1(1) + i - 1 - fpk=0.001*i0*df + i0=ipk1(1) + i - 1 !Index of local peak in savg() + fpk=0.001*i0*df !Frequency of peak (kHz) ! Check to see if sync tone is present. call q65_sync(ss,i0,nts_q65,sync_ok,snr_sync,xdt) if(.not.sync_ok) cycle + +! Sync tone is present, we have a candidate for decoding j=j+1 cand(j)%f=fpk cand(j)%xdt=xdt @@ -51,9 +53,9 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) ia=min(i,i0-nguard) ib=i0+nbw+nguard savg(ia:ib)=0. - if(j.ge.30) exit + if(j.ge.MAX_CANDIDATES) exit enddo - ncand=j + ncand=j !Total number of candidates found return end subroutine getcand2 diff --git a/q65w/libq65/q65_sync.f90 b/q65w/libq65/q65_sync.f90 index bd5f9aa77..6fb5b3e03 100644 --- a/q65w/libq65/q65_sync.f90 +++ b/q65w/libq65/q65_sync.f90 @@ -1,9 +1,11 @@ subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) +! Test for presence of Q65 sync tone + parameter (NFFT=32768) parameter (LAGMAX=33) - real ss(322,NFFT) - real ccf(0:LAGMAX) + real ss(322,NFFT) !Symbol spectra + real ccf(0:LAGMAX) !The WSJT "blue curve", peak at DT logical sync_ok logical first integer isync(22),ipk(1) @@ -24,12 +26,12 @@ subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) m=nts_q65/2 ccf=0. - do lag=0,LAGMAX + do lag=0,LAGMAX !Search over range of DT do j=1,22 !Test for Q65 sync k=isync(j) + lag -! ccf=ccf + ss(k,i0) + ss(k+1,i0) + ss(k+2,i0) ccf(lag)=ccf(lag) + sum(ss(k,i0-m:i0+m)) + sum(ss(k+1,i0-m:i0+m)) & + sum(ss(k+2,i0-m:i0+m)) +! Q: Should we use weighted sums, perhaps a Lorentzian peak? enddo enddo ccfmax=maxval(ccf) @@ -40,7 +42,7 @@ subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) xsum=0. sq=0. nsum=0 - do i=0,lagmax + do i=0,lagmax !Compute ave and rms of "blue curve" if(abs(i-lagbest).gt.2) then xsum=xsum+ccf(i) sq=sq+ccf(i)**2 @@ -50,7 +52,7 @@ subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) ave=xsum/nsum rms=sqrt(sq/nsum - ave*ave) snr=(ccfmax-ave)/rms - sync_ok=snr.ge.5.0 + sync_ok=snr.ge.5.0 !Require snr > 5.0 for sync detection return end subroutine q65_sync diff --git a/q65w/libq65/q65b.f90 b/q65w/libq65/q65b.f90 index 9c8f330ec..61004492b 100644 --- a/q65w/libq65/q65b.f90 +++ b/q65w/libq65/q65b.f90 @@ -2,13 +2,12 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,nkhz_center, newdat,nagain, & max_drift,ndepth,datetime,ndop00,idec) -! This routine provides an interface between MAP65 and the Q65 decoder -! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. +! This routine provides an interface between Q65W and the Q65 decoder +! in WSJT-X. All arguments are input data obtained from the Q65W GUI. ! Raw Rx data are available as the 96 kHz complex spectrum ca(MAXFFT1) -! in common/cacb. Decoded messages are sent back to the GUI on stdout. +! in common/cacb. Decoded messages are sent back to the GUI. use q65_decode -! use wideband_sync use timer_module, only: timer parameter (MAXFFT1=5376000) !56*96000 @@ -16,7 +15,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & parameter (NMAX=60*12000) parameter (RAD=57.2957795) integer*2 iwave(60*12000) - complex ca(MAXFFT1) !FFTs of raw x,y data + complex ca(MAXFFT1) !FFT of raw I/Q data from Linrad complex cx(0:MAXFFT2-1),cz(0:MAXFFT2) real*8 fcenter,freq0,freq1 character*12 mycall0,hiscall0 @@ -64,10 +63,8 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ! (Hz) (Hz) (Hz) !---------------------------------------------------- ! 96000 5376000 0.017857143 336000 6000.000 -! 95238 5120000 0.018601172 322560 5999.994 cz(0:MAXFFT2-1)=cx - cz(MAXFFT2)=0. ! Roll off below 500 Hz and above 2500 Hz. ja=nint(500.0/df) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 09b757997..574cf613b 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,11 +1,9 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,max_drift, & - nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & - datetime,ndop00) + mousedf,mousefqso,nagain,nfshift,max_drift,nfcal,mycall, & + hiscall,hisgrid,nfsample,nmode,ndepth,datetime,ndop00) -! Processes timf2 data from Linrad to find and decode JT65 and Q65 signals. +! Processes timf2 data received from Linrad to find and decode Q65 signals. -! use wideband_sync use timer_module, only: timer type candidate @@ -14,27 +12,24 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & real :: xdt !DT of matching sync pattern, -1.0 to +4.0 s end type candidate - parameter (NFFT=32768) + parameter (NFFT=32768) !Size of FFTs done in symspec() parameter (MAX_CANDIDATES=50) - parameter (MAXMSG=1000) !Size of decoded message list parameter (NSMAX=60*96000) complex cx(NSMAX/64) !Data at 1378.125 samples/s - real dd(2,NSMAX) - real*4 ss(322,NFFT),savg(NFFT) - real*8 fcenter + real dd(2,NSMAX) !I/Q data from Linrad + real ss(322,NFFT) !Symbol spectra + real savg(NFFT) !Average spectrum + real*8 fcenter !Center RF frequency, MHz character mycall*12,hiscall*12,hisgrid*6 - logical bq65 - logical candec(MAX_CANDIDATES) type(candidate) :: cand(MAX_CANDIDATES) character*60 result character*20 datetime common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & nWTransmitting,result(50) - common/testcom/ifreq save - if(nagain.eq.1) ndepth=3 + if(nagain.eq.1) ndepth=3 !Use full depth for click-to-decode nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 @@ -42,40 +37,32 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nts_q65=2**(mode_q65-1) !Q65 tone separation factor call timer('get_cand',0) - call getcand2(ss,savg,nts_q65,cand,ncand) + call getcand2(ss,savg,nts_q65,cand,ncand) !Get a list of decoding candidates call timer('get_cand',1) - candec=.false. nwrite_q65=0 - bq65=mode_q65.gt.0 df=96000.0/NFFT !df = 96000/NFFT = 2.930 Hz if(nfsample.eq.95238) df=95238.1/NFFT ftol=0.010 !Frequency tolerance (kHz) - foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL + foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) - iloop=0 nqd=0 call timer('filbig ',0) - call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) + call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) !Do the full-length FFT call timer('filbig ',1) -! Do the wideband Q65 decode - do icand=1,ncand + do icand=1,ncand !Attempt to decode each candidate f0=cand(icand)%f - if(candec(icand)) cycle !Skip if already decoded freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) idec=-1 - call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,nkhz_center,newdat, & nagain,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) - if(idec.ge.0) candec(icand)=.true. enddo ! icand - ndecdone=2 return end subroutine q65wa From 90b49ddc0ae3d102720adc51df7ae19d40abf786 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 13:54:37 -0500 Subject: [PATCH 147/251] Don't save to a *.iq file if WSJT-X transmitted for 10 or more seconds. --- q65w/mainwindow.cpp | 18 ++++++++++++++---- q65w/mainwindow.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 404ce2c62..7f35e6750 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -352,7 +352,7 @@ void MainWindow::dataSink(int k) ndiskdat=0; datcom_.ndiskdat=0; } -// Get x and y power, polarized spectrum, nkhz, and ihsym +// Get power, spectrum, nkhz, and ihsym nb=0; if(m_NB) nb=1; nfsample=96000; @@ -427,13 +427,14 @@ void MainWindow::dataSink(int k) // qDebug() << "aa" << "Decoder called" << ihsym << ipc_wsjtx[0] << ipc_wsjtx[1] // << ipc_wsjtx[2] << ipc_wsjtx[3] << ipc_wsjtx[4] ; decode(); //Start the decoder - if(m_saveAll and !m_diskData) { + if(m_saveAll and !m_diskData and m_nTransmitted<10) { QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + t.time().toString("hhmm"); fname += ".iq"; *future2 = QtConcurrent::run(savetf2, fname, false); watcher2->setFuture(*future2); } + m_nTransmitted=0; } soundInThread.m_dataSinkBusy=false; @@ -984,8 +985,17 @@ void MainWindow::guiUpdate() } if(nsec != m_sec0) { //Once per second -// qDebug() << "AAA" << nsec%60 << ipc_wsjtx[3] << ipc_wsjtx[4]<< m_monitoring; -// qDebug() << "BBB" << nsec%60 << decodes_.ndecodes << m_fetched; + static int n60z=99; + int n60=nsec%60; + int itest[5]; + mem_q65w.lock(); + memcpy(&itest, (char*)ipc_wsjtx, 20); + mem_q65w.unlock(); + if(itest[4]==1) m_nTransmitted++; +// qDebug() << "AAA" << n60 << itest[0] << itest[1] << itest[2] << itest[3] << itest[4] +// << m_nTransmitted; + if(n6030.0) { lab2->setStyleSheet("QLabel{background-color: #ff0000}"); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 837581137..adce783d6 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -122,6 +122,7 @@ private: qint32 m_dB; qint32 m_fetched=0; qint32 m_hsymStop=302; + qint32 m_nTransmitted=0; double m_fAdd; double m_xavg; From 954d35bd52f1bed7f44386e1d2f5c5eda0c43ad0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 15:33:21 -0500 Subject: [PATCH 148/251] Send Q65W decodes to PSK Reporter, from WSJT-X. --- q65w/mainwindow.cpp | 3 +-- widgets/mainwindow.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 7f35e6750..2c8551b02 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -756,6 +756,7 @@ void MainWindow::decoderFinished() //diskWriteFinished ui->DecodeButton->setStyleSheet(""); decodeBusy(false); decodes_.nQDecoderDone=1; + if(m_diskData) decodes_.nQDecoderDone=2; mem_q65w.lock(); memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); mem_q65w.unlock(); @@ -763,8 +764,6 @@ void MainWindow::decoderFinished() //diskWriteFinished t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); lab3->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); -// float secToDecode=0.001*m_decoder_start_time.msecsTo(now); -// qDebug() << "bb" << "Decoder Finished" << t1 << secToDecode << now.toString("hh:mm:ss.z"); } void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d748f8931..0068190e9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -9236,6 +9236,16 @@ void MainWindow::readWidebandDecodes() m_EMECall[dxcall].worked=false; //### TEMPORARY ### if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; m_fetched++; + + Frequency frequency = (m_freqNominal/1000000) * 1000000 + int(fsked*1000.0); + bool bCQ=line.contains(" CQ "); + bool bFromDisk=q65wcom.nQDecoderDone==2; + if(!bFromDisk and (m_EMECall[dxcall].grid4.contains(grid_regexp) or bCQ)) { + qDebug() << "To PSKreporter:" << dxcall << m_EMECall[dxcall].grid4 << frequency << m_mode << nsnr; + if (!m_psk_Reporter.addRemoteStation (dxcall, m_EMECall[dxcall].grid4, frequency, m_mode, nsnr)) { + showStatusMessage (tr ("Spotting to PSK Reporter unavailable")); + } + } } // Update "m_wEMECall" by reading q65w_decodes.txt From 92d7f7c7de802d215ded8496e3f4b89de00ba7dd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 22 Dec 2022 15:44:38 -0500 Subject: [PATCH 149/251] Need to invoke m_psk_Reporter.sendReport(). --- widgets/mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 0068190e9..caeb57534 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -9248,6 +9248,10 @@ void MainWindow::readWidebandDecodes() } } + if (m_config.spot_to_psk_reporter ()) { + m_psk_Reporter.sendReport(); // Upload any queued spots + } + // Update "m_wEMECall" by reading q65w_decodes.txt QMap::iterator i; QString t=""; From bb8663dce0803efdc76e9ddc3eb55099462a6f88 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 24 Dec 2022 11:44:59 -0500 Subject: [PATCH 150/251] Don't change bands after user clicks on a line in the Active Stations window. --- widgets/mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index caeb57534..05abc1769 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3681,7 +3681,8 @@ void MainWindow::callSandP2(int n) QStringList w=m_ready2call[n].split(' ', SkipEmptyParts); if(m_mode=="Q65") { double kHz=w[0].toDouble(); - m_freqNominal=(1296*1000 + kHz)* 1000; + int nMHz=m_freqNominal/1000000; + m_freqNominal=(nMHz*1000 + kHz)* 1000; m_deCall=w[2]; m_deGrid=w[3]; m_txFirst=(w[4]=="0"); From ce8bc142f6173322d8fb4008eb83d3b3e3c5a570 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 28 Dec 2022 09:25:42 -0500 Subject: [PATCH 151/251] Don't call fast_config() after setting displayWidgets() when entering Q65 mode. It kills the T/R period spinner. --- widgets/mainwindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d748f8931..b922b86d9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7089,7 +7089,6 @@ void MainWindow::on_actionQ65_triggered() ui->rh_decodes_title_label->setText(tr ("Average Decodes")); ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); - fast_config(m_bFastMode); statusChanged(); m_specOp=m_config.special_op_id(); From 029977c6191f5f81129fb594e3c9dc0038fef810 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 31 Dec 2022 14:47:32 -0500 Subject: [PATCH 152/251] Increase the dimension of allmessages() to max of 200. --- 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 4bd637e95..a19d0b83c 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -59,7 +59,7 @@ contains integer*2 iwave(15*12000) integer apsym2(58),aph10(10) character datetime*13,msg37*37 - character*37 allmessages(100) + character*37 allmessages(200) character*12 ctime integer allsnrs(100) integer itone(NN) From dd243da82ad931b8d3031015d2b9e792fe6d169f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 2 Jan 2023 13:20:43 -0500 Subject: [PATCH 153/251] Don't attempt to decode if decoder is already busy, or if we transmitted for 10 s or more. --- q65w/mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2c8551b02..30e800dea 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -841,6 +841,10 @@ void MainWindow::freezeDecode(int n) //freezeDecode() void MainWindow::decode() //decode() { + +//Don't attempt to decode if decoder is already busy, or if we transmitted for 10 s or more. + if(m_decoderBusy or m_nTransmitted>10) return; + QString fname=" "; ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); From 53bbf4bf23877fcf56281bdd706b4cc7ed0413ce Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 2 Jan 2023 13:21:42 -0500 Subject: [PATCH 154/251] Protect against possible bounds error in q65_sync.f90. --- q65w/libq65/q65_sync.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/q65w/libq65/q65_sync.f90 b/q65w/libq65/q65_sync.f90 index 6fb5b3e03..06caffd74 100644 --- a/q65w/libq65/q65_sync.f90 +++ b/q65w/libq65/q65_sync.f90 @@ -25,12 +25,14 @@ subroutine q65_sync(ss,i0,nts_q65,sync_ok,snr,xdt) endif m=nts_q65/2 + i1=max(1,i0-m) + i2=min(NFFT,i0+m) ccf=0. do lag=0,LAGMAX !Search over range of DT do j=1,22 !Test for Q65 sync k=isync(j) + lag - ccf(lag)=ccf(lag) + sum(ss(k,i0-m:i0+m)) + sum(ss(k+1,i0-m:i0+m)) & - + sum(ss(k+2,i0-m:i0+m)) + ccf(lag)=ccf(lag) + sum(ss(k,i1:i2)) + sum(ss(k+1,i1:i2)) & + + sum(ss(k+2,i1:i2)) ! Q: Should we use weighted sums, perhaps a Lorentzian peak? enddo enddo From c0d327b4befce5cbd108dd2f1a57b66e59adcc09 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 2 Jan 2023 13:22:40 -0500 Subject: [PATCH 155/251] Decoder now bails out if its busy for more than 30 s. --- q65w/libq65/q65wa.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 574cf613b..778d72792 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -29,6 +29,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & nWTransmitting,result(50) save + tsec0=sec_midn() if(nagain.eq.1) ndepth=3 !Use full depth for click-to-decode nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 @@ -62,6 +63,8 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,nkhz_center,newdat, & nagain,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) + tsec=sec_midn() - tsec0 + if(tsec.gt.30.0) exit !Don't start another decode attempt after t=30 s. enddo ! icand return From 3b0e2edb755616efb6fe71bd396e490076dcc470 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 2 Jan 2023 13:48:08 -0500 Subject: [PATCH 156/251] Blank line between minutes for Q65W decodes. --- q65w/mainwindow.cpp | 5 +++++ q65w/mainwindow.h | 1 + 2 files changed, 6 insertions(+) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 30e800dea..2d1561f4a 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -982,6 +982,11 @@ void MainWindow::guiUpdate() if(decodes_.ndecodes > m_fetched) { while(m_fetcheddecodedTextBrowser->append(t1.repeated(46)); + } + m_UTC0=t.left(4); ui->decodedTextBrowser->append(t.trimmed()); m_fetched++; } diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index adce783d6..d5e79393f 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -182,6 +182,7 @@ private: QString m_palette; QString m_dateTime; QString m_mode; + QString m_UTC0=""; QHash m_worked; From fc040d435a8217fea77f39b513bce685846cd1f9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 4 Jan 2023 12:02:10 -0500 Subject: [PATCH 157/251] Sort out some stuff having to do with multiple decodes in Q65 mode. --- lib/q65_decode.f90 | 16 +++++++++++-- lib/qra/q65/q65.f90 | 57 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 515cdab6e..0834395bb 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -70,6 +70,7 @@ contains character*80 fmt integer*2 iwave(NMAX) !Raw data real, allocatable :: dd(:) !Raw data + real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) logical lclearave,lnewdat0,lapcqonly,unpk77_success @@ -83,8 +84,13 @@ contains call sec0(0,tdecode) ndecodes=0 decodes=' ' + f0decodes=0. nfa=nfa0 nfb=nfb0 + if(single_decode) then + nfa=nfqso-ntol + nfb=nfqso+ntol + endif nqd=nqd0 lnewdat=lnewdat0 max_drift=max_drift0 @@ -169,8 +175,6 @@ 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',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 @@ -280,6 +284,7 @@ contains if(idupe.eq.0) then ndecodes=min(ndecodes+1,100) decodes(ndecodes)=decoded + f0decodes(ndecodes)=f0dec call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & @@ -317,6 +322,10 @@ contains snr1=candidates(icand,1) xdt= candidates(icand,2) f0 = candidates(icand,3) + do i=1,ndecodes + fdiff=f0-f0decodes(i) + if(fdiff.gt.-baud*mode_q65 .and. fdiff.lt.65*baud*mode_q65) go to 800 + enddo jpk0=(xdt+1.0)*6000 !Index of nominal start of signal if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000 !For shortest sequences if(jpk0.lt.0) jpk0=0 @@ -365,6 +374,7 @@ contains if(idupe.eq.0) then ndecodes=min(ndecodes+1,100) decodes(ndecodes)=decoded + f0decodes(ndecodes)=f0dec call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & @@ -373,6 +383,7 @@ contains if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg call sec0(1,tdecode) + ios=1 ! open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown',& ! position='append',iostat=ios) if(ios.eq.0) then @@ -394,6 +405,7 @@ contains endif endif endif +800 continue enddo ! icand if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50 900 return diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index aa104bbfc..fa548e18f 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -148,15 +148,15 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ii1=max(1,i0-64) ii2=i0-65+LL call pctile(s1(ii1:ii2,1:jz),ii2-ii1+1*jz,45,base) - s1=s1/base +! s1=s1/base s1raw=s1 ! Apply fast AGC to the symbol spectra - s1max=20.0 !Empirical choice - do j=1,jz !### Maybe wrong way? ### - smax=maxval(s1(ii1:ii2,j)) - if(smax.gt.s1max) s1(ii1:ii2,j)=s1(ii1:ii2,j)*s1max/smax - enddo +! s1max=20.0 !Empirical choice +! do j=1,jz !### Maybe wrong way? ### +! smax=maxval(s1(ii1:ii2,j)) +! if(smax.gt.s1max) s1(ii1:ii2,j)=s1(ii1:ii2,j)*s1max/smax +! enddo dat4=0 if(ncw.gt.0 .and. iavg.le.1) then @@ -219,7 +219,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & width=df*(i2-i1) if(ncw.eq.0) ccf1=0. call q65_write_red(iz,xdt,ccf2_avg,ccf2) !### Need this call for WSJT-X - + if(idec.lt.0 .and. (iavg.eq.0 .or. iavg.eq.2)) then call q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) endif @@ -489,11 +489,14 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & real ccf2(iz) !Orange sync curve real, allocatable :: xdt2(:) real, allocatable :: s1avg(:) + real, allocatable :: ccf_lag(:) integer, allocatable :: indx(:) + integer ipk1(1) allocate(xdt2(iz)) allocate(s1avg(iz)) allocate(indx(iz)) + allocate(ccf_lag(lag1:lag2)) ia=max(nfa,100)/df ib=min(nfb,4900)/df @@ -507,12 +510,15 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & s1avg(i)=sum(s1(i,1:jz)) enddo + call pctile(s1avg(ia:ib),ib-ia+1,40,base0) ccfbest=0. ibest=0 lagpk=0 lagbest=0 idrift_best=0 do i=ia,ib + stest=s1avg(i)/(1.015*base0) + if(stest.lt.1.4) cycle ccfmax=0. do lag=lag1,lag2 do idrift=-max_drift,max_drift @@ -533,6 +539,40 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & endif enddo ! idrift enddo ! lag + +! Look at SNR on the "blue curve" + idrift=idrift_max + do lag=lag1,lag2 + ccft=0. + do kk=1,22 + k=isync(kk) + ii=i + nint(idrift*(k-43)/85.0) + if(ii.lt.1 .or. ii.gt.iz) cycle + n=NSTEP*(k-1) + 1 + j=n+lag+j0 + if(j.ge.1 .and. j.le.jz) ccft=ccft + s1(ii,j) + enddo ! kk + ccf_lag(lag)=ccft - (22.0/jz)*s1avg(i) + enddo + + pk=maxval(ccf_lag) + ipk1=maxloc(ccf_lag) + lag0=ipk1(1)-1+lag1 + xsum=0. + sq=0. + nsum=0 + do j=lag1,lag2 + if(abs(j-lag0).gt.7) then + xsum=xsum+ccf_lag(j) + sq=sq+ccf_lag(j)**2 + nsum=nsum+1 + endif + enddo + ave=xsum/nsum + rms=sqrt(sq/nsum - ave*ave) + snr=(pk-ave)/rms + if(snr.lt.5.0) cycle !Blue SNR must be at least 5 + ccf2(i)=ccfmax xdt2(i)=lagpk*dtstep if(ccfmax.gt.ccfbest .and. abs(i*df-nfqso).le.ftol) then @@ -554,8 +594,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & ! Save parameters for best candidates jzz=ib-ia+1 - call pctile(ccf2(ia:ib),jzz,40,base) - ccf2=ccf2/base call indexx(ccf2(ia:ib),jzz,indx) ncand=0 maxcand=20 @@ -563,7 +601,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & k=jzz-j+1 if(k.lt.1 .or. k.gt.iz) cycle i=indx(k)+ia-1 - if(ccf2(i).lt.3.3) exit !Candidate limit f=i*df i3=max(1, i-mode_q65) i4=min(iz,i+mode_q65) From 8f159db05681ebbdc296d1aeb62fd6439b7d4f5a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 4 Jan 2023 14:49:22 -0500 Subject: [PATCH 158/251] Don't do the "stest" cycle when decoding for Q65W. --- lib/qra/q65/q65.f90 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index fa548e18f..9619a03f7 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -516,9 +516,14 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & lagpk=0 lagbest=0 idrift_best=0 + stest_min=1.4 + +! Special case for Q65W: + if(nfa.eq.990 .and. nfb.eq.1010 .and. nfqso.eq.1000) stest_min=0.0 + do i=ia,ib - stest=s1avg(i)/(1.015*base0) - if(stest.lt.1.4) cycle + stest=s1avg(i)/base0 + if(stest.lt.stest_min) cycle ccfmax=0. do lag=lag1,lag2 do idrift=-max_drift,max_drift From 9ec349dd26ac4b7254d5a99b213228b6fffa7506 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 9 Jan 2023 11:56:14 -0500 Subject: [PATCH 159/251] Bump version number for map65 branch to 2.6.2. Maybe temporary use of this number. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2fea8422..9b816b809 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if (POLICY CMP0075) endif () project (wsjtx - VERSION 2.6.1.0 + VERSION 2.6.2.0 LANGUAGES C CXX Fortran ) set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") From 0bf8193601200a62af784a3f9b2a7f5ce054d643 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 12 Jan 2023 15:25:17 -0500 Subject: [PATCH 160/251] Correct several flaws in the way Q65 sync curves orange (current) and red (avg) are plotted. --- lib/qra/q65/q65.f90 | 25 +++++++++++++++++-------- widgets/plotter.cpp | 15 ++++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 9619a03f7..6dd12142e 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -21,8 +21,8 @@ module q65 real, allocatable :: s1(:,:) !Symbol spectra w/suppressed peaks real, allocatable :: s1w(:,:) !Symbol spectra w/suppressed peaks !w3sz added real, allocatable,save :: s1a(:,:,:) !Cumulative symbol spectra - real, allocatable,save :: ccf2(:) !Max CCF(freq) at any lag, single seq - real, allocatable,save :: ccf2_avg(:) !Like ccf2, but for accumulated average + real, allocatable,save :: ccf2(:) !Max CCF(freq) at any lag (orange curve) + real, allocatable,save :: ccf2_avg(:) !Like ccf2, but for avg (red curve) real sync(85) !sync vector real df,dtstep,dtdec,f0dec,ftol,plog,drift @@ -126,7 +126,10 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & lclearave=.false. endif ccf1=0. - if(iavg.eq.0) ccf2_avg=0. + if(iavg.eq.0) then + ccf2=0. + ccf2_avg=0. + endif dtstep=nsps/(NSTEP*12000.0) !Step size in seconds lag1=-1.0/dtstep lag2=1.0/dtstep + 0.9999 @@ -714,12 +717,18 @@ subroutine q65_write_red(iz,xdt,ccf2_avg,ccf2) rewind 17 write(17,1000) xdt,minval(ccf2_avg),maxval(ccf2_avg) - do i=max(1,nint(nfa/df)),min(iz,int(nfb/df)) + i1=max(1,nint(nfa/df)) + i2=min(iz,int(nfb/df)) + y0=minval(ccf2(i1:i2)) + y0_avg=minval(ccf2_avg(i1:i2)) + g=1.0/(maxval(ccf2(i1:i2))-y0) + g_avg=0. + if(maxval(ccf2_avg(i1:i2)).ne.y0_avg) g_avg=1.0/(maxval(ccf2_avg(i1:i2))-y0_avg) + + do i=i1,i2 freq=i*df - y1=ccf2_avg(i) - if(y1.gt.10.0) y1=10.0 + 2.0*log10(y1/10.0) - y2=ccf2(i) - if(y2.gt.10.0) y2=10.0 + 2.0*log10(y2/10.0) + y1=g_avg*(ccf2_avg(i)-y0_avg) + y2=g*(ccf2(i)-y0) write(17,1000) freq,y1,y2 1000 format(3f10.3) enddo diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index da211a228..f9dc521d9 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -280,27 +280,28 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed) painter2D.drawText(x1-4,y,"73"); } - if(bRed and m_bQ65_Sync) { //Plot the Q65 red/orange sync curves + if(bRed and m_bQ65_Sync) { //Plot the Q65 orange (current) and red (average) sync curves int k=0; int k2=0; std::ifstream f; f.open(m_redFile.toLatin1()); if(f) { int x,y; - float freq,xdt,smin,smax,sync,sync2; + float freq,xdt,smin,smax,sync_avg,sync_current; f >> xdt >> smin >> smax; if(f) { for(int i=0; i<99999; i++) { - f >> freq >> sync >> sync2; + f >> freq >> sync_avg >> sync_current; if(!f or f.eof() or k>=MAX_SCREENSIZE or k2>=MAX_SCREENSIZE) break; x=XfromFreq(freq); - if(sync > -99.0 and (smin!=0.0 or smax != 0.0)) { - y=m_h2*(0.9 - 0.09*gain2d*sync) - m_plot2dZero - 10; - LineBuf2[k2].setX(x); //Red sync curve + // Plot the red curve only if we have averaged 2 or more Rx sequences. + if(sync_avg > -99.0 and (smin!=0.0 or smax != 0.0)) { + y=m_h2*(0.9 - 0.09*gain2d*gain2d*sync_avg) - m_plot2dZero - 10; + LineBuf2[k2].setX(x); //Red sync curve (average) LineBuf2[k2].setY(y); k2++; } - y=m_h2*(0.9 - 0.09*gain2d*sync2) - m_plot2dZero; + y=m_h2*(0.9 - 0.09*gain2d*gain2d*sync_current) - m_plot2dZero; LineBuf3[k].setX(x); //Orange sync curve LineBuf3[k].setY(y); k++; From 5ea9296944c23975d829327d7ca0f2499fdd0a54 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 13 Jan 2023 14:20:17 -0500 Subject: [PATCH 161/251] WIP on q65 decoder. A good place to commit, for now. --- lib/qra/q65/q65.f90 | 48 +++++---------------------------------------- 1 file changed, 5 insertions(+), 43 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 6dd12142e..fc7e0c06b 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -138,11 +138,12 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & if(nsps.ge.7200) j0=1.0/dtstep !Nominal start-signal index s3=0. - if(iavg.eq.0) then + if(iavg.eq.0 .and. lnewdat) then call timer('q65_syms',0) ! Compute symbol spectra with NSTEP time bins per symbol call q65_symspec(iwave,ntrperiod*12000,iz,jz,s1) call timer('q65_syms',1) + lnewdat=.false. else s1=s1a(:,:,iseq) endif @@ -492,14 +493,12 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & real ccf2(iz) !Orange sync curve real, allocatable :: xdt2(:) real, allocatable :: s1avg(:) - real, allocatable :: ccf_lag(:) integer, allocatable :: indx(:) integer ipk1(1) allocate(xdt2(iz)) allocate(s1avg(iz)) allocate(indx(iz)) - allocate(ccf_lag(lag1:lag2)) ia=max(nfa,100)/df ib=min(nfb,4900)/df @@ -519,14 +518,8 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & lagpk=0 lagbest=0 idrift_best=0 - stest_min=1.4 - -! Special case for Q65W: - if(nfa.eq.990 .and. nfb.eq.1010 .and. nfqso.eq.1000) stest_min=0.0 do i=ia,ib - stest=s1avg(i)/base0 - if(stest.lt.stest_min) cycle ccfmax=0. do lag=lag1,lag2 do idrift=-max_drift,max_drift @@ -548,43 +541,12 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & enddo ! idrift enddo ! lag -! Look at SNR on the "blue curve" - idrift=idrift_max - do lag=lag1,lag2 - ccft=0. - do kk=1,22 - k=isync(kk) - ii=i + nint(idrift*(k-43)/85.0) - if(ii.lt.1 .or. ii.gt.iz) cycle - n=NSTEP*(k-1) + 1 - j=n+lag+j0 - if(j.ge.1 .and. j.le.jz) ccft=ccft + s1(ii,j) - enddo ! kk - ccf_lag(lag)=ccft - (22.0/jz)*s1avg(i) - enddo - - pk=maxval(ccf_lag) - ipk1=maxloc(ccf_lag) - lag0=ipk1(1)-1+lag1 - xsum=0. - sq=0. - nsum=0 - do j=lag1,lag2 - if(abs(j-lag0).gt.7) then - xsum=xsum+ccf_lag(j) - sq=sq+ccf_lag(j)**2 - nsum=nsum+1 - endif - enddo - ave=xsum/nsum - rms=sqrt(sq/nsum - ave*ave) - snr=(pk-ave)/rms - if(snr.lt.5.0) cycle !Blue SNR must be at least 5 - ccf2(i)=ccfmax xdt2(i)=lagpk*dtstep + if(ccfmax.gt.ccfbest .and. abs(i*df-nfqso).le.ftol) then ccfbest=ccfmax + snrbest=snr ibest=i lagbest=lagpk idrift_best=idrift_max @@ -730,7 +692,7 @@ subroutine q65_write_red(iz,xdt,ccf2_avg,ccf2) y1=g_avg*(ccf2_avg(i)-y0_avg) y2=g*(ccf2(i)-y0) write(17,1000) freq,y1,y2 -1000 format(3f10.3) +1000 format(f10.3,2f15.6) enddo flush(17) From 19182d305988e9614d5b72e0f94847709b157e4a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 14 Jan 2023 13:20:13 -0500 Subject: [PATCH 162/251] Add manual selection of offsets for pointing corrections. --- q65w/astro.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/q65w/astro.cpp b/q65w/astro.cpp index 38c45857b..65b6519d9 100644 --- a/q65w/astro.cpp +++ b/q65w/astro.cpp @@ -118,8 +118,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, elOffset = +ui->sbOffset->value(); ui->rb6->setChecked(true); } - } - if(ui->cbOnOff->isChecked()) { + } else if(ui->cbOnOff->isChecked()) { iCycle=(t.currentSecsSinceEpoch()%(2*nDwell))/nDwell + 1; if(iCycle==1) { azOffset = -ui->sbOffset->value()/cos(elsun/rad); @@ -128,6 +127,11 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, if(iCycle==2) { ui->rb2->setChecked(true); } + } else { + if(ui->rb1->isChecked()) azOffset = -ui->sbOffset->value()/cos(elsun/rad); + if(ui->rb3->isChecked()) azOffset = ui->sbOffset->value()/cos(elsun/rad); + if(ui->rb4->isChecked()) elOffset = -ui->sbOffset->value(); + if(ui->rb6->isChecked()) elOffset = ui->sbOffset->value(); } if(ui->cbAutoCycle->isChecked() or ui->cbOnOff->isChecked()) { QFile f("pointing.out"); @@ -148,6 +152,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, // Write pointing data to azel.dat QString fname=azelDir+"/azel.dat"; +// qDebug() << "aa" << fname << isec << bPointing << azOffset << elOffset; QFile f(fname); if(!f.open(QIODevice::WriteOnly | QIODevice::Text)) { if(azelDir==m_AzElDir0) return; From 4dd8dd456f4501f535efb462cd49c6d0d0035f77 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 16 Jan 2023 12:36:33 -0500 Subject: [PATCH 163/251] Don't reset newdat=0 in libq65/filbig.f90 !! --- q65w/libq65/filbig.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q65w/libq65/filbig.f90 b/q65w/libq65/filbig.f90 index 5683eeb95..4a265d2df 100644 --- a/q65w/libq65/filbig.f90 +++ b/q65w/libq65/filbig.f90 @@ -84,7 +84,7 @@ subroutine filbig(dd,nmax,f0,newdat,nfsample,c4a,n4) call timer('FFTbig ',0) call sfftw_execute(plan1) call timer('FFTbig ',1) - newdat=0 +!### newdat=0 endif ! NB: f0 is the frequency at which we want our filter centered. From f4475740c1ed852287f101198e3256c6e6ba9df0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 16 Jan 2023 14:56:33 -0500 Subject: [PATCH 164/251] Temporary debugging statements to help tracing problem with nagain=1 decodes. --- q65w/getfile.cpp | 1 + q65w/libq65/q65c.f90 | 16 ++++++++++++---- q65w/mainwindow.cpp | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index edbae0337..df6a637a7 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -26,6 +26,7 @@ void getfile(QString fname, bool xpol, int dbDgrd) n = fread(id,2,npts,fp); Q_UNUSED (n); int j=0; + qDebug() << "aaa" << datcom_.fcenter; if(dbDgrd<0) { for(int i=0; i Date: Mon, 16 Jan 2023 17:45:14 -0500 Subject: [PATCH 165/251] Multi-decodes and nagain decodes now basically functional. Needs cleanup! --- q65w/commons.h | 4 ++-- q65w/libq65/decode0.f90 | 4 ++-- q65w/libq65/q65c.f90 | 21 +++++++++------------ q65w/libq65/q65wa.f90 | 9 +++++++-- q65w/mainwindow.cpp | 10 ++-------- q65w/mainwindow.h | 3 +-- q65w/soundin.cpp | 2 +- 7 files changed, 24 insertions(+), 29 deletions(-) diff --git a/q65w/commons.h b/q65w/commons.h index c5244be57..26cc2d7ca 100644 --- a/q65w/commons.h +++ b/q65w/commons.h @@ -11,7 +11,7 @@ extern struct { //This is "common/datcom/..." in Fortran float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM - int idphi; //Phase correction for Y pol'n, degrees + float fselected; //Selected frequency for nagain decodes int mousedf; //User-selected DF int mousefqso; //User-selected QSO freq (kHz) int nagain; //1 ==> decode only at fQSO +/- Tol @@ -50,7 +50,7 @@ extern struct { //This is "common/datcom/..." in Fortran float savg[NFFT]; //Avg spectra at 0,45,90,135 deg pol double fcenter; //Center freq from Linrad (MHz) int nutc; //UTC as integer, HHMM - int idphi; //Phase correction for Y pol'n, degrees + float fselected; //Selected frequency for nagain decodes int mousedf; //User-selected DF int mousefqso; //User-selected QSO freq (kHz) int nagain; //1 ==> decode only at fQSO +/- Tol diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 22421ca31..058472890 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -11,7 +11,7 @@ subroutine decode0(dd,ss,savg) character*60 result common/decodes/ndecodes,ncand,nQDecoderDone,nWDecoderBusy, & nWTransmitting,result(50) - common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + common/npar/fcenter,nutc,fselected,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid,datetime @@ -45,7 +45,7 @@ subroutine decode0(dd,ss,savg) call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,nfshift,max_drift, & nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & - datetime,ndop00) + datetime,ndop00,fselected) call timer('q65wa ',1) return diff --git a/q65w/libq65/q65c.f90 b/q65w/libq65/q65c.f90 index d37a751a9..8a6f550e5 100644 --- a/q65w/libq65/q65c.f90 +++ b/q65w/libq65/q65c.f90 @@ -19,7 +19,7 @@ subroutine q65c(itimer) common/datcom2/dd(2,5760000),ss(322,NFFT),savg(NFFT),nparams0 !### REMEMBER that /npar/ is not updated until nparams=nparams0 is executed. ### - common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & + common/npar/fcenter,nutc,fselected,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & ndop00,nsave,max_drift,nhsym,mycall,mygrid,hiscall,hisgrid, & @@ -35,21 +35,18 @@ subroutine q65c(itimer) return endif -! newdat=1 -! nagain=0 - write(*,3001) 'aa',newdat,nagain,nfa,nfb,ntol -3001 format(a2,5i6) - datetime(18:20)=':00' npatience=1 -! if(newdat.eq.0 .and. nagain.eq.1) then -! nfa=nint(mousefqso+0.001*mousedf) - 1 !Minimal solution for -! nfb=nint(mousefqso+0.001*mousedf) + 1 !double-click decodes -! newdat=1 + if(nagain.eq.1) then +! nfa=127 +! nfb=128 + newdat=1 ! nagain=0 -! endif - write(*,3001) 'bb',newdat,nagain,nfa,nfb,ntol + endif + write(*,3001) 'aa',newdat,nagain,nfa,nfb,ntol,fselected +3001 format(a2,5i6,f10.3) + write(*,3001) 'bb',newdat,nagain,nfa,nfb,ntol,fselected call timer('decode0 ',0) call decode0(dd,ss,savg) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 778d72792..6c5d3e406 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -1,6 +1,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,nfshift,max_drift,nfcal,mycall, & - hiscall,hisgrid,nfsample,nmode,ndepth,datetime,ndop00) + hiscall,hisgrid,nfsample,nmode,ndepth,datetime,ndop00,fselected) ! Processes timf2 data received from Linrad to find and decode Q65 signals. @@ -55,13 +55,18 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & do icand=1,ncand !Attempt to decode each candidate f0=cand(icand)%f +! if(f0-mfa.lt.0.0 .or. f0-mfb.gt.0.0) cycle + print*,'cc',nagain,ntol,fselected,f0+nkhz_center-48.0 + if(nagain.eq.1 .and. abs(f0+nkhz_center-48.0 - fselected).gt.0.001*ntol) cycle + nagain2=0 + print*,'dd',nagain,ntol,fselected,f0+nkhz_center-48.0 freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) idec=-1 call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall,hiscall,hisgrid,mode_q65,f0,fqso,nkhz_center,newdat, & - nagain,max_drift,ndepth,datetime,ndop00,idec) + nagain2,max_drift,ndepth,datetime,ndop00,idec) call timer('q65b ',1) tsec=sec_midn() - tsec0 if(tsec.gt.30.0) exit !Don't start another decode attempt after t=30 s. diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 39abd4700..70ced7083 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -229,7 +229,6 @@ void MainWindow::writeSettings() settings.setValue("SaveDir",m_saveDir); settings.setValue("AzElDir",m_azelDir); settings.setValue("Timeout",m_timeout); - settings.setValue("dPhi",m_dPhi); settings.setValue("Fcal",m_fCal); settings.setValue("Fadd",m_fAdd); settings.setValue("NetworkInput", m_network); @@ -277,7 +276,6 @@ void MainWindow::readSettings() m_saveDir=settings.value("SaveDir",m_appDir + "/save").toString(); m_azelDir=settings.value("AzElDir",m_appDir).toString(); m_timeout=settings.value("Timeout",20).toInt(); - m_dPhi=settings.value("dPhi",0).toInt(); m_fCal=settings.value("Fcal",0).toInt(); m_fAdd=settings.value("FAdd",0).toDouble(); soundInThread.setFadd(m_fAdd); @@ -456,7 +454,6 @@ void MainWindow::on_actionSettings_triggered() dlg.m_saveDir=m_saveDir; dlg.m_azelDir=m_azelDir; dlg.m_timeout=m_timeout; - dlg.m_dPhi=m_dPhi; dlg.m_fCal=m_fCal; dlg.m_fAdd=m_fAdd; dlg.m_network=m_network; @@ -474,7 +471,6 @@ void MainWindow::on_actionSettings_triggered() m_saveDir=dlg.m_saveDir; m_azelDir=dlg.m_azelDir; m_timeout=dlg.m_timeout; - m_dPhi=dlg.m_dPhi; m_fCal=dlg.m_fCal; m_fAdd=dlg.m_fAdd; m_wide_graph_window->setFcal(m_fCal); @@ -841,10 +837,8 @@ void MainWindow::freezeDecode(int n) //freezeDecode() void MainWindow::decode() //decode() { - //Don't attempt to decode if decoder is already busy, or if we transmitted for 10 s or more. if(m_decoderBusy or m_nTransmitted>10) return; - QString fname=" "; ui->DecodeButton->setStyleSheet(m_pbdecoding_style1); @@ -856,9 +850,9 @@ void MainWindow::decode() //decode() datcom_.nutc=100*ihr + imin; } - datcom_.idphi=m_dPhi; datcom_.mousedf=m_wide_graph_window->DF(); datcom_.mousefqso=m_wide_graph_window->QSOfreq(); + datcom_.fselected=datcom_.mousefqso + 0.001*datcom_.mousedf; datcom_.ndepth=m_ndepth+1; datcom_.ndiskdat=0; if(m_diskData) { @@ -891,7 +885,7 @@ void MainWindow::decode() //decode() datcom_.nfa=nfa; datcom_.nfb=nfb; - qDebug() << "bbb" << datcom_.fcenter << datcom_.nfa << datcom_.nfb; + qDebug() << "bbb" << datcom_.fcenter << datcom_.nfa << datcom_.nfb << datcom_.fselected; datcom_.nfcal=m_fCal; datcom_.nfshift=nfshift; datcom_.mcall3=0; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index d5e79393f..84abc349f 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -103,7 +103,6 @@ private: qint32 m_QSOfreq0; qint32 m_astroFont; qint32 m_timeout; - qint32 m_dPhi; qint32 m_fCal; qint32 m_txFreq; qint32 m_setftx; @@ -130,7 +129,7 @@ private: bool m_monitoring; bool m_diskData; bool m_loopall; - bool m_decoderBusy; + bool m_decoderBusy=false; bool m_restart; bool m_call3Modified; bool m_startAnother; diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index cc854424f..54fbc5955 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -19,7 +19,7 @@ extern "C" float savg[NFFT]; double fcenter; int nutc; - int idphi; //Phase correction for Y pol'n, degrees + float fselected; //Selected frequency for nagain decodes int mousedf; //User-selected DF int mousefqso; //User-selected QSO freq (kHz) int nagain; //1 ==> decode only at fQSO +/- Tol From af04310f9369ca0eac27d65e7b5874f26714cd33 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 16 Jan 2023 18:51:57 -0500 Subject: [PATCH 166/251] Remove some diagnostic write statements. Still needs cleanup! --- q65w/getfile.cpp | 2 +- q65w/libq65/q65c.f90 | 13 ++++--------- q65w/libq65/q65wa.f90 | 4 ++-- q65w/mainwindow.cpp | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index df6a637a7..f06d7c03d 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -26,7 +26,7 @@ void getfile(QString fname, bool xpol, int dbDgrd) n = fread(id,2,npts,fp); Q_UNUSED (n); int j=0; - qDebug() << "aaa" << datcom_.fcenter; +// qDebug() << "aaa" << datcom_.fcenter; if(dbDgrd<0) { for(int i=0; i Date: Tue, 17 Jan 2023 09:06:49 -0500 Subject: [PATCH 167/251] Remove obsolete comments. --- q65w/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 2718ee986..eab959877 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -808,7 +808,7 @@ void MainWindow::on_actionSave_all_triggered() //Save All { m_saveAll=true; } - //Display list of keyboard shortcuts //Display list of mouse commands //Diaplay list of Add-On pfx/sfx + void MainWindow::on_DecodeButton_clicked() //Decode request { if(!m_decoderBusy) { From 21ef0c9d30f995293716090e6fcae55ec988c816 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 17 Jan 2023 10:20:56 -0500 Subject: [PATCH 168/251] Activate q65_decodes.txt for diagnostic and optimization purposes. --- lib/q65_decode.f90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 0834395bb..3b9a714c7 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -293,8 +293,8 @@ contains 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) + open(22,file=trim(data_dir)//'/q65_decodes.txt',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 @@ -307,10 +307,10 @@ contains '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) + 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 @@ -384,8 +384,8 @@ contains int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg call sec0(1,tdecode) ios=1 -! open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown',& -! position='append',iostat=ios) + open(22,file=trim(data_dir)//'/q65_decodes.txt',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 @@ -398,10 +398,10 @@ contains '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) + 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 From 33a836242c4736b5f555471ead971666f1420595 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 17 Jan 2023 12:06:47 -0500 Subject: [PATCH 169/251] Fix a newdat/nagain problem. This seems to make both WSJT-X and Q65W behave correctly, but the code needs cleanup. --- lib/qra/q65/q65.f90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index fc7e0c06b..5baff4af1 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -138,12 +138,13 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & if(nsps.ge.7200) j0=1.0/dtstep !Nominal start-signal index s3=0. - if(iavg.eq.0 .and. lnewdat) then +! if(iavg.eq.0 .and. lnewdat) then + if(iavg.eq.0) then call timer('q65_syms',0) ! Compute symbol spectra with NSTEP time bins per symbol call q65_symspec(iwave,ntrperiod*12000,iz,jz,s1) call timer('q65_syms',1) - lnewdat=.false. +! lnewdat=.false. else s1=s1a(:,:,iseq) endif From 2992a37ae1fb526e3496743dc3b3d81d0ae00f4a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 17 Jan 2023 15:06:40 -0500 Subject: [PATCH 170/251] Plot the whole Orange Sync Curve, even if Single Decode is checked. --- lib/q65_decode.f90 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 3b9a714c7..4e7558739 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -87,10 +87,6 @@ contains f0decodes=0. nfa=nfa0 nfb=nfb0 - if(single_decode) then - nfa=nfqso-ntol - nfb=nfqso+ntol - endif nqd=nqd0 lnewdat=lnewdat0 max_drift=max_drift0 From 824478697b1923ce5abf5272ebc219753a49fd8f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 19 Jan 2023 11:53:52 -0500 Subject: [PATCH 171/251] Allow click-to-decode for overlapping signals that are otherwise missed. --- q65w/libq65/getcand2.f90 | 10 ++++++++-- q65w/libq65/q65wa.f90 | 10 ++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 index b13adfd50..f6b03b690 100644 --- a/q65w/libq65/getcand2.f90 +++ b/q65w/libq65/getcand2.f90 @@ -1,4 +1,4 @@ -subroutine getcand2(ss,savg0,nts_q65,cand,ncand) +subroutine getcand2(ss,savg0,nts_q65,nagain,ntol,f0_selected,cand,ncand) ! Get candidates for Q65 decodes, based on presence of sync tone. @@ -33,9 +33,15 @@ subroutine getcand2(ss,savg0,nts_q65,cand,ncand) nb0=2*nts_q65 !Range of peak search, in bins smin=1.4 !First threshold nguard=5 !Guard range in bins + i1=1 + i2=NFFT-nbw-nguard + if(nagain.eq.1) then + i1=nint((1000.0*f0_selected-ntol)/df) + i2=nint((1000.0*f0_selected+ntol)/df) + endif j=0 - do i=1,NFFT-nbw-nguard !Look for local peaks in average spectrum + do i=i1,i2 !Look for local peaks in average spectrum if(savg(i).lt.smin) cycle spk=maxval(savg(i:i+nb0)) ipk1=maxloc(savg(i:i+nb0)) diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/q65wa.f90 index 34e335c67..d245d1e89 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/q65wa.f90 @@ -36,9 +36,11 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mfb=nfb-nkhz_center+48 mode_q65=nmode/10 nts_q65=2**(mode_q65-1) !Q65 tone separation factor + f0_selected=fselected - nkhz_center + 48.0 call timer('get_cand',0) - call getcand2(ss,savg,nts_q65,cand,ncand) !Get a list of decoding candidates +! Get a list of decoding candidates + call getcand2(ss,savg,nts_q65,nagain,ntol,f0_selected,cand,ncand) call timer('get_cand',1) nwrite_q65=0 @@ -48,6 +50,7 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & foffset=0.001*(1270 + nfcal) !Offset from sync tone, plus CAL fqso=mousefqso + foffset - 0.5*(nfa+nfb) + nfshift !fqso at baseband (khz) nqd=0 + nagain2=0 call timer('filbig ',0) call filbig(dd,NSMAX,f0,newdat,nfsample,cx,n5) !Do the full-length FFT @@ -55,11 +58,6 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & do icand=1,ncand !Attempt to decode each candidate f0=cand(icand)%f -! if(f0-mfa.lt.0.0 .or. f0-mfb.gt.0.0) cycle -! print*,'cc',nagain,ntol,fselected,f0+nkhz_center-48.0 - if(nagain.eq.1 .and. abs(f0+nkhz_center-48.0 - fselected).gt.0.001*ntol) cycle - nagain2=0 -! print*,'dd',nagain,ntol,fselected,f0+nkhz_center-48.0 freq=cand(icand)%f+nkhz_center-48.0-1.27046 ikhz=nint(freq) idec=-1 From e15d51f275c7395ad568f0334edd14eb29484fc7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 19 Jan 2023 12:31:04 -0500 Subject: [PATCH 172/251] Trying to diagnose failed response to double-click on waterfall. --- q65w/mainwindow.cpp | 2 ++ q65w/mainwindow.h | 1 + 2 files changed, 3 insertions(+) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index eab959877..b174cb755 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -828,6 +828,8 @@ void MainWindow::freezeDecode(int n) //freezeDecode() ui->tolSpinBox->setValue(qMin(3,ui->tolSpinBox->value())); datcom_.ntol=m_tol; } + m_nDoubleClicked++; +// qDebug() << "aa" << m_nDoubleClicked << m_decoderBusy << m_nTransmitted << n; if(!m_decoderBusy) { datcom_.nagain=1; datcom_.newdat=0; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index 84abc349f..ecdfcbba1 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -122,6 +122,7 @@ private: qint32 m_fetched=0; qint32 m_hsymStop=302; qint32 m_nTransmitted=0; + qint32 m_nDoubleClicked=0; double m_fAdd; double m_xavg; From 70988919f0a0c60d93e5059a7e330af03058f49f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 20 Jan 2023 11:03:02 -0500 Subject: [PATCH 173/251] Remove obsolete fil test_qra64.f90. --- lib/test_qra64.f90 | 129 --------------------------------------------- 1 file changed, 129 deletions(-) delete mode 100644 lib/test_qra64.f90 diff --git a/lib/test_qra64.f90 b/lib/test_qra64.f90 deleted file mode 100644 index 632dbdf66..000000000 --- a/lib/test_qra64.f90 +++ /dev/null @@ -1,129 +0,0 @@ -program test_qra64 - - character*71 cmd1,cmd2,line - character*22 msg - character*8 arg - character*1 csubmode - integer nretcode(0:11) - logical decok - - nargs=iargc() - if(nargs.ne.9) then - print*,'Usage: test_qra64 "msg" A-D depth freq DT fDop TRp nfiles SNR' - print*,'Example: test_qra64 "K1ABC W9XYZ EN37" A 3 1000 0.0 5.0 60 100 -20' - print*,' SNR = 0 to loop over all relevant SNRs' - go to 999 - endif - call getarg(1,msg) - call getarg(2,csubmode) - call getarg(3,arg) - read(arg,*) ndepth - call getarg(4,arg) - read(arg,*) nf0 - call getarg(5,arg) - read(arg,*) dt - call getarg(6,arg) - read(arg,*) fDop - call getarg(7,arg) - read(arg,*) ntrperiod - call getarg(8,arg) - read(arg,*) nfiles - call getarg(9,arg) - read(arg,*) nsnr - - nsps=6192 - i50=-28 - ia=-20 - ib=-33 - if(nsnr.ne.0) then - ia=nsnr - ib=nsnr - endif - - baud=12000.0/nsps - tsym=1.0/baud - -! 1 2 3 4 5 6 7 -! 12345678901234567890123456789012345678901234567890123456789012345678901' - cmd1='qra64sim "K1ABC W9XYZ EN37 " A 1 0.2 0.00 100 F -20 > junk0' - - cmd2='jt9 -q -L 300 -H 3000 -f 1000 -d 3 -b A *.wav > junk' - - write(cmd1(10:33),'(a)') '"'//msg//'"' - cmd1(35:35)=csubmode - write(cmd1(40:43),'(f4.1)') fDop - write(cmd1(44:48),'(f5.2)') dt - write(cmd1(49:53),'(i5)') nfiles - - write(cmd2(26:29),'(i4)') nf0 - write(cmd2(34:34),'(i1)') ndepth - cmd2(39:39)=csubmode - - call system('rm -f *.wav') - - write(*,1000) (j,j=0,11) - write(12,1000) (j,j=0,11) -1000 format(/'SNR d Dop Sync Dec Bad',i6,11i4,' tdec'/80('-')) - - dterr=tsym/4.0 - nferr=max(1,nint(0.5*baud),nint(fdop/3.0)) - ndecodes0=nfiles - - do nsnr=ia,ib,-1 - nsync=0 - ndecodes=0 - nfalse=0 - nretcode=0 - write(cmd1(57:59),'(i3)') nsnr - call system(cmd1) - call sec0(0,tdec) - call system(cmd2) - call sec0(1,tdec) - open(10,file='junk',status='unknown') - n=0 - do iline=1,9999 - read(10,'(a71)',end=10) line - if(index(line,' Date: Fri, 20 Jan 2023 11:08:28 -0500 Subject: [PATCH 174/251] Reduce maxiters from 33 67 100 to 20 40 60. --- lib/q65_decode.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 4e7558739..4990a24ec 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -134,18 +134,18 @@ contains baud=12000.0/nsps this%callback => callback nFadingModel=1 - maxiters=33 + maxiters=20 ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) ibwb=min(10,ibwa+2) if(iand(ndepth,3).ge.2) then ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) ibwb=min(10,ibwa+5) - maxiters=67 + maxiters=40 endif if(iand(ndepth,3).eq.3) then ibwa=max(1,ibwa-1) ibwb=min(10,ibwb+1) - maxiters=100 + maxiters=60 endif ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' From 31bedb8528db02de2504f2ec157f4d6164b787e7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 20 Jan 2023 14:09:51 -0500 Subject: [PATCH 175/251] Optional q65 decoding params from q65_params.txt. Maybe temporary! --- lib/q65_decode.f90 | 15 ++++++++++++++- lib/qra/q65/q65.f90 | 13 ++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 4990a24ec..aa7acb5b9 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -73,8 +73,9 @@ contains real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) + integer nq65param(0:7) logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain + logical single_decode,lagain,ex complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s integer stageno !Added by W3SZ @@ -147,6 +148,18 @@ contains ibwb=min(10,ibwb+1) maxiters=60 endif + inquire(file='q65_params.txt',exist=ex) + if(ex) then + open(28,file='q65_params.txt',status='old') + read(28,*) nq65param + ibwa=max(1,nq65param(nsubmode)) + ibwa=min(40,ibwa) + ibwb=ibwa + maxiters=nq65param(4+iand(ndepth,3)) + close(28) + endif +! write(*,3001) iand(ndepth,3),nsubmode,ibwa,ibwb,maxiters +!3001 format(5i5) ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 5baff4af1..956b1f53d 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -396,7 +396,18 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) read(c78,1060) apsymbols endif - do ibw=ibwa,ibwb +! do ibw=ibwa,ibwb +!### + ibw_mid=(ibwa+ibwb)/2 + iimax=3 + if(maxiters.eq.40) iimax=5 + if(maxiters.eq.60) iimax=7 +! print*,'a',maxiters,ibwa,ibwb,ibw_mid,iimax + do ii=1,iimax + n=ii/2 + if(iand(ii,1).eq.0) n=-n + ibw=ibw_mid + n +!### b90=1.72**ibw b90ts=b90/baud call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) From 4ea595eea109427b14ef4490d64fc13680dff65a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 22 Jan 2023 21:07:31 -0500 Subject: [PATCH 176/251] Protect against a bounds error. --- q65w/libq65/getcand2.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/q65w/libq65/getcand2.f90 b/q65w/libq65/getcand2.f90 index f6b03b690..5c9e083f1 100644 --- a/q65w/libq65/getcand2.f90 +++ b/q65w/libq65/getcand2.f90 @@ -56,8 +56,8 @@ subroutine getcand2(ss,savg0,nts_q65,nagain,ntol,f0_selected,cand,ncand) cand(j)%f=fpk cand(j)%xdt=xdt cand(j)%snr=snr_sync - ia=min(i,i0-nguard) - ib=i0+nbw+nguard + ia=max(1,min(i,i0-nguard)) + ib=min(i0+nbw+nguard,32768) savg(ia:ib)=0. if(j.ge.MAX_CANDIDATES) exit enddo From 18e8c89a43967ff65238dc5dabaca3922251ebdd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 11:38:15 -0500 Subject: [PATCH 177/251] Revert "Optional q65 decoding params from q65_params.txt. Maybe temporary!" This reverts commit 31bedb8528db02de2504f2ec157f4d6164b787e7. --- lib/q65_decode.f90 | 15 +-------------- lib/qra/q65/q65.f90 | 13 +------------ 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index aa7acb5b9..4990a24ec 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -73,9 +73,8 @@ contains real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) - integer nq65param(0:7) logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain,ex + logical single_decode,lagain complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s integer stageno !Added by W3SZ @@ -148,18 +147,6 @@ contains ibwb=min(10,ibwb+1) maxiters=60 endif - inquire(file='q65_params.txt',exist=ex) - if(ex) then - open(28,file='q65_params.txt',status='old') - read(28,*) nq65param - ibwa=max(1,nq65param(nsubmode)) - ibwa=min(40,ibwa) - ibwb=ibwa - maxiters=nq65param(4+iand(ndepth,3)) - close(28) - endif -! write(*,3001) iand(ndepth,3),nsubmode,ibwa,ibwb,maxiters -!3001 format(5i5) ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 956b1f53d..5baff4af1 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -396,18 +396,7 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) read(c78,1060) apsymbols endif -! do ibw=ibwa,ibwb -!### - ibw_mid=(ibwa+ibwb)/2 - iimax=3 - if(maxiters.eq.40) iimax=5 - if(maxiters.eq.60) iimax=7 -! print*,'a',maxiters,ibwa,ibwb,ibw_mid,iimax - do ii=1,iimax - n=ii/2 - if(iand(ii,1).eq.0) n=-n - ibw=ibw_mid + n -!### + do ibw=ibwa,ibwb b90=1.72**ibw b90ts=b90/baud call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) From 28a48ae6fc91c54222efae9669f5aca714ec7723 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 11:46:38 -0500 Subject: [PATCH 178/251] Revert "Revert "Optional q65 decoding params from q65_params.txt. Maybe temporary!"" This reverts commit 18e8c89a43967ff65238dc5dabaca3922251ebdd. --- lib/q65_decode.f90 | 15 ++++++++++++++- lib/qra/q65/q65.f90 | 13 ++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 4990a24ec..aa7acb5b9 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -73,8 +73,9 @@ contains real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) + integer nq65param(0:7) logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain + logical single_decode,lagain,ex complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s integer stageno !Added by W3SZ @@ -147,6 +148,18 @@ contains ibwb=min(10,ibwb+1) maxiters=60 endif + inquire(file='q65_params.txt',exist=ex) + if(ex) then + open(28,file='q65_params.txt',status='old') + read(28,*) nq65param + ibwa=max(1,nq65param(nsubmode)) + ibwa=min(40,ibwa) + ibwb=ibwa + maxiters=nq65param(4+iand(ndepth,3)) + close(28) + endif +! write(*,3001) iand(ndepth,3),nsubmode,ibwa,ibwb,maxiters +!3001 format(5i5) ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 5baff4af1..956b1f53d 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -396,7 +396,18 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) read(c78,1060) apsymbols endif - do ibw=ibwa,ibwb +! do ibw=ibwa,ibwb +!### + ibw_mid=(ibwa+ibwb)/2 + iimax=3 + if(maxiters.eq.40) iimax=5 + if(maxiters.eq.60) iimax=7 +! print*,'a',maxiters,ibwa,ibwb,ibw_mid,iimax + do ii=1,iimax + n=ii/2 + if(iand(ii,1).eq.0) n=-n + ibw=ibw_mid + n +!### b90=1.72**ibw b90ts=b90/baud call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) From 0a439019b334784d6f17ad3e4c14eb0f7e693183 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 14:03:49 -0500 Subject: [PATCH 179/251] WIP on optimization of Q65-60C decodes with 110 EME Contest files. --- lib/q65_decode.f90 | 27 +++++++++++---------------- lib/qra/q65/q65.f90 | 14 ++------------ 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index aa7acb5b9..eb9d69c84 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -73,7 +73,7 @@ contains real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) - integer nq65param(0:7) + integer nq65param(3) logical lclearave,lnewdat0,lapcqonly,unpk77_success logical single_decode,lagain,ex complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s @@ -135,27 +135,22 @@ contains baud=12000.0/nsps this%callback => callback nFadingModel=1 - maxiters=20 - ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) - ibwb=min(10,ibwa+2) - if(iand(ndepth,3).ge.2) then - ibwa=max(1,int(1.8*log(baud*mode_q65)) + 1) - ibwb=min(10,ibwa+5) - maxiters=40 - endif + ibwa=2*mode_q65 + ibwb=ibwa+4 + maxiters=40 + if(iand(ndepth,3).eq.2) maxiters=60 if(iand(ndepth,3).eq.3) then - ibwa=max(1,ibwa-1) - ibwb=min(10,ibwb+1) - maxiters=60 + ibwa=max(1,ibwa-2) + ibwb=ibwb+2 + maxiters=100 endif inquire(file='q65_params.txt',exist=ex) if(ex) then open(28,file='q65_params.txt',status='old') read(28,*) nq65param - ibwa=max(1,nq65param(nsubmode)) - ibwa=min(40,ibwa) - ibwb=ibwa - maxiters=nq65param(4+iand(ndepth,3)) + ibwa=nq65param(1) + ibwb=nq65param(2) + maxiters=nq65param(3) close(28) endif ! write(*,3001) iand(ndepth,3),nsubmode,ibwa,ibwb,maxiters diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 956b1f53d..6bcd6ae97 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -396,18 +396,8 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) read(c78,1060) apsymbols endif -! do ibw=ibwa,ibwb -!### - ibw_mid=(ibwa+ibwb)/2 - iimax=3 - if(maxiters.eq.40) iimax=5 - if(maxiters.eq.60) iimax=7 -! print*,'a',maxiters,ibwa,ibwb,ibw_mid,iimax - do ii=1,iimax - n=ii/2 - if(iand(ii,1).eq.0) n=-n - ibw=ibw_mid + n -!### +! print*,'a',ibwa,ibwb,maxiters,iimax + do ibw=ibwa,ibwb b90=1.72**ibw b90ts=b90/baud call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) From d7859062bb2809e03c9dc0b8440483fad79e7919 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 15:40:48 -0500 Subject: [PATCH 180/251] At least for Q65-60C, maxdist=5 is big enough. --- lib/qra/q65/q65_loops.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qra/q65/q65_loops.f90 b/lib/qra/q65/q65_loops.f90 index ec93adb09..3220648e6 100644 --- a/lib/qra/q65/q65_loops.f90 +++ b/lib/qra/q65/q65_loops.f90 @@ -37,7 +37,7 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, & if(iand(ndepth,3).eq.3) then idfmax=5 idtmax=5 - maxdist=15 + maxdist=5 endif napmin=99 From 73db6eb28fa6d8208e9ed8cc7de2cc5cfc61007b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 17:25:31 -0500 Subject: [PATCH 181/251] Compute symbol spectra at 1/4 symbol steps, rather than 1/8 symbol. --- lib/qra/q65/q65.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 6bcd6ae97..a54807e9c 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -294,7 +294,7 @@ subroutine q65_symspec(iwave,nmax,iz,jz,s1) allocate(c0(0:nsps-1)) nfft=nsps fac=1/32767.0 - do j=1,jz !Compute symbol spectra at step size + do j=1,jz,2 !Compute symbol spectra at 2*step size i1=(j-1)*istep i2=i1+nsps-1 k=-1 @@ -314,6 +314,8 @@ subroutine q65_symspec(iwave,nmax,iz,jz,s1) do i=1,nsmo call smo121(s1(1:iz,j),iz) enddo +! Interpolate to fill in the skipped-over spectra. + if(j.ge.3) s1(1:iz,j-1)=0.5*(s1(1:iz,j-2)+s1(1:iz,j)) enddo if(lnewdat) then navg(iseq)=navg(iseq) + 1 From 1fff588991d71dfe69db2cdcfce6cc8b23cb57ff Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 17:50:46 -0500 Subject: [PATCH 182/251] Reduce nsmo from 11 to 8. --- lib/qra/q65/q65.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index a54807e9c..d9086ade9 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -95,7 +95,8 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ftol=ntol ia=ntol/df ia2=max(ia,10*mode_q65,nint(100.0/df)) - nsmo=int(0.7*mode_q65*mode_q65) +! nsmo=int(0.7*mode_q65*mode_q65) + nsmo=int(0.5*mode_q65*mode_q65) if(nsmo.lt.1) nsmo=1 if(first) then !Generate the sync vector sync=-22.0/63.0 !Sync tone OFF From aec42afda771e2df8e25b6a4e6aa5a54f9ecbbfd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 19:03:57 -0500 Subject: [PATCH 183/251] Remove ndepth from argument lists where it's not needed. --- lib/q65_decode.f90 | 8 ++++---- lib/qra/q65/q65.f90 | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index eb9d69c84..d07ee021f 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -176,7 +176,7 @@ contains call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a ! q3 or q0 decode. - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & + call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) @@ -227,7 +227,7 @@ contains ! Call top-level routine in q65 module: establish sync and try for a q3 ! decode, this time using the cumulative 's1a' symbol spectra. iavg=1 - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & + call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('list_avg',1) @@ -244,7 +244,7 @@ contains call timer('q65_avg ',0) iavg=2 - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & + call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_avg ',1) if(idec.ge.0) then @@ -258,7 +258,7 @@ contains call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a ! q3 or q0 decode. - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & + call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) if(idec.ge.0) then diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index d9086ade9..92ac51ca9 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -28,7 +28,7 @@ module q65 contains -subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & +subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) ! Top-level routine in q65 module @@ -41,7 +41,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ! ntrperiod T/R sequence length (s) ! nfqso Target frequency (Hz) ! ntol Search range around nfqso (Hz) -! ndepth Requested decoding depth ! lclearave Flag to clear the accumulating array ! emedelay Extra delay for EME signals ! Output: xdt Time offset from nominal (s) @@ -76,7 +75,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & integer stageno NN=63 - if(nutc+ndepth.eq.-999) stop !Silence compiler warnings + if(nutc.eq.-999) stop !Silence compiler warnings ! Set some parameters and allocate storage for large arrays irc=-2 @@ -184,7 +183,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ! Get 2d CCF and ccf2 using sync symbols only if(iavg.eq.0) then call timer('ccf_22a ',0) - call q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & + call q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & f0a,xdta,ccf2) call timer('ccf_22a ',1) endif @@ -192,7 +191,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, & ! Get 2d CCF and ccf2_avg using sync symbols only if(iavg.ge.1) then call timer('ccf_22b ',0) - call q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & + call q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & f0a,xdta,ccf2_avg) call timer('ccf_22b ',1) endif @@ -488,7 +487,7 @@ subroutine q65_ccf_85(s1,iz,jz,nfqso,ia,ia2,ipk,jpk,f0,xdt,imsg_best, & return end subroutine q65_ccf_85 -subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & +subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & f0,xdt,ccf2) ! Attempt synchronization using only the 22 sync symbols. Return ccf2 From afcb0349569732b97934da62346e82fc96f7e551 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 23 Jan 2023 19:22:34 -0500 Subject: [PATCH 184/251] More cleanup of global variables and unused arguments. --- lib/q65_decode.f90 | 8 ++++---- lib/qra/q65/q65.f90 | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index d07ee021f..803b4274b 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -176,7 +176,7 @@ contains call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a ! q3 or q0 decode. - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & + call q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) @@ -227,7 +227,7 @@ contains ! Call top-level routine in q65 module: establish sync and try for a q3 ! decode, this time using the cumulative 's1a' symbol spectra. iavg=1 - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & + call q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('list_avg',1) @@ -244,7 +244,7 @@ contains call timer('q65_avg ',0) iavg=2 - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & + call q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_avg ',1) if(idec.ge.0) then @@ -258,7 +258,7 @@ contains call timer('q65_dec0',0) ! Call top-level routine in q65 module: establish sync and try for a ! q3 or q0 decode. - call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & + call q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) if(idec.ge.0) then diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 92ac51ca9..7e2eabd42 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -2,8 +2,8 @@ module q65 parameter (NSTEP=8) !Number of time bins per symbol in s1, s1a, s1b parameter (PLOG_MIN=-242.0) !List decoding threshold - integer nsave,nlist,LL0,iz0,jz0 - integer listutc(10) + integer iz0,jz0 +! integer listutc(10) integer apsym0(58),aph10(10) integer apmask1(78),apsymbols1(78) integer apmask(13),apsymbols(13) @@ -19,7 +19,7 @@ module q65 real candidates(20,3) !snr, xdt, and f0 of top candidates real, allocatable :: s1raw(:,:) !Symbol spectra, 1/8-symbol steps real, allocatable :: s1(:,:) !Symbol spectra w/suppressed peaks - real, allocatable :: s1w(:,:) !Symbol spectra w/suppressed peaks !w3sz added + real, allocatable :: s1w(:,:) !Symbol spectra w/suppressed peaks (W3SZ) real, allocatable,save :: s1a(:,:,:) !Cumulative symbol spectra real, allocatable,save :: ccf2(:) !Max CCF(freq) at any lag (orange curve) real, allocatable,save :: ccf2_avg(:) !Like ccf2, but for avg (red curve) @@ -28,7 +28,7 @@ module q65 contains -subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & +subroutine q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) ! Top-level routine in q65 module @@ -67,7 +67,7 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & real, allocatable :: s3(:,:) !Data-symbol energies s3(LL,63) real, allocatable :: ccf1(:) !CCF(freq) at fixed lag (red) data first/.true./ - save first + save first,LL0 integer w3t integer w3f @@ -75,7 +75,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,lclearave, & integer stageno NN=63 - if(nutc.eq.-999) stop !Silence compiler warnings ! Set some parameters and allocate storage for large arrays irc=-2 From a76239dd7630db6310ed517a00f5b8923fe6def4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 08:17:42 -0500 Subject: [PATCH 185/251] Remove more unused dummy arguments. --- lib/q65_decode.f90 | 4 ++-- lib/qra/q65/q65.f90 | 12 +++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 803b4274b..a22f23beb 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -289,7 +289,7 @@ contains ndecodes=min(ndecodes+1,100) decodes(ndecodes)=decoded f0decodes(ndecodes)=f0dec - call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) + call q65_snr(dat4,dtdec,f0dec,mode_q65,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) @@ -379,7 +379,7 @@ contains ndecodes=min(ndecodes+1,100) decodes(ndecodes)=decoded f0decodes(ndecodes)=f0dec - call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) + call q65_snr(dat4,dtdec,f0dec,mode_q65,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 7e2eabd42..5159a945f 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -182,7 +182,7 @@ subroutine q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & ! Get 2d CCF and ccf2 using sync symbols only if(iavg.eq.0) then call timer('ccf_22a ',0) - call q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & + call q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & f0a,xdta,ccf2) call timer('ccf_22a ',1) endif @@ -190,7 +190,7 @@ subroutine q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & ! Get 2d CCF and ccf2_avg using sync symbols only if(iavg.ge.1) then call timer('ccf_22b ',0) - call q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & + call q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & f0a,xdta,ccf2_avg) call timer('ccf_22b ',1) endif @@ -486,7 +486,7 @@ subroutine q65_ccf_85(s1,iz,jz,nfqso,ia,ia2,ipk,jpk,f0,xdt,imsg_best, & return end subroutine q65_ccf_85 -subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & +subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & f0,xdt,ccf2) ! Attempt synchronization using only the 22 sync symbols. Return ccf2 @@ -497,7 +497,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & real, allocatable :: xdt2(:) real, allocatable :: s1avg(:) integer, allocatable :: indx(:) - integer ipk1(1) allocate(xdt2(iz)) allocate(s1avg(iz)) @@ -520,6 +519,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ntrperiod,iavg,ipk,jpk, & ibest=0 lagpk=0 lagbest=0 + idrift_max=0 idrift_best=0 do i=ia,ib @@ -747,7 +747,7 @@ subroutine q65_bzap(s3,LL) return end subroutine q65_bzap -subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2) +subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,snr2) ! Estimate SNR of a decoded transmission by aligning the spectra of ! all 85 symbols. @@ -795,8 +795,6 @@ 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) -! NB: No adjustment to SNR is now made for nused>1, because that process did -! not seem to work as expected. return end subroutine q65_snr From f83db225f5848e30ff57c8e17935c0c54e151cd4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 08:27:02 -0500 Subject: [PATCH 186/251] Remove another unused variable. --- lib/qra/q65/q65.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 5159a945f..920fbd5e1 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -12,7 +12,7 @@ module q65 integer codewords(63,206) integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift - integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc + integer istep,nsmo,lag1,lag2,npasses,iseq,ncand,nrc integer i0,j0 integer navg(0:1) logical lnewdat From f976d3201363d32e71ec8a863063d741bd098416 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 09:18:00 -0500 Subject: [PATCH 187/251] Clean up some compiler warnings. --- lib/fst4_decode.f90 | 1 + lib/ft8/sync8.f90 | 3 +-- lib/ft8_decode.f90 | 6 ++---- lib/qra/q65/q65_encoding_modules.f90 | 4 +--- q65w/libq65/recvpkt.f90 | 6 ++---- q65w/soundin.cpp | 3 +-- q65w/soundin.h | 3 +-- 7 files changed, 9 insertions(+), 17 deletions(-) diff --git a/lib/fst4_decode.f90 b/lib/fst4_decode.f90 index 5d9ccc827..a9c7d80f9 100644 --- a/lib/fst4_decode.f90 +++ b/lib/fst4_decode.f90 @@ -602,6 +602,7 @@ contains case(1800) snr_calfac=320.0 case default + snr_calfac=430.0 end select arg=snr_calfac*xsig/base - 1.0 if(arg.gt.0.0) then diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index f93afe75a..7aff8f091 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -1,5 +1,4 @@ -subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,nzhsym,candidate, & - ncand,sbase) +subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,candidate,ncand,sbase) include 'ft8_params.f90' parameter (MAXPRECAND=1000) diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index a19d0b83c..9d3ae75f8 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -46,7 +46,6 @@ contains procedure(ft8_decode_callback) :: callback parameter (MAXCAND=600,MAX_EARLY=100) real*8 tsec,tseq - real s(NH1,NHSYM) real sbase(NH1) real candidate(3,MAXCAND) real dd(15*12000),dd1(15*12000) @@ -68,7 +67,7 @@ contains real xdt_save(MAX_EARLY) data nutc0/-1/ - save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,& + save dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted, & allmessages this%callback => callback @@ -193,8 +192,7 @@ contains endif call timer('sync8 ',0) maxc=MAXCAND - call sync8(dd,ifa,ifb,syncmin,nfqso,maxc,nzhsym,candidate, & - ncand,sbase) + call sync8(dd,ifa,ifb,syncmin,nfqso,maxc,candidate,ncand,sbase) call timer('sync8 ',1) do icand=1,ncand sync=candidate(3,icand) diff --git a/lib/qra/q65/q65_encoding_modules.f90 b/lib/qra/q65/q65_encoding_modules.f90 index b55c7f27b..4988dd4d4 100644 --- a/lib/qra/q65/q65_encoding_modules.f90 +++ b/lib/qra/q65/q65_encoding_modules.f90 @@ -135,10 +135,9 @@ end subroutine get_q65crc12(mc2,ncrc1,ncrc2) ! - character c12*12,c6*6 + character c6*6 integer*1 mc(90),mc2(90),tmp(6) integer*1 r(13),p(13) - integer ncrc ! polynomial for 12-bit CRC 0xF01 data p/1,1,0,0,0,0,0,0,0,1,1,1,1/ @@ -170,7 +169,6 @@ subroutine get_q65_tones(msg37,codeword,itone) implicit none character*37 msg37 character*77 c77 - character*12 c12 character*6 c6 integer codeword(65) integer sync(22) diff --git a/q65w/libq65/recvpkt.f90 b/q65w/libq65/recvpkt.f90 index e0df94e7a..e0c434440 100644 --- a/q65w/libq65/recvpkt.f90 +++ b/q65w/libq65/recvpkt.f90 @@ -1,4 +1,4 @@ -subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) +subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8) ! Reformat timf2 data from Linrad and stuff data into r*4 array dd(). @@ -8,15 +8,13 @@ subroutine recvpkt(nsam,nblock2,userx_no,k,buf4,buf8,buf16) integer*1 userx_no real*4 d4,buf4(*) !(348) real*8 d8,buf8(*) !(174) - complex*16 c16,buf16(*) !(87) integer*2 jd(4),kd(2),nblock2 - real*4 xd(4),yd(2) + real*4 yd(2) real*8 fcenter common/datcom/dd(2,5760000),ss(322,NFFT),savg(NFFT),fcenter,nutc, & junk(NJUNK) equivalence (kd,d4) equivalence (jd,d8,yd) - equivalence (xd,c16) if(nblock2.eq.-9999) nblock2=-9998 !Silence a compiler warning if(nsam.eq.-1) then diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index 54fbc5955..d6ba6e56a 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -209,8 +209,7 @@ void SoundInThread::inputUDP() // If buffer will not overflow, move data into datcom_ if ((k+iz) <= 60*96000) { int nsam=-1; - recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8); -// if(nsam==-99) recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8, b.d8); + recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8); datcom_.fcenter=b.cfreq + m_fAdd; } diff --git a/q65w/soundin.h b/q65w/soundin.h index 2773bc9d4..a0900ba6e 100644 --- a/q65w/soundin.h +++ b/q65w/soundin.h @@ -67,8 +67,7 @@ private: }; extern "C" { - void recvpkt_(int* nsam, quint16* iblk, qint8* nrx, int* k, double s1[], - double s2[], double s3[]); + void recvpkt_(int* nsam, quint16* iblk, qint8* nrx, int* k, double s1[], double s2[]); } #endif // SOUNDIN_H From 1f438e6ba1ff775d91909e300829b0321263b0b1 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 12:04:13 -0500 Subject: [PATCH 188/251] Remove the Decode menu and its options. --- q65w/mainwindow.cpp | 28 ++-------------------------- q65w/mainwindow.h | 4 ---- q65w/mainwindow.ui | 41 ----------------------------------------- 3 files changed, 2 insertions(+), 71 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index b174cb755..8ba90c53b 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -62,11 +62,6 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionSave_all->setActionGroup(saveGroup); ui->actionNone->setActionGroup(saveGroup); - QActionGroup* DepthGroup = new QActionGroup(this); - ui->actionNo_Deep_Search->setActionGroup(DepthGroup); - ui->actionNormal_Deep_Search->setActionGroup(DepthGroup); - ui->actionAggressive_Deep_Search->setActionGroup(DepthGroup); - setWindowTitle (program_title ()); connect(&soundInThread, SIGNAL(readyForFFT(int)), this, SLOT(dataSink(int))); @@ -244,7 +239,6 @@ void MainWindow::writeSettings() settings.setValue("nModeQ65",m_modeQ65); settings.setValue("SaveNone",ui->actionNone->isChecked()); settings.setValue("SaveAll",ui->actionSave_all->isChecked()); - settings.setValue("NDepth",m_ndepth); settings.setValue("NEME",m_onlyEME); settings.setValue("KB8RQ",m_kb8rq); settings.setValue("NB",m_NB); @@ -300,7 +294,6 @@ void MainWindow::readSettings() ui->actionNone->setChecked(settings.value("SaveNone",true).toBool()); ui->actionSave_all->setChecked(settings.value("SaveAll",false).toBool()); m_saveAll=ui->actionSave_all->isChecked(); - m_ndepth=settings.value("NDepth",2).toInt(); m_onlyEME=settings.value("NEME",false).toBool(); ui->actionOnly_EME_calls->setChecked(m_onlyEME); m_kb8rq=settings.value("KB8RQ",false).toBool(); @@ -319,9 +312,6 @@ void MainWindow::readSettings() on_actionLinrad_triggered(); ui->actionLinrad->setChecked(true); } - if(m_ndepth==0) ui->actionNo_Deep_Search->setChecked(true); - if(m_ndepth==1) ui->actionNormal_Deep_Search->setChecked(true); - if(m_ndepth==2) ui->actionAggressive_Deep_Search->setChecked(true); } //-------------------------------------------------------------- dataSink() @@ -782,21 +772,6 @@ void MainWindow::on_actionDelete_all_iq_files_in_SaveDir_triggered() } } -void MainWindow::on_actionNo_Deep_Search_triggered() -{ - m_ndepth=0; -} - -void MainWindow::on_actionNormal_Deep_Search_triggered() -{ - m_ndepth=1; -} - -void MainWindow::on_actionAggressive_Deep_Search_triggered() -{ - m_ndepth=2; -} - void MainWindow::on_actionNone_triggered() //Save None { m_saveAll=false; @@ -855,7 +830,6 @@ void MainWindow::decode() //decode() datcom_.mousedf=m_wide_graph_window->DF(); datcom_.mousefqso=m_wide_graph_window->QSOfreq(); datcom_.fselected=datcom_.mousefqso + 0.001*datcom_.mousedf; - datcom_.ndepth=m_ndepth+1; datcom_.ndiskdat=0; if(m_diskData) { datcom_.ndiskdat=1; @@ -903,6 +877,8 @@ void MainWindow::decode() //decode() datcom_.nmode=10*m_modeQ65; datcom_.nsave=m_nsave; datcom_.max_drift=ui->sbMaxDrift->value(); + datcom_.ndepth=1; + if(datcom_.nagain==1) datcom_.ndepth=3; QString mcall=(m_myCall+" ").mid(0,12); QString mgrid=(m_myGrid+" ").mid(0,6); diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index ecdfcbba1..e04e960fb 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -64,9 +64,6 @@ private slots: void on_actionOpen_next_in_directory_triggered(); void on_actionDecode_remaining_files_in_directory_triggered(); void on_actionDelete_all_iq_files_in_SaveDir_triggered(); - void on_actionNo_Deep_Search_triggered(); - void on_actionNormal_Deep_Search_triggered(); - void on_actionAggressive_Deep_Search_triggered(); void on_actionNone_triggered(); void on_actionSave_all_triggered(); void on_DecodeButton_clicked(); @@ -106,7 +103,6 @@ private: qint32 m_fCal; qint32 m_txFreq; qint32 m_setftx; - qint32 m_ndepth; qint32 m_sec0; qint32 m_nutc0; qint32 m_nrx; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index acce2af65..4eaf441de 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -649,16 +649,6 @@ p, li { white-space: pre-wrap; } - - - Decode - - - - - - - Save @@ -687,7 +677,6 @@ p, li { white-space: pre-wrap; } - @@ -818,36 +807,6 @@ p, li { white-space: pre-wrap; } No shorthand decodes if Tx1 - - - true - - - false - - - Fast - - - - - true - - - true - - - Normal - - - - - true - - - Deep - - true From af5193014efa648a4867eb5f798922ce1b31988a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 12:21:40 -0500 Subject: [PATCH 189/251] Remove the Stop button. Toggle Monitoring Off, instead. --- q65w/mainwindow.cpp | 22 +++++++++++----------- q65w/mainwindow.h | 1 - 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 8ba90c53b..4cf7170a2 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -484,10 +484,17 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_monitorButton_clicked() //Monitor { - m_monitoring=true; - soundInThread.setMonitoring(true); - m_diskData=false; + if(m_monitoring) { + m_monitoring=false; + soundInThread.setMonitoring(false); + m_loopall=false; + } else { + m_monitoring=true; + soundInThread.setMonitoring(true); + m_diskData=false; + } } + void MainWindow::on_actionLinrad_triggered() //Linrad palette { if(m_wide_graph_window) m_wide_graph_window->setPalette("Linrad"); @@ -631,13 +638,6 @@ void MainWindow::closeEvent (QCloseEvent * e) QMainWindow::closeEvent (e); } -void MainWindow::on_stopButton_clicked() //stopButton -{ - m_monitoring=false; - soundInThread.setMonitoring(m_monitoring); - m_loopall=false; -} - void MainWindow::msgBox(QString t) //msgBox { msgBox0.setText(t); @@ -669,7 +669,7 @@ void MainWindow::on_actionOpen_triggered() //Open File lab1->setStyleSheet("QLabel{background-color: #66ff66}"); lab1->setText(" " + fname.mid(i,15) + " "); } - on_stopButton_clicked(); + if(m_monitoring) on_monitorButton_clicked(); m_diskData=true; int dbDgrd=0; if(m_myCall=="K1JT" and m_idInt<0) dbDgrd=m_idInt; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e04e960fb..e30fdc0f5 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -58,7 +58,6 @@ private slots: void on_actionCuteSDR_triggered(); void on_tolSpinBox_valueChanged(int arg1); void on_actionAstro_Data_triggered(); - void on_stopButton_clicked(); void on_actionWide_Waterfall_triggered(); void on_actionOpen_triggered(); void on_actionOpen_next_in_directory_triggered(); From 41a1b4cf068a6c0ffa8b589c22eb025e7610f1e9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 12:24:35 -0500 Subject: [PATCH 190/251] Forgot to remove the Stop button, itself. Done. --- q65w/mainwindow.ui | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 4eaf441de..37c2d6bc2 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -111,19 +111,6 @@ p, li { white-space: pre-wrap; }
- - - - - 50 - 0 - - - - &Stop - - - @@ -149,19 +136,6 @@ p, li { white-space: pre-wrap; } - - - - - 50 - 0 - - - - &Decode - - - @@ -175,6 +149,19 @@ p, li { white-space: pre-wrap; } + + + + + 50 + 0 + + + + &Decode + + + From b1c82758ee8dc300ea1dbdf4d748f2bc64634e5a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 13:17:49 -0500 Subject: [PATCH 191/251] Simplify the Q65W GUI. --- q65w/mainwindow.cpp | 164 -------------- q65w/mainwindow.h | 6 - q65w/mainwindow.ui | 534 ++++++++++++-------------------------------- 3 files changed, 147 insertions(+), 557 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 4cf7170a2..50c2b723e 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -43,7 +43,6 @@ MainWindow::MainWindow(QWidget *parent) : ui->labTol1->setStyleSheet( \ "QLabel { background-color : white; color : black; }"); ui->labTol1->setFrameStyle(QFrame::Panel | QFrame::Sunken); - ui->dxStationGroupBox->setStyleSheet("QFrame{border: 5px groove red}"); QActionGroup* paletteGroup = new QActionGroup(this); ui->actionCuteSDR->setActionGroup(paletteGroup); @@ -212,8 +211,6 @@ void MainWindow::writeSettings() SettingsGroup g {&settings, "MainWindow"}; settings.setValue("geometry", saveGeometry()); settings.setValue("MRUdir", m_path); - settings.setValue("DXcall",ui->dxCallEntry->text()); - settings.setValue("DXgrid",ui->dxGridEntry->text()); } SettingsGroup g {&settings, "Common"}; @@ -257,8 +254,6 @@ void MainWindow::readSettings() { SettingsGroup g {&settings, "MainWindow"}; restoreGeometry(settings.value("geometry").toByteArray()); - ui->dxCallEntry->setText(settings.value("DXcall","").toString()); - ui->dxGridEntry->setText(settings.value("DXgrid","").toString()); m_path = settings.value("MRUdir", m_appDir + "/save").toString(); } @@ -525,10 +520,6 @@ void MainWindow::keyPressEvent( QKeyEvent *e ) //keyPressEvent { switch(e->key()) { - case Qt::Key_F4: - ui->dxCallEntry->setText(""); - ui->dxGridEntry->setText(""); - break; case Qt::Key_F6: if(e->modifiers() & Qt::ShiftModifier) { on_actionDecode_remaining_files_in_directory_triggered(); @@ -882,13 +873,9 @@ void MainWindow::decode() //decode() QString mcall=(m_myCall+" ").mid(0,12); QString mgrid=(m_myGrid+" ").mid(0,6); - QString hcall=(ui->dxCallEntry->text()+" ").mid(0,12); - QString hgrid=(ui->dxGridEntry->text()+" ").mid(0,6); memcpy(datcom_.mycall, mcall.toLatin1(), 12); memcpy(datcom_.mygrid, mgrid.toLatin1(), 6); - memcpy(datcom_.hiscall, hcall.toLatin1(), 12); - memcpy(datcom_.hisgrid, hgrid.toLatin1(), 6); if(m_diskData) { memcpy(datcom_.datetime, fname.toLatin1(), 11); } else { @@ -1022,157 +1009,6 @@ void MainWindow::guiUpdate() } } -void MainWindow::lookup() //lookup() -{ - QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); - ui->dxCallEntry->setText(hiscall); - QString call3File = m_appDir + "/CALL3.TXT"; - QFile f(call3File); - if(!f.open(QIODevice::ReadOnly | QIODevice::Text)) { - msgBox("Cannot open " + call3File); - return; - } - char c[132]; - qint64 n=0; - for(int i=0; i<999999; i++) { - n=f.readLine(c,sizeof(c)); - if(n <= 0) { - ui->dxGridEntry->setText(""); - break; - } - QString t=QString(c); - if(t.indexOf(hiscall)==0) { - int i1=t.indexOf(","); - QString hisgrid=t.mid(i1+1,6); - i1=hisgrid.indexOf(","); - if(i1>0) { - hisgrid=hisgrid.mid(0,4); - } else { - hisgrid=hisgrid.mid(0,4) + hisgrid.mid(4,2).toLower(); - } - ui->dxGridEntry->setText(hisgrid); - break; - } - } - f.close(); -} - -void MainWindow::on_lookupButton_clicked() //Lookup button -{ - lookup(); -} - -void MainWindow::on_addButton_clicked() //Add button -{ - if(ui->dxGridEntry->text()=="") { - msgBox("Please enter a valid grid locator."); - return; - } - m_call3Modified=false; - QString hiscall=ui->dxCallEntry->text().toUpper().trimmed(); - QString hisgrid=ui->dxGridEntry->text().trimmed(); - QString newEntry=hiscall + "," + hisgrid; - - int ret = QMessageBox::warning(this, "Add", - newEntry + "\n" + "Is this station known to be active on EME?", - QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); - if(ret==QMessageBox::Yes) { - newEntry += ",EME,,"; - } else { - newEntry += ",,,"; - } - QString call3File = m_appDir + "/CALL3.TXT"; - QFile f1(call3File); - if(!f1.open(QIODevice::ReadWrite | QIODevice::Text)) { - msgBox("Cannot open " + call3File); - return; - } - - if(f1.size()==0) { - QTextStream out(&f1); - out << "ZZZZZZ" -#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) - << Qt::endl -#else - << endl -#endif - ; - f1.seek (0); - } - - QString tmpFile = m_appDir + "/CALL3.TMP"; - QFile f2(tmpFile); - if(!f2.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) { - msgBox("Cannot open " + tmpFile); - return; - } - { - QTextStream in(&f1); - QTextStream out(&f2); - QString hc=hiscall; - QString hc1=""; - QString hc2="000000"; - QString s; - do { - s=in.readLine(); - hc1=hc2; - if(s.mid(0,2)=="//") { - out << s + "\n"; - } else { - int i1=s.indexOf(","); - hc2=s.mid(0,i1); - if(hc>hc1 && hchc1 && !m_call3Modified) out << newEntry + "\n"; - } - - if(m_call3Modified) { - auto const& old_path = m_appDir + "/CALL3.OLD"; - QFile f0 {old_path}; - if (f0.exists ()) f0.remove (); - f1.copy (old_path); // copying as we want to preserve - // symlinks - f1.open (QFile::WriteOnly | QFile::Text); // truncates - f2.seek (0); - f1.write (f2.readAll ()); // copy contents - f2.remove (); - } -} - -void MainWindow::on_dxCallEntry_textChanged(const QString &t) //dxCall changed -{ - m_hisCall=t.toUpper().trimmed(); - ui->dxCallEntry->setText(m_hisCall); -} - -void MainWindow::on_dxGridEntry_textChanged(const QString &t) //dxGrid changed -{ - int n=t.length(); - if(n!=4 and n!=6) return; - if(!t[0].isLetter() or !t[1].isLetter()) return; - if(!t[2].isDigit() or !t[3].isDigit()) return; - if(n==4) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2); - if(n==6) m_hisGrid=t.mid(0,2).toUpper() + t.mid(2,2) + - t.mid(4,2).toLower(); - ui->dxGridEntry->setText(m_hisGrid); -} - void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; diff --git a/q65w/mainwindow.h b/q65w/mainwindow.h index e30fdc0f5..03dd7f1fc 100644 --- a/q65w/mainwindow.h +++ b/q65w/mainwindow.h @@ -69,10 +69,6 @@ private slots: void decode(); void decodeBusy(bool b); void on_EraseButton_clicked(); - void on_lookupButton_clicked(); - void on_addButton_clicked(); - void on_dxCallEntry_textChanged(const QString &arg1); - void on_dxGridEntry_textChanged(const QString &arg1); void bumpDF(int n); void on_actionSettings_triggered(); void on_NBcheckBox_toggled(bool checked); @@ -173,7 +169,6 @@ private: QString m_hisGrid; QString m_saveDir; QString m_azelDir; - QString m_dxccPfx; QString m_palette; QString m_dateTime; QString m_mode; @@ -193,7 +188,6 @@ private: void createStatusBar(); void updateStatusBar(); void msgBox(QString t); - void lookup(); bool isGrid4(QString g); }; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index 37c2d6bc2..bdd976985 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 472 - 523 + 431 @@ -35,10 +35,10 @@ - + - - + + @@ -61,8 +61,8 @@ UTC Freq DT dB Message - - + + @@ -109,9 +109,56 @@ p, li { white-space: pre-wrap; } - - - + + + + + + + 50 + 150 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 140 + 0 + + + + + 165 + 60 + + + + + 16 + + + + QFrame::Panel + + + 2014 Dec 02 +01:23:45 + + + Qt::AlignCenter + + + + @@ -136,7 +183,7 @@ p, li { white-space: pre-wrap; } - + @@ -149,7 +196,7 @@ p, li { white-space: pre-wrap; } - + @@ -162,308 +209,40 @@ p, li { white-space: pre-wrap; } - - - - - - - - - 50 - 0 - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - + + - + - + 0 0 - 164 - 40 - - - - - 290 - 16777215 - - - - - - - DX Call DX Grid - - - - - 231 - 13 - 50 - 23 - - - - - 50 - 16777215 - - - - SetMsgs - - - - - - 7 - 13 - 150 - 64 - - - - - - - - - - 0 - 0 - - - - - 0 - 23 - - - - - 70 - 16777215 - - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 23 - - - - - 70 - 16777215 - - - - - - - Qt::AlignCenter - - - - - - - - - - - - 0 - 0 - - - - - 70 - 0 - - - - - 50 - 16777215 - - - - &Lookup - - - - - - - - 70 - 0 - - - - - 50 - 16777215 - - - - Add - - - - - - - - - - - - - - 140 + 42 0 - 165 - 60 + 42 + 18 - - - 16 - - - - QFrame::Panel - - 2014 Dec 02 -01:23:45 + 500 Qt::AlignCenter - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 20 - 20 - - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Maximum drift rate in units of symbol rate per transmissiion. - - - Qt::AlignCenter - - - Max Drift - - - 50 - - - 5 - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - NB - - - - - + - false + true @@ -471,125 +250,106 @@ p, li { white-space: pre-wrap; } 0 + + + 0 + 23 + + - 80 + 18 16777215 - 0 + 1 - 100 + 6 - 40 - - - Qt::Horizontal + 5 - - - - - - 0 - 0 - - - - - 42 - 0 - - - - - 42 - 18 - - - - 500 - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 0 - 23 - - - - - 18 - 16777215 - - - - 1 - - - 6 - - - 5 - - - - - - - - 0 - 0 - - - - - 20 - 16777215 - - - - Tol - - - - + + + + 0 + 0 + + + + + 20 + 16777215 + + + + Tol + + - - + + + + Maximum drift rate in units of symbol rate per transmissiion. + + + Qt::AlignCenter + + + Max Drift + + + 50 + + + 5 + + + + + + + false + + + + 0 + 0 + + + + + 80 + 16777215 + + + + 0 + + + 100 + + + 40 + Qt::Horizontal - - - 40 - 20 - + + + + + + NB - + From 1795619b2cbfe39b5874c9f0b1c205dcd89a6713 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 13:40:01 -0500 Subject: [PATCH 192/251] More tweaks to the GUI. Add a Frequency label. --- q65w/mainwindow.ui | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index bdd976985..a28dd1045 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -127,7 +127,7 @@ p, li { white-space: pre-wrap; } - + @@ -150,7 +150,7 @@ p, li { white-space: pre-wrap; } QFrame::Panel - 2014 Dec 02 + 2023 Feb 02 01:23:45 @@ -351,6 +351,21 @@ p, li { white-space: pre-wrap; } + + + + + 16 + + + + 1296.080 + + + Qt::AlignCenter + + + From dd8c01f31c21811b8bfff9a083867a78ff0791ec Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 13:54:34 -0500 Subject: [PATCH 193/251] Clean up the usage of labels on Status Bar. --- q65w/mainwindow.cpp | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 50c2b723e..c0e28fef9 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -40,6 +40,8 @@ MainWindow::MainWindow(QWidget *parent) : // ui->decodedTextBrowser->clear(); ui->labUTC->setStyleSheet( \ "QLabel { background-color : black; color : yellow; }"); + ui->labFreq->setStyleSheet( \ + "QLabel { background-color : black; color : yellow; }"); ui->labTol1->setStyleSheet( \ "QLabel { background-color : white; color : black; }"); ui->labTol1->setFrameStyle(QFrame::Panel | QFrame::Sunken); @@ -397,7 +399,6 @@ void MainWindow::dataSink(int k) n=0; } - lab5->setText(QString::number(ihsym)); if(ihsym < m_hsymStop) m_decode_called=false; if(ihsym >= m_hsymStop and !m_decode_called) { //Decode at t=56 s (for Q65 and data from disk) @@ -599,12 +600,6 @@ void MainWindow::createStatusBar() //createStatusBar lab4->setMinimumSize(QSize(50,10)); lab4->setFrameStyle(QFrame::Panel | QFrame::Sunken); statusBar()->addWidget(lab4); - - lab5 = new QLabel(""); - lab5->setAlignment(Qt::AlignHCenter); - lab5->setMinimumSize(QSize(50,10)); - lab5->setFrameStyle(QFrame::Panel | QFrame::Sunken); - statusBar()->addWidget(lab5); } void MainWindow::on_tolSpinBox_valueChanged(int i) //tolSpinBox @@ -738,8 +733,9 @@ void MainWindow::decoderFinished() //diskWriteFinished memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); mem_q65w.unlock(); QString t1; - t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); - lab3->setText(t1); +// t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); + t1=t1.asprintf(" %d ",decodes_.ndecodes); + lab4->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); } @@ -905,7 +901,7 @@ void MainWindow::decode() //decode() void MainWindow::on_EraseButton_clicked() { ui->decodedTextBrowser->clear(); - lab3->clear(); + lab4->clear(); } @@ -970,7 +966,6 @@ void MainWindow::guiUpdate() } else { lab2->setStyleSheet(""); } -// lab5->setText("Q65A"); if(m_monitoring) { @@ -1012,36 +1007,36 @@ void MainWindow::guiUpdate() void MainWindow::on_actionQ65A_triggered() { m_modeQ65=1; - lab4->setStyleSheet("QLabel{background-color: #ffb266}"); - lab4->setText("Q65-60A"); + lab3->setStyleSheet("QLabel{background-color: #ffb266}"); + lab3->setText("Q65-60A"); } void MainWindow::on_actionQ65B_triggered() { m_modeQ65=2; - lab4->setStyleSheet("QLabel{background-color: #b2ff66}"); - lab4->setText("Q65-60B"); + lab3->setStyleSheet("QLabel{background-color: #b2ff66}"); + lab3->setText("Q65-60B"); } void MainWindow::on_actionQ65C_triggered() { m_modeQ65=3; - lab4->setStyleSheet("QLabel{background-color: #66ffff}"); - lab4->setText("Q65-60C"); + lab3->setStyleSheet("QLabel{background-color: #66ffff}"); + lab3->setText("Q65-60C"); } void MainWindow::on_actionQ65D_triggered() { m_modeQ65=4; - lab4->setStyleSheet("QLabel{background-color: #b266ff}"); - lab4->setText("Q65-60D"); + lab3->setStyleSheet("QLabel{background-color: #b266ff}"); + lab3->setText("Q65-60D"); } void MainWindow::on_actionQ65E_triggered() { m_modeQ65=5; - lab4->setStyleSheet("QLabel{background-color: #ff66ff}"); - lab4->setText("Q65-60E"); + lab3->setStyleSheet("QLabel{background-color: #ff66ff}"); + lab3->setText("Q65-60E"); } From e72b39a9d9c3da980dad862c605723fd91fa8c76 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 14:43:29 -0500 Subject: [PATCH 194/251] More code cleanup. --- q65w/getfile.cpp | 2 +- q65w/mainwindow.cpp | 5 +---- q65w/soundin.cpp | 1 + q65w/widegraph.h | 4 ---- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/q65w/getfile.cpp b/q65w/getfile.cpp index f06d7c03d..c43fa8397 100644 --- a/q65w/getfile.cpp +++ b/q65w/getfile.cpp @@ -23,10 +23,10 @@ void getfile(QString fname, bool xpol, int dbDgrd) if(fp != NULL) { auto n = fread(&datcom_.fcenter,sizeof(datcom_.fcenter),1,fp); +// qDebug() << "aa0" << sizeof(datcom_.fcenter) << n << datcom_.fcenter; n = fread(id,2,npts,fp); Q_UNUSED (n); int j=0; -// qDebug() << "aaa" << datcom_.fcenter; if(dbDgrd<0) { for(int i=0; im_bForceCenterFreq) { - datcom_.fcenter=m_wide_graph_window->m_dForceCenterFreq; - } - hsym=2048.0*96000.0/11025.0; //Samples per JT65 half-symbol for(int i=0; i<304; i++) { // Do the half-symbol FFTs int k = i*hsym + 2048.5; diff --git a/q65w/soundin.cpp b/q65w/soundin.cpp index d6ba6e56a..2c194a809 100644 --- a/q65w/soundin.cpp +++ b/q65w/soundin.cpp @@ -211,6 +211,7 @@ void SoundInThread::inputUDP() int nsam=-1; recvpkt_(&nsam, &b.iblk, &b.nrx, &k, b.d8, b.d8); datcom_.fcenter=b.cfreq + m_fAdd; +// qDebug() << "aaa" << b.cfreq << m_fAdd << datcom_.fcenter; } m_hsym=(k-2048)*11025.0/(2048.0*m_rate); diff --git a/q65w/widegraph.h b/q65w/widegraph.h index 67614eeb0..e678a6646 100644 --- a/q65w/widegraph.h +++ b/q65w/widegraph.h @@ -59,12 +59,8 @@ private slots: private: Ui::WideGraph * ui; QString m_settings_filename; -public: - bool m_bForceCenterFreq; -private: bool m_bLockTxRx; public: - double m_dForceCenterFreq; double m_TxOffset; private: qint32 m_waterfallAvg; From 652bfb8429c0ccac748c4d2d4a3170c717c12d68 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 15:07:55 -0500 Subject: [PATCH 195/251] Remove the dependence on optionalfile q65_params.txt. --- lib/q65_decode.f90 | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index a22f23beb..9db8f8695 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -135,8 +135,9 @@ contains baud=12000.0/nsps this%callback => callback nFadingModel=1 - ibwa=2*mode_q65 - ibwb=ibwa+4 + + ibwa=max(1,int(1.8*log(baud*mode_q65)) + 5) + ibwb=min(15,ibwa+4) maxiters=40 if(iand(ndepth,3).eq.2) maxiters=60 if(iand(ndepth,3).eq.3) then @@ -144,17 +145,7 @@ contains ibwb=ibwb+2 maxiters=100 endif - inquire(file='q65_params.txt',exist=ex) - if(ex) then - open(28,file='q65_params.txt',status='old') - read(28,*) nq65param - ibwa=nq65param(1) - ibwb=nq65param(2) - maxiters=nq65param(3) - close(28) - endif -! write(*,3001) iand(ndepth,3),nsubmode,ibwa,ibwb,maxiters -!3001 format(5i5) + ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' From 61c1d8bcc56690a1b3019abebe4383ba633b416a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 15:44:53 -0500 Subject: [PATCH 196/251] Starting the name change from Q65W to QMAP. Now builds as qmap.exe. --- q65w/CMakeLists.txt | 10 +++++----- q65w/main.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index 4a326e981..b687bb64b 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -38,12 +38,12 @@ add_subdirectory (libq65) # UI generation qt5_wrap_ui (q65w_GENUISRCS ${q65w_UISRCS}) -add_executable (q65w ${q65w_CXXSRCS} ${q65w_CSRCS} ${q65w_GENUISRCS} q65w.rc) -target_include_directories (q65w PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) -target_link_libraries (q65w wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Usb::Usb) +add_executable (qmap ${q65w_CXXSRCS} ${q65w_CSRCS} ${q65w_GENUISRCS} q65w.rc) +target_include_directories (qmap PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) +target_link_libraries (qmap wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Usb::Usb) if (WSJT_CREATE_WINMAIN) - set_target_properties (q65w PROPERTIES WIN32_EXECUTABLE ON) + set_target_properties (qmap PROPERTIES WIN32_EXECUTABLE ON) endif (WSJT_CREATE_WINMAIN) if (WIN32) @@ -58,7 +58,7 @@ if (WIN32) ) install ( - TARGETS q65w + TARGETS qmap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION . COMPONENT runtime ) diff --git a/q65w/main.cpp b/q65w/main.cpp index eac86216d..f3f0880fd 100644 --- a/q65w/main.cpp +++ b/q65w/main.cpp @@ -28,8 +28,8 @@ int main(int argc, char *argv[]) ftninit_(); // Override programs executable basename as application name. - a.setApplicationName ("Q65W"); - a.setApplicationVersion ("0.1"); + a.setApplicationName ("QMAP"); + a.setApplicationVersion ("0.2"); // switch off as we share an Info.plist file with WSJT-X a.setAttribute (Qt::AA_DontUseNativeMenuBar); MainWindow w; From 039114468394279e117064620d2744e7a42104e3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 24 Jan 2023 16:06:31 -0500 Subject: [PATCH 197/251] Activate the frequency readout label. --- q65w/mainwindow.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 1777f7a42..6e320ad50 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -932,11 +932,12 @@ void MainWindow::guiUpdate() on_actionOpen_next_in_directory_triggered(); } + QString t1; if(decodes_.ndecodes > m_fetched) { while(m_fetcheddecodedTextBrowser->append(t1.repeated(46)); } m_UTC0=t.left(4); @@ -944,6 +945,9 @@ void MainWindow::guiUpdate() m_fetched++; } } + t1=""; + t1=t1.asprintf("%.3f",datcom_.fcenter); + ui->labFreq->setText(t1); if(nsec != m_sec0) { //Once per second static int n60z=99; From 935ad492e6a7e7ea6678a77087c87d3045946ae8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 08:51:51 -0500 Subject: [PATCH 198/251] Starting a long process of chnging names q65w to qmap. --- q65w/libq65/CMakeLists.txt | 2 +- q65w/libq65/decode0.f90 | 6 +++--- q65w/libq65/ftninit.f90 | 3 +-- q65w/libq65/{q65wa.f90 => qmapa.f90} | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) rename q65w/libq65/{q65wa.f90 => qmapa.f90} (97%) diff --git a/q65w/libq65/CMakeLists.txt b/q65w/libq65/CMakeLists.txt index e67b20149..15c62716e 100644 --- a/q65w/libq65/CMakeLists.txt +++ b/q65w/libq65/CMakeLists.txt @@ -23,7 +23,7 @@ set (libq65_FSRCS q65b.f90 q65c.f90 q65_sync.f90 - q65wa.f90 + qmapa.f90 recvpkt.f90 sun.f90 symspec.f90 diff --git a/q65w/libq65/decode0.f90 b/q65w/libq65/decode0.f90 index 058472890..56bf392bf 100644 --- a/q65w/libq65/decode0.f90 +++ b/q65w/libq65/decode0.f90 @@ -41,12 +41,12 @@ subroutine decode0(dd,ss,savg) hisgrid0=hisgrid neme0=neme - call timer('q65wa ',0) - call q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & + call timer('qmapa ',0) + call qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,nfshift,max_drift, & nfcal,mycall,hiscall,hisgrid,nfsample,nmode,ndepth, & datetime,ndop00,fselected) - call timer('q65wa ',1) + call timer('qmapa ',1) return end subroutine decode0 diff --git a/q65w/libq65/ftninit.f90 b/q65w/libq65/ftninit.f90 index 160c80771..35f358922 100644 --- a/q65w/libq65/ftninit.f90 +++ b/q65w/libq65/ftninit.f90 @@ -1,4 +1,3 @@ -!subroutine ftninit() subroutine ftninit use timer_impl, only: init_timer !,fini_timer, limtrace @@ -15,7 +14,7 @@ subroutine ftninit appd='.' addpfx=' ' - open(12,file=appd//'/all_q65w.txt',status='unknown',position='append') + open(12,file=appd//'/all_qmap.txt',status='unknown',position='append') open(17,file=appd//'/red.dat',status='unknown') open(19,file=appd//'/livecq.txt',status='unknown') open(71,file=appd//'/fort.71',status='unknown') diff --git a/q65w/libq65/q65wa.f90 b/q65w/libq65/qmapa.f90 similarity index 97% rename from q65w/libq65/q65wa.f90 rename to q65w/libq65/qmapa.f90 index d245d1e89..0515487a7 100644 --- a/q65w/libq65/q65wa.f90 +++ b/q65w/libq65/qmapa.f90 @@ -1,4 +1,4 @@ -subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & +subroutine qmapa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & mousedf,mousefqso,nagain,nfshift,max_drift,nfcal,mycall, & hiscall,hisgrid,nfsample,nmode,ndepth,datetime,ndop00,fselected) @@ -71,4 +71,4 @@ subroutine q65wa(dd,ss,savg,newdat,nutc,fcenter,ntol,nfa,nfb, & enddo ! icand return -end subroutine q65wa +end subroutine qmapa From a87c308823e97191e5b963e7e44eba1d74307dc3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 09:07:56 -0500 Subject: [PATCH 199/251] Next stage of renaming q65w to qmap. --- q65w/CMakeLists.txt | 20 ++++++++++---------- q65w/about.cpp | 4 ++-- q65w/mainwindow.cpp | 30 +++++++++++++++--------------- q65w/mainwindow.ui | 2 +- q65w/{q65w.pro => qmap.pro} | 2 +- q65w/{q65w.rc => qmap.rc} | 0 6 files changed, 29 insertions(+), 29 deletions(-) rename q65w/{q65w.pro => qmap.pro} (98%) rename q65w/{q65w.rc => qmap.rc} (100%) diff --git a/q65w/CMakeLists.txt b/q65w/CMakeLists.txt index b687bb64b..84bcfcc09 100644 --- a/q65w/CMakeLists.txt +++ b/q65w/CMakeLists.txt @@ -1,4 +1,4 @@ -set (q65w_CXXSRCS +set (qmap_CXXSRCS about.cpp astro.cpp devsetup.cpp @@ -14,10 +14,10 @@ set (q65w_CXXSRCS ) if (WIN32) - set (q65w_CXXSRCS ${q65w_CXXSRCS}) + set (qmap_CXXSRCS ${qmap_CXXSRCS}) endif (WIN32) -set (q65w_UISRCS +set (qmap_UISRCS about.ui astro.ui devsetup.ui @@ -25,20 +25,20 @@ set (q65w_UISRCS widegraph.ui ) -set (q65w_C_and_CXXSRCS - ${q65w_CSRCS} - ${q65w_CXXSRCS} +set (qmap_C_and_CXXSRCS + ${qmap_CSRCS} + ${qmap_CXXSRCS} ) -set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") -set_property (SOURCE ${q65w_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) +set_property (SOURCE ${qmap_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS " -include wsjtx_config.h") +set_property (SOURCE ${qmap_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) # build the subdirectories add_subdirectory (libq65) # UI generation -qt5_wrap_ui (q65w_GENUISRCS ${q65w_UISRCS}) +qt5_wrap_ui (qmap_GENUISRCS ${qmap_UISRCS}) -add_executable (qmap ${q65w_CXXSRCS} ${q65w_CSRCS} ${q65w_GENUISRCS} q65w.rc) +add_executable (qmap ${qmap_CXXSRCS} ${qmap_CSRCS} ${qmap_GENUISRCS} qmap.rc) target_include_directories (qmap PRIVATE ${CMAKE_SOURCE_DIR} ${FFTW3_INCLUDE_DIRS}) target_link_libraries (qmap wsjt_qt m65impl ${FFTW3_LIBRARIES} Qt5::Widgets Qt5::Network Usb::Usb) diff --git a/q65w/about.cpp b/q65w/about.cpp index 5ac318129..6c20e36b9 100644 --- a/q65w/about.cpp +++ b/q65w/about.cpp @@ -7,10 +7,10 @@ CAboutDlg::CAboutDlg(QWidget *parent) : ui(new Ui::CAboutDlg) { ui->setupUi(this); - ui->labelTxt->setText("

" + QString {"Q65W v" + ui->labelTxt->setText("

" + QString {"QMAP v" + QCoreApplication::applicationVersion () + " " + revision ()}.simplified () + "


" - "Q65W is a wideband receiver for the Q65 protocol,
" + "QMAP is a wideband receiver for the Q65 protocol,
" "intended primarily for amateur radio EME communication.

" "Copyright 2001-2023 by Joe Taylor, K1JT. Additional
" "acknowledgments are contained in the source code."); diff --git a/q65w/mainwindow.cpp b/q65w/mainwindow.cpp index 6e320ad50..53f2f12b6 100644 --- a/q65w/mainwindow.cpp +++ b/q65w/mainwindow.cpp @@ -21,7 +21,7 @@ qint16 id[2*60*96000]; -QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with WSJT-X +QSharedMemory mem_qmap("mem_qmap"); //Memory segment to be shared (optionally) with WSJT-X int* ipc_wsjtx; extern const int RxDataFrequency = 96000; @@ -31,7 +31,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_appDir {QApplication::applicationDirPath ()}, - m_settings_filename {m_appDir + "/q65w.ini"}, + m_settings_filename {m_appDir + "/qmap.ini"}, m_astro_window {new Astro {m_settings_filename}}, m_wide_graph_window {new WideGraph {m_settings_filename}}, m_gui_timer {new QTimer {this}} @@ -100,17 +100,17 @@ MainWindow::MainWindow(QWidget *parent) : //Attach or create a memory segment to be shared with WSJT-X. int memSize=4096; - if(!mem_q65w.attach()) { - if(!mem_q65w.create(memSize)) { - msgBox("Unable to create shared memory segment mem_q65w."); + if(!mem_qmap.attach()) { + if(!mem_qmap.create(memSize)) { + msgBox("Unable to create shared memory segment mem_qmap."); } } - ipc_wsjtx = (int*)mem_q65w.data(); - mem_q65w.lock(); + ipc_wsjtx = (int*)mem_qmap.data(); + mem_qmap.lock(); memset(ipc_wsjtx,0,memSize); //Zero all of shared memory - mem_q65w.unlock(); + mem_qmap.unlock(); - fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); + fftwf_import_wisdom_from_filename (QDir {m_appDir}.absoluteFilePath ("qmap_wisdom.dat").toLocal8Bit ()); readSettings(); //Restore user's setup params @@ -201,7 +201,7 @@ MainWindow::~MainWindow() soundInThread.quit(); soundInThread.wait(3000); } - fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("q65w_wisdom.dat").toLocal8Bit ()); + fftwf_export_wisdom_to_filename (QDir {m_appDir}.absoluteFilePath ("qmap_wisdom.dat").toLocal8Bit ()); delete ui; } @@ -646,7 +646,7 @@ void MainWindow::on_actionOpen_triggered() //Open File soundInThread.setMonitoring(m_monitoring); QString fname; fname=QFileDialog::getOpenFileName(this, "Open File", m_path, - "MAP65/Q65W Files (*.iq)"); + "MAP65/QMAP Files (*.iq)"); if(fname != "") { m_path=fname; int i; @@ -726,9 +726,9 @@ void MainWindow::decoderFinished() //diskWriteFinished decodeBusy(false); decodes_.nQDecoderDone=1; if(m_diskData) decodes_.nQDecoderDone=2; - mem_q65w.lock(); + mem_qmap.lock(); memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); - mem_q65w.unlock(); + mem_qmap.unlock(); QString t1; // t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); t1=t1.asprintf(" %d ",decodes_.ndecodes); @@ -953,9 +953,9 @@ void MainWindow::guiUpdate() static int n60z=99; int n60=nsec%60; int itest[5]; - mem_q65w.lock(); + mem_qmap.lock(); memcpy(&itest, (char*)ipc_wsjtx, 20); - mem_q65w.unlock(); + mem_qmap.unlock(); if(itest[4]==1) m_nTransmitted++; // qDebug() << "AAA" << n60 << itest[0] << itest[1] << itest[2] << itest[3] << itest[4] // << m_nTransmitted; diff --git a/q65w/mainwindow.ui b/q65w/mainwindow.ui index a28dd1045..0e06e4b22 100644 --- a/q65w/mainwindow.ui +++ b/q65w/mainwindow.ui @@ -458,7 +458,7 @@ p, li { white-space: pre-wrap; } - About Q65W + About QMAP Ctrl+F1 diff --git a/q65w/q65w.pro b/q65w/qmap.pro similarity index 98% rename from q65w/q65w.pro rename to q65w/qmap.pro index 4dbd96ab6..3bc2b6812 100644 --- a/q65w/q65w.pro +++ b/q65w/qmap.pro @@ -9,7 +9,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += thread #CONFIG += console -TARGET = q65w +TARGET = qmap VERSION = 0.1 TEMPLATE = app DEFINES = QT5 diff --git a/q65w/q65w.rc b/q65w/qmap.rc similarity index 100% rename from q65w/q65w.rc rename to q65w/qmap.rc From 6979a56d5d8f5f8dc684e5935b7ab54e89646884 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 10:07:07 -0500 Subject: [PATCH 200/251] Another stage in the renaming process, Q65W -> QMAP. It this all? --- CMakeLists.txt | 4 ++-- {q65w => qmap}/.gitignore | 0 {q65w => qmap}/CMakeLists.txt | 2 +- {q65w => qmap}/LICENSE_WHEATLEY.TXT | 0 {q65w => qmap}/MAP65_Beta_Release.docx | Bin {q65w => qmap}/about.cpp | 0 {q65w => qmap}/about.h | 0 {q65w => qmap}/about.ui | 0 {q65w => qmap}/afmhot.dat | 0 {q65w => qmap}/astro.cpp | 0 {q65w => qmap}/astro.h | 0 {q65w => qmap}/astro.ui | 0 {q65w => qmap}/blue.dat | 0 {q65w => qmap}/commons.h | 0 {q65w => qmap}/devsetup.cpp | 0 {q65w => qmap}/devsetup.h | 0 {q65w => qmap}/devsetup.ui | 0 {q65w => qmap}/displaytext.cpp | 0 {q65w => qmap}/displaytext.h | 0 {q65w => qmap}/ffft.f | 0 {q65w => qmap}/ft2000_freq.sh | 0 {q65w => qmap}/getfile.cpp | 0 {q65w => qmap}/getfile.h | 0 {q65w => qmap}/getsvn.cmake | 0 {q65w => qmap}/in.dat | 0 {q65w/libq65 => qmap/libqmap}/CMakeLists.txt | 0 {q65w/libq65 => qmap/libqmap}/astro.f90 | 0 {q65w/libq65 => qmap/libqmap}/astro0.f90 | 0 {q65w/libq65 => qmap/libqmap}/astrosub.f90 | 0 {q65w/libq65 => qmap/libqmap}/dcoord.f90 | 0 {q65w/libq65 => qmap/libqmap}/decode0.f90 | 0 {q65w/libq65 => qmap/libqmap}/dot.f90 | 0 {q65w/libq65 => qmap/libqmap}/f77_wisdom.f | 0 {q65w/libq65 => qmap/libqmap}/fchisq0.f90 | 0 {q65w/libq65 => qmap/libqmap}/fftw3.f | 0 {q65w/libq65 => qmap/libqmap}/fftw3.f90 | 0 {q65w/libq65 => qmap/libqmap}/filbig.f90 | 0 {q65w/libq65 => qmap/libqmap}/four2a.f90 | 0 {q65w/libq65 => qmap/libqmap}/ftninit.f90 | 0 {q65w/libq65 => qmap/libqmap}/ftnquit.f90 | 0 {q65w/libq65 => qmap/libqmap}/geocentric.f90 | 0 {q65w/libq65 => qmap/libqmap}/getcand2.f90 | 0 {q65w/libq65 => qmap/libqmap}/getdphi.f90 | 0 {q65w/libq65 => qmap/libqmap}/grid2deg.f90 | 0 {q65w/libq65 => qmap/libqmap}/indexx.f90 | 0 {q65w/libq65 => qmap/libqmap}/lorentzian.f90 | 0 {q65w/libq65 => qmap/libqmap}/moon2.f90 | 0 {q65w/libq65 => qmap/libqmap}/moondop.f90 | 0 {q65w/libq65 => qmap/libqmap}/msgs.txt | 0 {q65w/libq65 => qmap/libqmap}/njunk.f90 | 0 {q65w/libq65 => qmap/libqmap}/pfx.f90 | 0 {q65w/libq65 => qmap/libqmap}/q65_sync.f90 | 0 {q65w/libq65 => qmap/libqmap}/q65b.f90 | 4 ++-- {q65w/libq65 => qmap/libqmap}/q65c.f90 | 0 {q65w/libq65 => qmap/libqmap}/qmapa.f90 | 0 {q65w/libq65 => qmap/libqmap}/recvpkt.f90 | 0 {q65w/libq65 => qmap/libqmap}/rfile3a.f90 | 0 {q65w/libq65 => qmap/libqmap}/set.f90 | 0 {q65w/libq65 => qmap/libqmap}/shell.f90 | 0 {q65w/libq65 => qmap/libqmap}/sleep_msec.f90 | 0 {q65w/libq65 => qmap/libqmap}/smo.f90 | 0 {q65w/libq65 => qmap/libqmap}/sort.f90 | 0 {q65w/libq65 => qmap/libqmap}/ssort.f | 0 {q65w/libq65 => qmap/libqmap}/sun.f90 | 0 {q65w/libq65 => qmap/libqmap}/symspec.f90 | 0 {q65w/libq65 => qmap/libqmap}/synctst.f90 | 0 {q65w/libq65 => qmap/libqmap}/synctst2.f90 | 0 {q65w/libq65 => qmap/libqmap}/tastro.f90 | 0 {q65w/libq65 => qmap/libqmap}/timf2.f90 | 0 {q65w/libq65 => qmap/libqmap}/tm2.f90 | 0 {q65w/libq65 => qmap/libqmap}/toxyz.f90 | 0 {q65w/libq65 => qmap/libqmap}/twkfreq.f90 | 0 {q65w/libq65 => qmap/libqmap}/twkfreq_xy.f90 | 0 {q65w/libq65 => qmap/libqmap}/zplot.f90 | 0 {q65w => qmap}/main.cpp | 0 {q65w => qmap}/mainwindow.cpp | 0 {q65w => qmap}/mainwindow.h | 0 {q65w => qmap}/mainwindow.ui | 0 {q65w => qmap}/map65_config.h.in | 0 {q65w => qmap}/meterwidget.cpp | 0 {q65w => qmap}/meterwidget.h | 0 {q65w => qmap}/plotter.cpp | 0 {q65w => qmap}/plotter.h | 0 {q65w => qmap}/qmap.pro | 0 {q65w => qmap}/qmap.rc | 0 {q65w => qmap}/resources/CALL3.TXT | 0 {q65w => qmap}/resources/README.qthid.txt | 0 {q65w => qmap}/resources/qt.conf | 0 .../resources/qthid/AUTHORS.qthid.4.1.txt | 0 {q65w => qmap}/resources/qthid/AUTHORS.qthid4.0.txt | 0 {q65w => qmap}/resources/qthid/LICENSE.txt | 0 {q65w => qmap}/resources/qthid/NEWS.qhid-4.0.txt | 0 {q65w => qmap}/resources/qthid/NEWS.qthid-4.1.txt | 0 {q65w => qmap}/resources/qthid/README-qthid-4.1.txt | 0 {q65w => qmap}/resources/qthid/README.qthid-4.0.txt | 0 {q65w => qmap}/resources/wisdom1.bat | 0 {q65w => qmap}/resources/wisdom2.bat | 0 {q65w => qmap}/signalmeter.cpp | 0 {q65w => qmap}/signalmeter.h | 0 {q65w => qmap}/sleep.h | 0 {q65w => qmap}/soundin.cpp | 0 {q65w => qmap}/soundin.h | 0 {q65w => qmap}/ss.bat | 0 {q65w => qmap}/sss.bat | 0 {q65w => qmap}/widegraph.cpp | 0 {q65w => qmap}/widegraph.h | 0 {q65w => qmap}/widegraph.ui | 0 {q65w => qmap}/wsjt.ico | Bin 108 files changed, 5 insertions(+), 5 deletions(-) rename {q65w => qmap}/.gitignore (100%) rename {q65w => qmap}/CMakeLists.txt (98%) rename {q65w => qmap}/LICENSE_WHEATLEY.TXT (100%) rename {q65w => qmap}/MAP65_Beta_Release.docx (100%) rename {q65w => qmap}/about.cpp (100%) rename {q65w => qmap}/about.h (100%) rename {q65w => qmap}/about.ui (100%) rename {q65w => qmap}/afmhot.dat (100%) rename {q65w => qmap}/astro.cpp (100%) rename {q65w => qmap}/astro.h (100%) rename {q65w => qmap}/astro.ui (100%) rename {q65w => qmap}/blue.dat (100%) rename {q65w => qmap}/commons.h (100%) rename {q65w => qmap}/devsetup.cpp (100%) rename {q65w => qmap}/devsetup.h (100%) rename {q65w => qmap}/devsetup.ui (100%) rename {q65w => qmap}/displaytext.cpp (100%) rename {q65w => qmap}/displaytext.h (100%) rename {q65w => qmap}/ffft.f (100%) rename {q65w => qmap}/ft2000_freq.sh (100%) rename {q65w => qmap}/getfile.cpp (100%) rename {q65w => qmap}/getfile.h (100%) rename {q65w => qmap}/getsvn.cmake (100%) rename {q65w => qmap}/in.dat (100%) rename {q65w/libq65 => qmap/libqmap}/CMakeLists.txt (100%) rename {q65w/libq65 => qmap/libqmap}/astro.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/astro0.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/astrosub.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/dcoord.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/decode0.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/dot.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/f77_wisdom.f (100%) rename {q65w/libq65 => qmap/libqmap}/fchisq0.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/fftw3.f (100%) rename {q65w/libq65 => qmap/libqmap}/fftw3.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/filbig.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/four2a.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/ftninit.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/ftnquit.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/geocentric.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/getcand2.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/getdphi.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/grid2deg.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/indexx.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/lorentzian.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/moon2.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/moondop.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/msgs.txt (100%) rename {q65w/libq65 => qmap/libqmap}/njunk.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/pfx.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/q65_sync.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/q65b.f90 (96%) rename {q65w/libq65 => qmap/libqmap}/q65c.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/qmapa.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/recvpkt.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/rfile3a.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/set.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/shell.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/sleep_msec.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/smo.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/sort.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/ssort.f (100%) rename {q65w/libq65 => qmap/libqmap}/sun.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/symspec.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/synctst.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/synctst2.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/tastro.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/timf2.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/tm2.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/toxyz.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/twkfreq.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/twkfreq_xy.f90 (100%) rename {q65w/libq65 => qmap/libqmap}/zplot.f90 (100%) rename {q65w => qmap}/main.cpp (100%) rename {q65w => qmap}/mainwindow.cpp (100%) rename {q65w => qmap}/mainwindow.h (100%) rename {q65w => qmap}/mainwindow.ui (100%) rename {q65w => qmap}/map65_config.h.in (100%) rename {q65w => qmap}/meterwidget.cpp (100%) rename {q65w => qmap}/meterwidget.h (100%) rename {q65w => qmap}/plotter.cpp (100%) rename {q65w => qmap}/plotter.h (100%) rename {q65w => qmap}/qmap.pro (100%) rename {q65w => qmap}/qmap.rc (100%) rename {q65w => qmap}/resources/CALL3.TXT (100%) rename {q65w => qmap}/resources/README.qthid.txt (100%) rename {q65w => qmap}/resources/qt.conf (100%) rename {q65w => qmap}/resources/qthid/AUTHORS.qthid.4.1.txt (100%) rename {q65w => qmap}/resources/qthid/AUTHORS.qthid4.0.txt (100%) rename {q65w => qmap}/resources/qthid/LICENSE.txt (100%) rename {q65w => qmap}/resources/qthid/NEWS.qhid-4.0.txt (100%) rename {q65w => qmap}/resources/qthid/NEWS.qthid-4.1.txt (100%) rename {q65w => qmap}/resources/qthid/README-qthid-4.1.txt (100%) rename {q65w => qmap}/resources/qthid/README.qthid-4.0.txt (100%) rename {q65w => qmap}/resources/wisdom1.bat (100%) rename {q65w => qmap}/resources/wisdom2.bat (100%) rename {q65w => qmap}/signalmeter.cpp (100%) rename {q65w => qmap}/signalmeter.h (100%) rename {q65w => qmap}/sleep.h (100%) rename {q65w => qmap}/soundin.cpp (100%) rename {q65w => qmap}/soundin.h (100%) rename {q65w => qmap}/ss.bat (100%) rename {q65w => qmap}/sss.bat (100%) rename {q65w => qmap}/widegraph.cpp (100%) rename {q65w => qmap}/widegraph.h (100%) rename {q65w => qmap}/widegraph.ui (100%) rename {q65w => qmap}/wsjt.ico (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b816b809..19de564e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1424,9 +1424,9 @@ endif (${OPENMP_FOUND} OR APPLE) if (WIN32) find_package (Portaudio REQUIRED) -# build map65 OR q65w +# build map65 OR qmap # add_subdirectory (map65) - add_subdirectory (q65w) + add_subdirectory (qmap) endif () # build the main application diff --git a/q65w/.gitignore b/qmap/.gitignore similarity index 100% rename from q65w/.gitignore rename to qmap/.gitignore diff --git a/q65w/CMakeLists.txt b/qmap/CMakeLists.txt similarity index 98% rename from q65w/CMakeLists.txt rename to qmap/CMakeLists.txt index 84bcfcc09..3494f54ba 100644 --- a/q65w/CMakeLists.txt +++ b/qmap/CMakeLists.txt @@ -33,7 +33,7 @@ set_property (SOURCE ${qmap_C_and_CXXSRCS} APPEND_STRING PROPERTY COMPILE_FLAGS set_property (SOURCE ${qmap_C_and_CXXSRCS} APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/wsjtx_config.h) # build the subdirectories -add_subdirectory (libq65) +add_subdirectory (libqmap) # UI generation qt5_wrap_ui (qmap_GENUISRCS ${qmap_UISRCS}) diff --git a/q65w/LICENSE_WHEATLEY.TXT b/qmap/LICENSE_WHEATLEY.TXT similarity index 100% rename from q65w/LICENSE_WHEATLEY.TXT rename to qmap/LICENSE_WHEATLEY.TXT diff --git a/q65w/MAP65_Beta_Release.docx b/qmap/MAP65_Beta_Release.docx similarity index 100% rename from q65w/MAP65_Beta_Release.docx rename to qmap/MAP65_Beta_Release.docx diff --git a/q65w/about.cpp b/qmap/about.cpp similarity index 100% rename from q65w/about.cpp rename to qmap/about.cpp diff --git a/q65w/about.h b/qmap/about.h similarity index 100% rename from q65w/about.h rename to qmap/about.h diff --git a/q65w/about.ui b/qmap/about.ui similarity index 100% rename from q65w/about.ui rename to qmap/about.ui diff --git a/q65w/afmhot.dat b/qmap/afmhot.dat similarity index 100% rename from q65w/afmhot.dat rename to qmap/afmhot.dat diff --git a/q65w/astro.cpp b/qmap/astro.cpp similarity index 100% rename from q65w/astro.cpp rename to qmap/astro.cpp diff --git a/q65w/astro.h b/qmap/astro.h similarity index 100% rename from q65w/astro.h rename to qmap/astro.h diff --git a/q65w/astro.ui b/qmap/astro.ui similarity index 100% rename from q65w/astro.ui rename to qmap/astro.ui diff --git a/q65w/blue.dat b/qmap/blue.dat similarity index 100% rename from q65w/blue.dat rename to qmap/blue.dat diff --git a/q65w/commons.h b/qmap/commons.h similarity index 100% rename from q65w/commons.h rename to qmap/commons.h diff --git a/q65w/devsetup.cpp b/qmap/devsetup.cpp similarity index 100% rename from q65w/devsetup.cpp rename to qmap/devsetup.cpp diff --git a/q65w/devsetup.h b/qmap/devsetup.h similarity index 100% rename from q65w/devsetup.h rename to qmap/devsetup.h diff --git a/q65w/devsetup.ui b/qmap/devsetup.ui similarity index 100% rename from q65w/devsetup.ui rename to qmap/devsetup.ui diff --git a/q65w/displaytext.cpp b/qmap/displaytext.cpp similarity index 100% rename from q65w/displaytext.cpp rename to qmap/displaytext.cpp diff --git a/q65w/displaytext.h b/qmap/displaytext.h similarity index 100% rename from q65w/displaytext.h rename to qmap/displaytext.h diff --git a/q65w/ffft.f b/qmap/ffft.f similarity index 100% rename from q65w/ffft.f rename to qmap/ffft.f diff --git a/q65w/ft2000_freq.sh b/qmap/ft2000_freq.sh similarity index 100% rename from q65w/ft2000_freq.sh rename to qmap/ft2000_freq.sh diff --git a/q65w/getfile.cpp b/qmap/getfile.cpp similarity index 100% rename from q65w/getfile.cpp rename to qmap/getfile.cpp diff --git a/q65w/getfile.h b/qmap/getfile.h similarity index 100% rename from q65w/getfile.h rename to qmap/getfile.h diff --git a/q65w/getsvn.cmake b/qmap/getsvn.cmake similarity index 100% rename from q65w/getsvn.cmake rename to qmap/getsvn.cmake diff --git a/q65w/in.dat b/qmap/in.dat similarity index 100% rename from q65w/in.dat rename to qmap/in.dat diff --git a/q65w/libq65/CMakeLists.txt b/qmap/libqmap/CMakeLists.txt similarity index 100% rename from q65w/libq65/CMakeLists.txt rename to qmap/libqmap/CMakeLists.txt diff --git a/q65w/libq65/astro.f90 b/qmap/libqmap/astro.f90 similarity index 100% rename from q65w/libq65/astro.f90 rename to qmap/libqmap/astro.f90 diff --git a/q65w/libq65/astro0.f90 b/qmap/libqmap/astro0.f90 similarity index 100% rename from q65w/libq65/astro0.f90 rename to qmap/libqmap/astro0.f90 diff --git a/q65w/libq65/astrosub.f90 b/qmap/libqmap/astrosub.f90 similarity index 100% rename from q65w/libq65/astrosub.f90 rename to qmap/libqmap/astrosub.f90 diff --git a/q65w/libq65/dcoord.f90 b/qmap/libqmap/dcoord.f90 similarity index 100% rename from q65w/libq65/dcoord.f90 rename to qmap/libqmap/dcoord.f90 diff --git a/q65w/libq65/decode0.f90 b/qmap/libqmap/decode0.f90 similarity index 100% rename from q65w/libq65/decode0.f90 rename to qmap/libqmap/decode0.f90 diff --git a/q65w/libq65/dot.f90 b/qmap/libqmap/dot.f90 similarity index 100% rename from q65w/libq65/dot.f90 rename to qmap/libqmap/dot.f90 diff --git a/q65w/libq65/f77_wisdom.f b/qmap/libqmap/f77_wisdom.f similarity index 100% rename from q65w/libq65/f77_wisdom.f rename to qmap/libqmap/f77_wisdom.f diff --git a/q65w/libq65/fchisq0.f90 b/qmap/libqmap/fchisq0.f90 similarity index 100% rename from q65w/libq65/fchisq0.f90 rename to qmap/libqmap/fchisq0.f90 diff --git a/q65w/libq65/fftw3.f b/qmap/libqmap/fftw3.f similarity index 100% rename from q65w/libq65/fftw3.f rename to qmap/libqmap/fftw3.f diff --git a/q65w/libq65/fftw3.f90 b/qmap/libqmap/fftw3.f90 similarity index 100% rename from q65w/libq65/fftw3.f90 rename to qmap/libqmap/fftw3.f90 diff --git a/q65w/libq65/filbig.f90 b/qmap/libqmap/filbig.f90 similarity index 100% rename from q65w/libq65/filbig.f90 rename to qmap/libqmap/filbig.f90 diff --git a/q65w/libq65/four2a.f90 b/qmap/libqmap/four2a.f90 similarity index 100% rename from q65w/libq65/four2a.f90 rename to qmap/libqmap/four2a.f90 diff --git a/q65w/libq65/ftninit.f90 b/qmap/libqmap/ftninit.f90 similarity index 100% rename from q65w/libq65/ftninit.f90 rename to qmap/libqmap/ftninit.f90 diff --git a/q65w/libq65/ftnquit.f90 b/qmap/libqmap/ftnquit.f90 similarity index 100% rename from q65w/libq65/ftnquit.f90 rename to qmap/libqmap/ftnquit.f90 diff --git a/q65w/libq65/geocentric.f90 b/qmap/libqmap/geocentric.f90 similarity index 100% rename from q65w/libq65/geocentric.f90 rename to qmap/libqmap/geocentric.f90 diff --git a/q65w/libq65/getcand2.f90 b/qmap/libqmap/getcand2.f90 similarity index 100% rename from q65w/libq65/getcand2.f90 rename to qmap/libqmap/getcand2.f90 diff --git a/q65w/libq65/getdphi.f90 b/qmap/libqmap/getdphi.f90 similarity index 100% rename from q65w/libq65/getdphi.f90 rename to qmap/libqmap/getdphi.f90 diff --git a/q65w/libq65/grid2deg.f90 b/qmap/libqmap/grid2deg.f90 similarity index 100% rename from q65w/libq65/grid2deg.f90 rename to qmap/libqmap/grid2deg.f90 diff --git a/q65w/libq65/indexx.f90 b/qmap/libqmap/indexx.f90 similarity index 100% rename from q65w/libq65/indexx.f90 rename to qmap/libqmap/indexx.f90 diff --git a/q65w/libq65/lorentzian.f90 b/qmap/libqmap/lorentzian.f90 similarity index 100% rename from q65w/libq65/lorentzian.f90 rename to qmap/libqmap/lorentzian.f90 diff --git a/q65w/libq65/moon2.f90 b/qmap/libqmap/moon2.f90 similarity index 100% rename from q65w/libq65/moon2.f90 rename to qmap/libqmap/moon2.f90 diff --git a/q65w/libq65/moondop.f90 b/qmap/libqmap/moondop.f90 similarity index 100% rename from q65w/libq65/moondop.f90 rename to qmap/libqmap/moondop.f90 diff --git a/q65w/libq65/msgs.txt b/qmap/libqmap/msgs.txt similarity index 100% rename from q65w/libq65/msgs.txt rename to qmap/libqmap/msgs.txt diff --git a/q65w/libq65/njunk.f90 b/qmap/libqmap/njunk.f90 similarity index 100% rename from q65w/libq65/njunk.f90 rename to qmap/libqmap/njunk.f90 diff --git a/q65w/libq65/pfx.f90 b/qmap/libqmap/pfx.f90 similarity index 100% rename from q65w/libq65/pfx.f90 rename to qmap/libqmap/pfx.f90 diff --git a/q65w/libq65/q65_sync.f90 b/qmap/libqmap/q65_sync.f90 similarity index 100% rename from q65w/libq65/q65_sync.f90 rename to qmap/libqmap/q65_sync.f90 diff --git a/q65w/libq65/q65b.f90 b/qmap/libqmap/q65b.f90 similarity index 96% rename from q65w/libq65/q65b.f90 rename to qmap/libqmap/q65b.f90 index 61004492b..b5f3ee2e3 100644 --- a/q65w/libq65/q65b.f90 +++ b/qmap/libqmap/q65b.f90 @@ -2,8 +2,8 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,nkhz_center, newdat,nagain, & max_drift,ndepth,datetime,ndop00,idec) -! This routine provides an interface between Q65W and the Q65 decoder -! in WSJT-X. All arguments are input data obtained from the Q65W GUI. +! This routine provides an interface between QMAP and the Q65 decoder +! in WSJT-X. All arguments are input data obtained from the QMAP GUI. ! Raw Rx data are available as the 96 kHz complex spectrum ca(MAXFFT1) ! in common/cacb. Decoded messages are sent back to the GUI. diff --git a/q65w/libq65/q65c.f90 b/qmap/libqmap/q65c.f90 similarity index 100% rename from q65w/libq65/q65c.f90 rename to qmap/libqmap/q65c.f90 diff --git a/q65w/libq65/qmapa.f90 b/qmap/libqmap/qmapa.f90 similarity index 100% rename from q65w/libq65/qmapa.f90 rename to qmap/libqmap/qmapa.f90 diff --git a/q65w/libq65/recvpkt.f90 b/qmap/libqmap/recvpkt.f90 similarity index 100% rename from q65w/libq65/recvpkt.f90 rename to qmap/libqmap/recvpkt.f90 diff --git a/q65w/libq65/rfile3a.f90 b/qmap/libqmap/rfile3a.f90 similarity index 100% rename from q65w/libq65/rfile3a.f90 rename to qmap/libqmap/rfile3a.f90 diff --git a/q65w/libq65/set.f90 b/qmap/libqmap/set.f90 similarity index 100% rename from q65w/libq65/set.f90 rename to qmap/libqmap/set.f90 diff --git a/q65w/libq65/shell.f90 b/qmap/libqmap/shell.f90 similarity index 100% rename from q65w/libq65/shell.f90 rename to qmap/libqmap/shell.f90 diff --git a/q65w/libq65/sleep_msec.f90 b/qmap/libqmap/sleep_msec.f90 similarity index 100% rename from q65w/libq65/sleep_msec.f90 rename to qmap/libqmap/sleep_msec.f90 diff --git a/q65w/libq65/smo.f90 b/qmap/libqmap/smo.f90 similarity index 100% rename from q65w/libq65/smo.f90 rename to qmap/libqmap/smo.f90 diff --git a/q65w/libq65/sort.f90 b/qmap/libqmap/sort.f90 similarity index 100% rename from q65w/libq65/sort.f90 rename to qmap/libqmap/sort.f90 diff --git a/q65w/libq65/ssort.f b/qmap/libqmap/ssort.f similarity index 100% rename from q65w/libq65/ssort.f rename to qmap/libqmap/ssort.f diff --git a/q65w/libq65/sun.f90 b/qmap/libqmap/sun.f90 similarity index 100% rename from q65w/libq65/sun.f90 rename to qmap/libqmap/sun.f90 diff --git a/q65w/libq65/symspec.f90 b/qmap/libqmap/symspec.f90 similarity index 100% rename from q65w/libq65/symspec.f90 rename to qmap/libqmap/symspec.f90 diff --git a/q65w/libq65/synctst.f90 b/qmap/libqmap/synctst.f90 similarity index 100% rename from q65w/libq65/synctst.f90 rename to qmap/libqmap/synctst.f90 diff --git a/q65w/libq65/synctst2.f90 b/qmap/libqmap/synctst2.f90 similarity index 100% rename from q65w/libq65/synctst2.f90 rename to qmap/libqmap/synctst2.f90 diff --git a/q65w/libq65/tastro.f90 b/qmap/libqmap/tastro.f90 similarity index 100% rename from q65w/libq65/tastro.f90 rename to qmap/libqmap/tastro.f90 diff --git a/q65w/libq65/timf2.f90 b/qmap/libqmap/timf2.f90 similarity index 100% rename from q65w/libq65/timf2.f90 rename to qmap/libqmap/timf2.f90 diff --git a/q65w/libq65/tm2.f90 b/qmap/libqmap/tm2.f90 similarity index 100% rename from q65w/libq65/tm2.f90 rename to qmap/libqmap/tm2.f90 diff --git a/q65w/libq65/toxyz.f90 b/qmap/libqmap/toxyz.f90 similarity index 100% rename from q65w/libq65/toxyz.f90 rename to qmap/libqmap/toxyz.f90 diff --git a/q65w/libq65/twkfreq.f90 b/qmap/libqmap/twkfreq.f90 similarity index 100% rename from q65w/libq65/twkfreq.f90 rename to qmap/libqmap/twkfreq.f90 diff --git a/q65w/libq65/twkfreq_xy.f90 b/qmap/libqmap/twkfreq_xy.f90 similarity index 100% rename from q65w/libq65/twkfreq_xy.f90 rename to qmap/libqmap/twkfreq_xy.f90 diff --git a/q65w/libq65/zplot.f90 b/qmap/libqmap/zplot.f90 similarity index 100% rename from q65w/libq65/zplot.f90 rename to qmap/libqmap/zplot.f90 diff --git a/q65w/main.cpp b/qmap/main.cpp similarity index 100% rename from q65w/main.cpp rename to qmap/main.cpp diff --git a/q65w/mainwindow.cpp b/qmap/mainwindow.cpp similarity index 100% rename from q65w/mainwindow.cpp rename to qmap/mainwindow.cpp diff --git a/q65w/mainwindow.h b/qmap/mainwindow.h similarity index 100% rename from q65w/mainwindow.h rename to qmap/mainwindow.h diff --git a/q65w/mainwindow.ui b/qmap/mainwindow.ui similarity index 100% rename from q65w/mainwindow.ui rename to qmap/mainwindow.ui diff --git a/q65w/map65_config.h.in b/qmap/map65_config.h.in similarity index 100% rename from q65w/map65_config.h.in rename to qmap/map65_config.h.in diff --git a/q65w/meterwidget.cpp b/qmap/meterwidget.cpp similarity index 100% rename from q65w/meterwidget.cpp rename to qmap/meterwidget.cpp diff --git a/q65w/meterwidget.h b/qmap/meterwidget.h similarity index 100% rename from q65w/meterwidget.h rename to qmap/meterwidget.h diff --git a/q65w/plotter.cpp b/qmap/plotter.cpp similarity index 100% rename from q65w/plotter.cpp rename to qmap/plotter.cpp diff --git a/q65w/plotter.h b/qmap/plotter.h similarity index 100% rename from q65w/plotter.h rename to qmap/plotter.h diff --git a/q65w/qmap.pro b/qmap/qmap.pro similarity index 100% rename from q65w/qmap.pro rename to qmap/qmap.pro diff --git a/q65w/qmap.rc b/qmap/qmap.rc similarity index 100% rename from q65w/qmap.rc rename to qmap/qmap.rc diff --git a/q65w/resources/CALL3.TXT b/qmap/resources/CALL3.TXT similarity index 100% rename from q65w/resources/CALL3.TXT rename to qmap/resources/CALL3.TXT diff --git a/q65w/resources/README.qthid.txt b/qmap/resources/README.qthid.txt similarity index 100% rename from q65w/resources/README.qthid.txt rename to qmap/resources/README.qthid.txt diff --git a/q65w/resources/qt.conf b/qmap/resources/qt.conf similarity index 100% rename from q65w/resources/qt.conf rename to qmap/resources/qt.conf diff --git a/q65w/resources/qthid/AUTHORS.qthid.4.1.txt b/qmap/resources/qthid/AUTHORS.qthid.4.1.txt similarity index 100% rename from q65w/resources/qthid/AUTHORS.qthid.4.1.txt rename to qmap/resources/qthid/AUTHORS.qthid.4.1.txt diff --git a/q65w/resources/qthid/AUTHORS.qthid4.0.txt b/qmap/resources/qthid/AUTHORS.qthid4.0.txt similarity index 100% rename from q65w/resources/qthid/AUTHORS.qthid4.0.txt rename to qmap/resources/qthid/AUTHORS.qthid4.0.txt diff --git a/q65w/resources/qthid/LICENSE.txt b/qmap/resources/qthid/LICENSE.txt similarity index 100% rename from q65w/resources/qthid/LICENSE.txt rename to qmap/resources/qthid/LICENSE.txt diff --git a/q65w/resources/qthid/NEWS.qhid-4.0.txt b/qmap/resources/qthid/NEWS.qhid-4.0.txt similarity index 100% rename from q65w/resources/qthid/NEWS.qhid-4.0.txt rename to qmap/resources/qthid/NEWS.qhid-4.0.txt diff --git a/q65w/resources/qthid/NEWS.qthid-4.1.txt b/qmap/resources/qthid/NEWS.qthid-4.1.txt similarity index 100% rename from q65w/resources/qthid/NEWS.qthid-4.1.txt rename to qmap/resources/qthid/NEWS.qthid-4.1.txt diff --git a/q65w/resources/qthid/README-qthid-4.1.txt b/qmap/resources/qthid/README-qthid-4.1.txt similarity index 100% rename from q65w/resources/qthid/README-qthid-4.1.txt rename to qmap/resources/qthid/README-qthid-4.1.txt diff --git a/q65w/resources/qthid/README.qthid-4.0.txt b/qmap/resources/qthid/README.qthid-4.0.txt similarity index 100% rename from q65w/resources/qthid/README.qthid-4.0.txt rename to qmap/resources/qthid/README.qthid-4.0.txt diff --git a/q65w/resources/wisdom1.bat b/qmap/resources/wisdom1.bat similarity index 100% rename from q65w/resources/wisdom1.bat rename to qmap/resources/wisdom1.bat diff --git a/q65w/resources/wisdom2.bat b/qmap/resources/wisdom2.bat similarity index 100% rename from q65w/resources/wisdom2.bat rename to qmap/resources/wisdom2.bat diff --git a/q65w/signalmeter.cpp b/qmap/signalmeter.cpp similarity index 100% rename from q65w/signalmeter.cpp rename to qmap/signalmeter.cpp diff --git a/q65w/signalmeter.h b/qmap/signalmeter.h similarity index 100% rename from q65w/signalmeter.h rename to qmap/signalmeter.h diff --git a/q65w/sleep.h b/qmap/sleep.h similarity index 100% rename from q65w/sleep.h rename to qmap/sleep.h diff --git a/q65w/soundin.cpp b/qmap/soundin.cpp similarity index 100% rename from q65w/soundin.cpp rename to qmap/soundin.cpp diff --git a/q65w/soundin.h b/qmap/soundin.h similarity index 100% rename from q65w/soundin.h rename to qmap/soundin.h diff --git a/q65w/ss.bat b/qmap/ss.bat similarity index 100% rename from q65w/ss.bat rename to qmap/ss.bat diff --git a/q65w/sss.bat b/qmap/sss.bat similarity index 100% rename from q65w/sss.bat rename to qmap/sss.bat diff --git a/q65w/widegraph.cpp b/qmap/widegraph.cpp similarity index 100% rename from q65w/widegraph.cpp rename to qmap/widegraph.cpp diff --git a/q65w/widegraph.h b/qmap/widegraph.h similarity index 100% rename from q65w/widegraph.h rename to qmap/widegraph.h diff --git a/q65w/widegraph.ui b/qmap/widegraph.ui similarity index 100% rename from q65w/widegraph.ui rename to qmap/widegraph.ui diff --git a/q65w/wsjt.ico b/qmap/wsjt.ico similarity index 100% rename from q65w/wsjt.ico rename to qmap/wsjt.ico From fb573ef407d31aaac87dc71de99123fff310b792 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 10:58:22 -0500 Subject: [PATCH 201/251] More Q65W -> QMAP. I think this may be everything? --- qmap/mainwindow.ui | 9 +++++++ widgets/mainwindow.cpp | 60 +++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index 0e06e4b22..6fae7b2f2 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -353,11 +353,20 @@ p, li { white-space: pre-wrap; } + + + 16777215 + 35 + + 16 + + QFrame::Panel + 1296.080 diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7495e03d9..ee9e4b86d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -211,16 +211,16 @@ bool m_displayBand = false; bool no_a7_decodes = false; bool keep_frequency = false; -QSharedMemory mem_q65w("mem_q65w"); //Memory segment to be shared (optionally) with Q65W +QSharedMemory mem_qmap("mem_qmap"); //Memory segment to be shared (optionally) with QMAP struct { - int ndecodes; //Number of Q65W decodes available (so far) - int ncand; //Number of Q65W candidates considered for decoding - int nQDecoderDone; //Q65W decoder is finished (0 or 1) + int ndecodes; //Number of QMAP decodes available (so far) + int ncand; //Number of QMAP candidates considered for decoding + int nQDecoderDone; //QMAP decoder is finished (0 or 1) int nWDecoderBusy; //WSJT-X decoder is busy (0 or 1) int nWTransmitting; //WSJT-X is transmitting (0 or 1) char result[50][60]; //Decodes as character*60 arrays -} q65wcom; -int* ipc_q65w; +} qmapcom; +int* ipc_qmap; namespace { @@ -463,18 +463,18 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_optimizingProgress.setAutoReset (false); m_optimizingProgress.setMinimumDuration (15000); // only show after 15s delay - //Attach or create a memory segment to be shared with Q65W. + //Attach or create a memory segment to be shared with QMAP. int memSize=4096; - if(!mem_q65w.attach()) { - if(!mem_q65w.create(memSize)) { + if(!mem_qmap.attach()) { + if(!mem_qmap.create(memSize)) { MessageBox::information_message (this, - "Unable to create shared memory segment mem_q65w."); + "Unable to create shared memory segment mem_qmap."); } } - ipc_q65w = (int*)mem_q65w.data(); - mem_q65w.lock(); - memset(ipc_q65w,0,memSize); //Zero all of Q65W shared memory - mem_q65w.unlock(); + ipc_qmap = (int*)mem_qmap.data(); + mem_qmap.lock(); + memset(ipc_qmap,0,memSize); //Zero all of QMAP shared memory + mem_qmap.unlock(); // Closedown. connect (ui->actionExit, &QAction::triggered, this, &QMainWindow::close); @@ -1143,7 +1143,7 @@ MainWindow::~MainWindow() m_audioThread.quit (); m_audioThread.wait (); remove_child_from_event_filter (this); - memset(ipc_q65w,0,4096); //Zero all of Q65W shared memory + memset(ipc_qmap,0,4096); //Zero all of QMAP shared memory } //-------------------------------------------------------- writeSettings() @@ -4828,24 +4828,24 @@ void MainWindow::guiUpdate() if(m_mode=="Echo" and !m_monitoring and !m_auto and !m_diskData) m_echoRunning=false; if(m_mode=="Q65") { - mem_q65w.lock(); + mem_qmap.lock(); int n=0; if(m_decoderBusy) n=1; - ipc_q65w[3]=n; + ipc_qmap[3]=n; n=0; if(m_transmitting) n=1; - ipc_q65w[4]=n; - if(ipc_q65w[0] > m_fetched) { //ndecodes - memcpy(&q65wcom, (char*)ipc_q65w, sizeof(q65wcom)); //Fetch the new decode(s) + ipc_qmap[4]=n; + if(ipc_qmap[0] > m_fetched) { //ndecodes + memcpy(&qmapcom, (char*)ipc_qmap, sizeof(qmapcom)); //Fetch the new decode(s) readWidebandDecodes(); } - mem_q65w.unlock(); + mem_qmap.unlock(); } //Once per second (onesec) if(nsec != m_sec0) { -// qDebug() << "AAA" << nsec << ipc_q65w[0] << ipc_q65w[1] << ipc_q65w[2] -// << ipc_q65w[3] << ipc_q65w[4] << m_fetched; +// qDebug() << "AAA" << nsec << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] +// << ipc_qmap[3] << ipc_qmap[4] << m_fetched; if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); @@ -9234,8 +9234,8 @@ void MainWindow::readWidebandDecodes() int nhr=0; int nmin=0; int nsnr=0; - while(m_fetched < q65wcom.ndecodes) { - QString line=QString::fromLatin1(q65wcom.result[m_fetched]); + while(m_fetched < qmapcom.ndecodes) { + QString line=QString::fromLatin1(qmapcom.result[m_fetched]); nhr=line.mid(0,2).toInt(); nmin=line.mid(2,2).toInt(); double fsked=line.mid(4,9).toDouble(); @@ -9254,7 +9254,7 @@ void MainWindow::readWidebandDecodes() Frequency frequency = (m_freqNominal/1000000) * 1000000 + int(fsked*1000.0); bool bCQ=line.contains(" CQ "); - bool bFromDisk=q65wcom.nQDecoderDone==2; + bool bFromDisk=qmapcom.nQDecoderDone==2; if(!bFromDisk and (m_EMECall[dxcall].grid4.contains(grid_regexp) or bCQ)) { qDebug() << "To PSKreporter:" << dxcall << m_EMECall[dxcall].grid4 << frequency << m_mode << nsnr; if (!m_psk_Reporter.addRemoteStation (dxcall, m_EMECall[dxcall].grid4, frequency, m_mode, nsnr)) { @@ -9267,7 +9267,7 @@ void MainWindow::readWidebandDecodes() m_psk_Reporter.sendReport(); // Upload any queued spots } -// Update "m_wEMECall" by reading q65w_decodes.txt +// Update "m_wEMECall" by reading qmap_decodes.txt QMap::iterator i; QString t=""; QString t1; @@ -9320,10 +9320,10 @@ void MainWindow::readWidebandDecodes() m_ActiveStationsWidget->displayRecentStations(m_mode,t); m_ActiveStationsWidget->setClickOK(true); } - if(ipc_q65w[2]==1) { + if(ipc_qmap[2]==1) { m_fetched=0; - ipc_q65w[0]=0; - ipc_q65w[2]=0; + ipc_qmap[0]=0; + ipc_qmap[2]=0; } } From ad4fb2be9d50309fb8a484da8959916fda702194 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 12:31:58 -0500 Subject: [PATCH 202/251] Display both frx and fsked, in both QMAP and QSJT-X Active Stations window. --- qmap/libqmap/q65b.f90 | 4 +- qmap/mainwindow.ui | 176 ++++++++++++++++++------------------- widgets/activeStations.cpp | 2 +- widgets/mainwindow.cpp | 24 ++--- widgets/mainwindow.h | 1 + 5 files changed, 105 insertions(+), 102 deletions(-) diff --git a/qmap/libqmap/q65b.f90 b/qmap/libqmap/q65b.f90 index b5f3ee2e3..84b9485a3 100644 --- a/qmap/libqmap/q65b.f90 +++ b/qmap/libqmap/q65b.f90 @@ -112,8 +112,8 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & ndecodes=ndecodes+1 frx=0.001*k0*df+nkhz_center-48.0+1.0 - 0.001*nfcal fsked=frx - 0.001*ndop00/2.0 - 1.5 - write(result(ndecodes),1120) nutc,fsked,xdt0,nsnr0,trim(msg0) -1120 format(i4.4,f9.3,f7.2,i5,2x,a,i6) + write(result(ndecodes),1120) nutc,frx,fsked,xdt0,nsnr0,trim(msg0) +1120 format(i4.4,f9.3,f7.1,f7.2,i5,2x,a) write(12,1130) datetime,trim(result(ndecodes)(5:)) 1130 format(a11,1x,a) result(ndecodes)=trim(result(ndecodes))//char(0) diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index 6fae7b2f2..f9a9b423d 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 472 + 550 431 @@ -18,7 +18,7 @@ - 472 + 550 0 @@ -59,7 +59,7 @@ - UTC Freq DT dB Message + UTC Freq Fsked DT dB Message @@ -72,7 +72,7 @@ - 421 + 500 100 @@ -111,19 +111,79 @@ p, li { white-space: pre-wrap; } - - + + 50 - 150 + 0 - - QFrame::StyledPanel + + &Erase - - QFrame::Raised + + + + + + Maximum drift rate in units of symbol rate per transmissiion. + + + Qt::AlignCenter + + + Max Drift + + + 50 + + + 5 + + + + + + + + 16777215 + 35 + + + + + 16 + + + + QFrame::Panel + + + 1296.080 + + + Qt::AlignCenter + + + + + + + + 50 + 0 + + + + &Decode + + + + + + + NB @@ -158,6 +218,22 @@ p, li { white-space: pre-wrap; } + + + + + 50 + 150 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + @@ -183,32 +259,6 @@ p, li { white-space: pre-wrap; } - - - - - 50 - 0 - - - - &Erase - - - - - - - - 50 - 0 - - - - &Decode - - - @@ -294,25 +344,6 @@ p, li { white-space: pre-wrap; } - - - - Maximum drift rate in units of symbol rate per transmissiion. - - - Qt::AlignCenter - - - Max Drift - - - 50 - - - 5 - - - @@ -344,37 +375,6 @@ p, li { white-space: pre-wrap; } - - - - NB - - - - - - - - 16777215 - 35 - - - - - 16 - - - - QFrame::Panel - - - 1296.080 - - - Qt::AlignCenter - - - @@ -386,7 +386,7 @@ p, li { white-space: pre-wrap; } 0 0 - 472 + 550 21 diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 39dbda71e..04e79f477 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -62,7 +62,7 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) m_mode=mode; bool b=(m_mode=="Q65"); if(b) { - ui->header_label2->setText(" N Freq S/N Call Grid Tx Age"); + ui->header_label2->setText(" N Frx Fsked S/N Call Grid Tx Age"); ui->label->setText("QSOs:"); } else { ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ee9e4b86d..14863ba96 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3689,12 +3689,12 @@ void MainWindow::callSandP2(int n) if(m_mode!="Q65" and m_ready2call[n]=="") return; QStringList w=m_ready2call[n].split(' ', SkipEmptyParts); if(m_mode=="Q65") { - double kHz=w[0].toDouble(); + double kHz=w[1].toDouble(); int nMHz=m_freqNominal/1000000; m_freqNominal=(nMHz*1000 + kHz)* 1000; - m_deCall=w[2]; - m_deGrid=w[3]; - m_txFirst=(w[4]=="0"); + m_deCall=w[3]; + m_deGrid=w[4]; + m_txFirst=(w[5]=="0"); // ui->TxFreqSpinBox->setValue(1500); } else { m_deCall=w[0]; @@ -3706,7 +3706,7 @@ void MainWindow::callSandP2(int n) ui->dxCallEntry->setText(m_deCall); ui->dxGridEntry->setText(m_deGrid); if(m_mode=="Q65") { - genStdMsgs(w[1]); + genStdMsgs(w[2]); } else { genStdMsgs(w[3]); } @@ -9238,13 +9238,15 @@ void MainWindow::readWidebandDecodes() QString line=QString::fromLatin1(qmapcom.result[m_fetched]); nhr=line.mid(0,2).toInt(); nmin=line.mid(2,2).toInt(); - double fsked=line.mid(4,9).toDouble(); - QString msg=line.mid(27,-1); + double frx=line.mid(4,9).toDouble(); + double fsked=line.mid(13,7).toDouble(); + QString msg=line.mid(34,-1); int i1=msg.indexOf(" "); int i2=i1 +1 + msg.mid(i1+1,-1).indexOf(" "); QString dxcall=msg.mid(i1+1,i2-i1-1); QString w3=msg.mid(i2+1,-1); - nsnr=line.mid(22,3).toInt(); + nsnr=line.mid(29,3).toInt(); + m_EMECall[dxcall].frx=frx; m_EMECall[dxcall].fsked=fsked; m_EMECall[dxcall].nsnr=nsnr; m_EMECall[dxcall].t=60*nhr + nmin; @@ -9289,10 +9291,10 @@ void MainWindow::readWidebandDecodes() dxcall=(i.key()+" ").left(8); dxgrid4=(i->grid4+"... ").left(4); if(i->worked) { - t1=t1.asprintf("%5.1f %+03d %8s %4s %3d %3d\n",i->fsked,snr,dxcall.toLatin1().constData(), + t1=t1.asprintf("%7.3f %5.1f %+03d %8s %4s %3d %3d\n",i->frx,i->fsked,snr,dxcall.toLatin1().constData(), dxgrid4.toLatin1().constData(),odd,age); } else { - t1=t1.asprintf("%5.1f %+03d %8s %4s %3d %3d*\n",i->fsked,snr,dxcall.toLatin1().constData(), + t1=t1.asprintf("%7.3f %5.1f %+03d %8s %4s %3d %3d*\n",i->frx,i->fsked,snr,dxcall.toLatin1().constData(), dxgrid4.toLatin1().constData(),odd,age); } f[k]=i->fsked; @@ -9308,7 +9310,7 @@ void MainWindow::readWidebandDecodes() indexx_(f,&kz,indx); for(int k=0; k Date: Wed, 25 Jan 2023 12:37:10 -0500 Subject: [PATCH 203/251] Clean up one more detail. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 14863ba96..585545e7f 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3706,6 +3706,7 @@ void MainWindow::callSandP2(int n) ui->dxCallEntry->setText(m_deCall); ui->dxGridEntry->setText(m_deGrid); if(m_mode=="Q65") { + ui->rptSpinBox->setValue(w[2].toInt()); genStdMsgs(w[2]); } else { genStdMsgs(w[3]); From 2d7b76ff034f2aeb75fd7aa5a707db13b0d4b97c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 16:29:57 -0500 Subject: [PATCH 204/251] Clear m_EMECall when Cabrillo log is reset. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 585545e7f..bc41ccc02 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7504,6 +7504,7 @@ void MainWindow::on_reset_cabrillo_log_action_triggered () if(m_config.RTTY_Exchange()!="SCC") ui->sbSerialNumber->setValue(1); m_logBook.contest_log ()->reset (); m_activeCall.clear(); //Erase the QMap of active calls + m_EMECall.clear(); //ditto for EME calls m_score=0; if (m_ActiveStationsWidget) m_ActiveStationsWidget->setScore(0); } From 46fdc79881f7f6d69f132a6bb4d29c2547832349 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 25 Jan 2023 20:41:15 -0500 Subject: [PATCH 205/251] Working on WSJT-X <--> QMAP communication. Not right, yet. --- widgets/mainwindow.cpp | 59 ++++++++++++++++++++++++++++++++---------- widgets/mainwindow.h | 3 +++ 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index bc41ccc02..57be809c9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -903,6 +903,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->lh_decodes_headings_label->setText(t); ui->rh_decodes_headings_label->setText(t); readSettings(); //Restore user's setup parameters + if(m_mode=="Q65") read_log(); m_audioThread.start (m_audioThreadPriority); #ifdef WIN32 @@ -3256,6 +3257,7 @@ void MainWindow::msgAvgDecode2() void MainWindow::decode() //decode() { if(m_decoderBusy) return; //Don't start decoder if it's already busy. + m_fetched=0; QDateTime now = QDateTime::currentDateTimeUtc (); if( m_dateTimeLastTX.isValid () ) { qint64 isecs_since_tx = m_dateTimeLastTX.secsTo(now); @@ -3421,7 +3423,6 @@ void MainWindow::decode() //decode() narg[13]=-1; narg[14]=m_config.aggressive(); memcpy(d2b,dec_data.d2,2*360000); - m_fetched=0; 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))); @@ -3549,6 +3550,28 @@ void MainWindow::decodeDone () if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0; } +void MainWindow::read_log() +{ + static QFile f {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("wsjtx.log")}; + f.open(QIODevice::ReadOnly); + m_score=0; + if(f.isOpen()) { + QTextStream in(&f); + QString line,callsign; + for(int i=0; i<99999; i++) { + line=in.readLine(); + if(line.length()<=0) break; + callsign=line.mid(40,6); + int n=callsign.indexOf(","); + if(n>0) callsign=callsign.left(n); + m_EMEworked[callsign]=true; + m_score++; + qDebug() << "aa" << m_score << callsign; + } + f.close(); + } +} + void MainWindow::ARRL_Digi_Update(DecodedText dt) { // Extract information relevant for the ARRL Digi contest @@ -4845,8 +4868,8 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { -// qDebug() << "AAA" << nsec << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] -// << ipc_qmap[3] << ipc_qmap[4] << m_fetched; + qDebug() << "AAA" << nsec << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] + << ipc_qmap[3] << ipc_qmap[4] << m_fetched; if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); @@ -6536,15 +6559,21 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, } if(m_ActiveStationsWidget!=NULL) { - QString band=m_config.bands()->find(dial_freq); - activeWorked(call,band); - int points=m_activeCall[call].points; - m_score += points; - ARRL_logged al; - al.time=QDateTime::currentDateTimeUtc(); - al.band=band; - al.points=points; - m_arrl_log.append(al); + if(m_mode=="Q65") { + m_score++; + m_EMEworked[call]=true; + qDebug() << "bb" << m_score << call; + } else { + QString band=m_config.bands()->find(dial_freq); + activeWorked(call,band); + int points=m_activeCall[call].points; + m_score += points; + ARRL_logged al; + al.time=QDateTime::currentDateTimeUtc(); + al.band=band; + al.points=points; + m_arrl_log.append(al); + } updateRate(); } @@ -9231,6 +9260,7 @@ void MainWindow::write_transmit_entry (QString const& file_name) void MainWindow::readWidebandDecodes() { + qDebug() << "dd" << m_fetched << qmapcom.ndecodes; if(m_ActiveStationsWidget==NULL) return; int nhr=0; @@ -9252,7 +9282,6 @@ void MainWindow::readWidebandDecodes() m_EMECall[dxcall].fsked=fsked; m_EMECall[dxcall].nsnr=nsnr; m_EMECall[dxcall].t=60*nhr + nmin; - m_EMECall[dxcall].worked=false; //### TEMPORARY ### if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; m_fetched++; @@ -9292,7 +9321,9 @@ void MainWindow::readWidebandDecodes() if(age<=maxAge) { dxcall=(i.key()+" ").left(8); dxgrid4=(i->grid4+"... ").left(4); - if(i->worked) { +// if(i->worked) { + qDebug() << "cc" << dxcall.trimmed(); + if(m_EMEworked[dxcall.trimmed()]) { t1=t1.asprintf("%7.3f %5.1f %+03d %8s %4s %3d %3d\n",i->frx,i->fsked,snr,dxcall.toLatin1().constData(), dxgrid4.toLatin1().constData(),odd,age); } else { diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 091188bef..e8096cf08 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -714,6 +714,8 @@ private: }; QMap m_EMECall; + QMap m_EMEworked; + struct RecentCall { qint64 dialFreq; @@ -861,6 +863,7 @@ private: Q_SLOT void ARRL_Digi_Display(); void ARRL_Digi_Update(DecodedText dt); void activeWorked(QString call, QString band); + void read_log(); }; extern int killbyname(const char* progName); From 29360db01a7c7acb1555b4a6ec6c2c71731522b2 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 26 Jan 2023 10:55:10 -0500 Subject: [PATCH 206/251] Clean up the IPC between WSJT-X and QMAP. Fix the "QSOs:" listing in ActiveStations window. --- qmap/commons.h | 12 ++++++------ qmap/mainwindow.cpp | 10 +++------- widgets/activeStations.cpp | 1 + widgets/mainwindow.cpp | 32 +++++++++++++++++++------------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/qmap/commons.h b/qmap/commons.h index 26cc2d7ca..511ab7ae8 100644 --- a/qmap/commons.h +++ b/qmap/commons.h @@ -84,12 +84,12 @@ extern struct { //This is "common/datcom/..." in Fortran } datcom2_; extern struct { - int ndecodes; - int ncand; - int nQDecoderDone; - int nWDecoderBusy; - int nWTransmitting; - char result[50][60]; + int ndecodes; //These are flags for inter-process communication + int ncand; //between QMAP and WSJT-X + int nQDecoderDone; //1 for real-time decodes, 2 for data from disk + int nWDecoderBusy; //Set to 1 when WSJT-X decoder is busy + int nWTransmitting; //Set to 1 when WSJT-X is transmitting + char result[50][60]; //Staging area for QMAP decodes } decodes_; } diff --git a/qmap/mainwindow.cpp b/qmap/mainwindow.cpp index 53f2f12b6..1b6e8c135 100644 --- a/qmap/mainwindow.cpp +++ b/qmap/mainwindow.cpp @@ -408,8 +408,6 @@ void MainWindow::dataSink(int k) datcom_.nhsym=ihsym; QDateTime t = QDateTime::currentDateTimeUtc(); m_dateTime=t.toString("yymmdd_hhmm"); -// qDebug() << "aa" << "Decoder called" << ihsym << ipc_wsjtx[0] << ipc_wsjtx[1] -// << ipc_wsjtx[2] << ipc_wsjtx[3] << ipc_wsjtx[4] ; decode(); //Start the decoder if(m_saveAll and !m_diskData and m_nTransmitted<10) { QString fname=m_saveDir + "/" + t.date().toString("yyMMdd") + "_" + @@ -701,7 +699,6 @@ void MainWindow::on_actionDecode_remaining_files_in_directory_triggered() void MainWindow::diskDat() //diskDat() { -// qDebug() << "aa1" << datcom_.fcenter; double hsym; //These may be redundant?? m_diskData=true; @@ -727,10 +724,11 @@ void MainWindow::decoderFinished() //diskWriteFinished decodes_.nQDecoderDone=1; if(m_diskData) decodes_.nQDecoderDone=2; mem_qmap.lock(); - memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); + decodes_.nWDecoderBusy=ipc_wsjtx[3]; //Prevent overwriting values + decodes_.nWTransmitting=ipc_wsjtx[4]; //written here by WSJT-X + memcpy((char*)ipc_wsjtx, &decodes_, sizeof(decodes_)); //Send decodes and flags to WSJT-X mem_qmap.unlock(); QString t1; -// t1=t1.asprintf(" %3d/%d ",decodes_.ndecodes,decodes_.ncand); t1=t1.asprintf(" %d ",decodes_.ndecodes); lab4->setText(t1); QDateTime now=QDateTime::currentDateTimeUtc(); @@ -788,7 +786,6 @@ void MainWindow::freezeDecode(int n) //freezeDecode() datcom_.ntol=m_tol; } m_nDoubleClicked++; -// qDebug() << "aa" << m_nDoubleClicked << m_decoderBusy << m_nTransmitted << n; if(!m_decoderBusy) { datcom_.nagain=1; datcom_.newdat=0; @@ -845,7 +842,6 @@ void MainWindow::decode() //decode() datcom_.nfa=nfa; datcom_.nfb=nfb; -// qDebug() << "bbb" << datcom_.fcenter << datcom_.nfa << datcom_.nfb << datcom_.fselected; datcom_.nfcal=m_fCal; datcom_.nfshift=nfshift; datcom_.mcall3=0; diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 04e79f477..afaccc3ed 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -131,6 +131,7 @@ void ActiveStations::setRate(int n) void ActiveStations::setScore(int n) { + qDebug() << "FF" << n; ui->score->setText(QLocale(QLocale::English).toString(n)); } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 57be809c9..6e4c84597 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -903,7 +903,10 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->lh_decodes_headings_label->setText(t); ui->rh_decodes_headings_label->setText(t); readSettings(); //Restore user's setup parameters - if(m_mode=="Q65") read_log(); + if(m_mode=="Q65") { + m_score=0; + read_log(); + } m_audioThread.start (m_audioThreadPriority); #ifdef WIN32 @@ -2940,6 +2943,7 @@ void MainWindow::on_actionActiveStations_triggered() connect(m_ActiveStationsWidget.data(), SIGNAL(callSandP(int)),this,SLOT(callSandP2(int))); connect(m_ActiveStationsWidget.data(), SIGNAL(activeStationsDisplay()),this,SLOT(ARRL_Digi_Display())); m_ActiveStationsWidget->setScore(m_score); + if(m_mode=="Q65") m_ActiveStationsWidget->setRate(m_score); } void MainWindow::on_actionOpen_triggered() //Open File @@ -3554,7 +3558,6 @@ void MainWindow::read_log() { static QFile f {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("wsjtx.log")}; f.open(QIODevice::ReadOnly); - m_score=0; if(f.isOpen()) { QTextStream in(&f); QString line,callsign; @@ -3566,10 +3569,13 @@ void MainWindow::read_log() if(n>0) callsign=callsign.left(n); m_EMEworked[callsign]=true; m_score++; - qDebug() << "aa" << m_score << callsign; } f.close(); } + if(m_ActiveStationsWidget!=NULL) { + m_ActiveStationsWidget->setScore(m_score); + if(m_mode=="Q65") m_ActiveStationsWidget->setRate(m_score); + } } void MainWindow::ARRL_Digi_Update(DecodedText dt) @@ -4859,7 +4865,7 @@ void MainWindow::guiUpdate() n=0; if(m_transmitting) n=1; ipc_qmap[4]=n; - if(ipc_qmap[0] > m_fetched) { //ndecodes + if(ipc_qmap[0] > 0) { //ndecodes memcpy(&qmapcom, (char*)ipc_qmap, sizeof(qmapcom)); //Fetch the new decode(s) readWidebandDecodes(); } @@ -4868,8 +4874,8 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { - qDebug() << "AAA" << nsec << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] - << ipc_qmap[3] << ipc_qmap[4] << m_fetched; +// qDebug() << "AAA" << nsec%60 << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] +// << ipc_qmap[3] << ipc_qmap[4] << m_fetched; if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); @@ -6562,7 +6568,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, if(m_mode=="Q65") { m_score++; m_EMEworked[call]=true; - qDebug() << "bb" << m_score << call; + m_ActiveStationsWidget->setRate(m_score); } else { QString band=m_config.bands()->find(dial_freq); activeWorked(call,band); @@ -6573,8 +6579,8 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, al.band=band; al.points=points; m_arrl_log.append(al); + updateRate(); } - updateRate(); } m_xSent.clear (); @@ -7535,7 +7541,10 @@ void MainWindow::on_reset_cabrillo_log_action_triggered () m_activeCall.clear(); //Erase the QMap of active calls m_EMECall.clear(); //ditto for EME calls m_score=0; - if (m_ActiveStationsWidget) m_ActiveStationsWidget->setScore(0); + if (m_ActiveStationsWidget) { + m_ActiveStationsWidget->setScore(0); + if(m_mode=="Q65") m_ActiveStationsWidget->setRate(0); + } } } @@ -9260,7 +9269,6 @@ void MainWindow::write_transmit_entry (QString const& file_name) void MainWindow::readWidebandDecodes() { - qDebug() << "dd" << m_fetched << qmapcom.ndecodes; if(m_ActiveStationsWidget==NULL) return; int nhr=0; @@ -9321,8 +9329,6 @@ void MainWindow::readWidebandDecodes() if(age<=maxAge) { dxcall=(i.key()+" ").left(8); dxgrid4=(i->grid4+"... ").left(4); -// if(i->worked) { - qDebug() << "cc" << dxcall.trimmed(); if(m_EMEworked[dxcall.trimmed()]) { t1=t1.asprintf("%7.3f %5.1f %+03d %8s %4s %3d %3d\n",i->frx,i->fsked,snr,dxcall.toLatin1().constData(), dxgrid4.toLatin1().constData(),odd,age); @@ -9355,7 +9361,7 @@ void MainWindow::readWidebandDecodes() m_ActiveStationsWidget->displayRecentStations(m_mode,t); m_ActiveStationsWidget->setClickOK(true); } - if(ipc_qmap[2]==1) { + if(ipc_qmap[2]!=0) { m_fetched=0; ipc_qmap[0]=0; ipc_qmap[2]=0; From 019529d29358a52f33606432a24a686ade56bdeb Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 26 Jan 2023 11:03:00 -0500 Subject: [PATCH 207/251] Remove a diagnostic print. --- widgets/activeStations.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index afaccc3ed..04e79f477 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -131,7 +131,6 @@ void ActiveStations::setRate(int n) void ActiveStations::setScore(int n) { - qDebug() << "FF" << n; ui->score->setText(QLocale(QLocale::English).toString(n)); } From 47a899465fc82f6ca9024ddbf61183d1eb5afae0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 26 Jan 2023 15:37:53 -0500 Subject: [PATCH 208/251] Allow the QMAP main window to get a bit wider. --- qmap/mainwindow.cpp | 2 +- qmap/mainwindow.ui | 148 ++++++++++++++++++++++---------------------- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/qmap/mainwindow.cpp b/qmap/mainwindow.cpp index 1b6e8c135..04e9351d5 100644 --- a/qmap/mainwindow.cpp +++ b/qmap/mainwindow.cpp @@ -934,7 +934,7 @@ void MainWindow::guiUpdate() QString t=QString::fromLatin1(decodes_.result[m_fetched]); if(m_UTC0!="" and m_UTC0!=t.left(4)) { t1="-"; - ui->decodedTextBrowser->append(t1.repeated(46)); + ui->decodedTextBrowser->append(t1.repeated(56)); } m_UTC0=t.left(4); ui->decodedTextBrowser->append(t.trimmed()); diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index f9a9b423d..877ce4850 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -6,7 +6,7 @@ 0 0 - 550 + 640 431 @@ -24,7 +24,7 @@ - 550 + 640 800 @@ -38,77 +38,6 @@ - - - - - 0 - 0 - - - - - 453 - 170 - - - - - 620 - 16777215 - - - - UTC Freq Fsked DT dB Message - - - - - - - 0 - 0 - - - - - 500 - 100 - - - - - 610 - 400 - - - - - Courier New - 10 - - - - Qt::ScrollBarAlwaysOn - - - Qt::ScrollBarAsNeeded - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Courier New'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> - - - false - - - - - - @@ -377,6 +306,77 @@ p, li { white-space: pre-wrap; } + + + + + 0 + 0 + + + + + 453 + 170 + + + + + 620 + 16777215 + + + + UTC Freq Fsked DT dB Message + + + + + + + 0 + 0 + + + + + 500 + 100 + + + + + 610 + 400 + + + + + Courier New + 10 + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Courier New'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + false + + + + + + @@ -386,7 +386,7 @@ p, li { white-space: pre-wrap; } 0 0 - 550 + 640 21 From b5a045c63b61ce9f747ea261d3442b3aa7d453a6 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 27 Jan 2023 10:55:04 -0500 Subject: [PATCH 209/251] Implement an option for temporary manual rig control. Useful for CW EME ?? --- widgets/mainwindow.cpp | 13 ++++++++++++- widgets/mainwindow.ui | 11 ++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 6e4c84597..d4ad1b6f5 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1075,6 +1075,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->labDXped->setVisible(SpecOp::NONE != m_specOp); ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}"); ui->pbBestSP->setVisible(m_mode=="FT4"); + ui->readFreq->setEnabled(true); //To enable manual rig-control option + // this must be the last statement of constructor if (!m_valid) throw std::runtime_error {"Fatal initialization exception"}; @@ -7795,6 +7797,15 @@ void MainWindow::on_readFreq_clicked() { if (m_transmitting) return; +// CTRL+click on the rig-mode button to allow temporary manual rig control. + bool b=QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); + if(b and m_config.is_transceiver_online()) { + m_config.transceiver_offline(); + update_dynamic_property (ui->readFreq, "state", "manual"); + ui->readFreq->setText("M"); + return; + } + if (m_config.transceiver_online ()) { m_config.sync_transceiver (true, true); @@ -7934,7 +7945,7 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& displayDialFrequency (); update_dynamic_property (ui->readFreq, "state", "ok"); - ui->readFreq->setEnabled (false); +// ui->readFreq->setEnabled (false); //Leave it enabled to allow Manual rig control option ui->readFreq->setText (s.split () ? "S" : ""); } diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index e5ed6cefe..e1a250cb6 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -42,6 +42,7 @@ 10 + 50 false @@ -185,6 +186,7 @@ 10 + 50 false @@ -3100,10 +3102,10 @@ QLabel[oob="true"] { 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> + <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. CTRL-click for temporary manual rig control, signified by yellow.</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. + <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. CTRL-click for temporary manual rig control, signified by yellow.</p></body></html> QPushButton { @@ -3127,6 +3129,9 @@ QPushButton[state="error"] { QPushButton[state="warning"] { background-color: orange; } +QPushButton[state="manual"] { + background-color: yellow; +} QPushButton[state="ok"] { background-color: #00ff00; } @@ -3151,7 +3156,7 @@ QPushButton[state="ok"] { 0 0 880 - 22 + 21 From 1b7830825a356eb3436998b51f6cf071da9763ab Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 28 Jan 2023 10:16:05 -0500 Subject: [PATCH 210/251] Another tweak to make temporary manual rig control work as intended. --- widgets/mainwindow.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index d4ad1b6f5..2877fb7f2 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7799,17 +7799,18 @@ void MainWindow::on_readFreq_clicked() // CTRL+click on the rig-mode button to allow temporary manual rig control. bool b=QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); - if(b and m_config.is_transceiver_online()) { + if(b) { + if(m_config.is_transceiver_online()) { m_config.transceiver_offline(); update_dynamic_property (ui->readFreq, "state", "manual"); ui->readFreq->setText("M"); - return; - } - - if (m_config.transceiver_online ()) - { - m_config.sync_transceiver (true, true); + } else { + m_config.transceiver_online(); + update_dynamic_property (ui->readFreq, "state", "ok"); + ui->readFreq->setText(m_rigState.split() ? "S" : ""); } + } + if (m_config.is_transceiver_online()) m_config.sync_transceiver(true, true); } void MainWindow::setXIT(int n, Frequency base) @@ -7879,6 +7880,7 @@ void MainWindow::setFreq4(int rxFreq, int txFreq) void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s) { + if(ui->readFreq->text()=="M") return; //Manual rig control is active, do nothing here Transceiver::TransceiverState old_state {m_rigState}; //transmitDisplay (s.ptt ()); if (s.ptt () // && !m_rigState.ptt () From 0c0ecd893bb9d3c9eccd21b6ae6c97a348736bcd Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 2 Feb 2023 12:18:00 -0500 Subject: [PATCH 211/251] Revert "Another tweak to make temporary manual rig control work as intended." This reverts commit 1b7830825a356eb3436998b51f6cf071da9763ab. --- widgets/mainwindow.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 53262e8ac..535a475d4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7802,18 +7802,17 @@ void MainWindow::on_readFreq_clicked() // CTRL+click on the rig-mode button to allow temporary manual rig control. bool b=QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); - if(b) { - if(m_config.is_transceiver_online()) { + if(b and m_config.is_transceiver_online()) { m_config.transceiver_offline(); update_dynamic_property (ui->readFreq, "state", "manual"); ui->readFreq->setText("M"); - } else { - m_config.transceiver_online(); - update_dynamic_property (ui->readFreq, "state", "ok"); - ui->readFreq->setText(m_rigState.split() ? "S" : ""); - } + return; } - if (m_config.is_transceiver_online()) m_config.sync_transceiver(true, true); + + if (m_config.transceiver_online ()) + { + m_config.sync_transceiver (true, true); + } } void MainWindow::setXIT(int n, Frequency base) @@ -7883,7 +7882,6 @@ void MainWindow::setFreq4(int rxFreq, int txFreq) void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& s) { - if(ui->readFreq->text()=="M") return; //Manual rig control is active, do nothing here Transceiver::TransceiverState old_state {m_rigState}; //transmitDisplay (s.ptt ()); if (s.ptt () // && !m_rigState.ptt () From 8db7c2c1283117da8a66f12f8be1a456473c3f78 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 2 Feb 2023 12:18:28 -0500 Subject: [PATCH 212/251] Revert "Implement an option for temporary manual rig control. Useful for CW EME ??" This reverts commit b5a045c63b61ce9f747ea261d3442b3aa7d453a6. --- widgets/mainwindow.cpp | 13 +------------ widgets/mainwindow.ui | 11 +++-------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 535a475d4..f84212f93 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -1075,8 +1075,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->labDXped->setVisible(SpecOp::NONE != m_specOp); ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}"); ui->pbBestSP->setVisible(m_mode=="FT4"); - ui->readFreq->setEnabled(true); //To enable manual rig-control option - // this must be the last statement of constructor if (!m_valid) throw std::runtime_error {"Fatal initialization exception"}; @@ -7800,15 +7798,6 @@ void MainWindow::on_readFreq_clicked() { if (m_transmitting) return; -// CTRL+click on the rig-mode button to allow temporary manual rig control. - bool b=QApplication::keyboardModifiers().testFlag(Qt::ControlModifier); - if(b and m_config.is_transceiver_online()) { - m_config.transceiver_offline(); - update_dynamic_property (ui->readFreq, "state", "manual"); - ui->readFreq->setText("M"); - return; - } - if (m_config.transceiver_online ()) { m_config.sync_transceiver (true, true); @@ -7948,7 +7937,7 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& displayDialFrequency (); update_dynamic_property (ui->readFreq, "state", "ok"); -// ui->readFreq->setEnabled (false); //Leave it enabled to allow Manual rig control option + ui->readFreq->setEnabled (false); ui->readFreq->setText (s.split () ? "S" : ""); } diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index e1a250cb6..e5ed6cefe 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -42,7 +42,6 @@ 10 - 50 false @@ -186,7 +185,6 @@ 10 - 50 false @@ -3102,10 +3100,10 @@ QLabel[oob="true"] { 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. CTRL-click for temporary manual rig control, signified by yellow.</p></body></html> + <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>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. CTRL-click for temporary manual rig control, signified by yellow.</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 { @@ -3129,9 +3127,6 @@ QPushButton[state="error"] { QPushButton[state="warning"] { background-color: orange; } -QPushButton[state="manual"] { - background-color: yellow; -} QPushButton[state="ok"] { background-color: #00ff00; } @@ -3156,7 +3151,7 @@ QPushButton[state="ok"] { 0 0 880 - 21 + 22 From 88798f1ca38e082dcb4e5949a603354ac09f493f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 7 Feb 2023 15:17:09 -0500 Subject: [PATCH 213/251] Working toward 'q3list' decoding for NA VHF Contest mode. More still needed! --- CMakeLists.txt | 1 + lib/q65_decode.f90 | 52 +++++++++++++++++++++---- lib/qra/q65/q65.f90 | 52 ++++++++++++++++++++++++- lib/qra/q65/q65_set_list2.f90 | 73 +++++++++++++++++++++++++++++++++++ lib/types.f90 | 6 +++ widgets/mainwindow.cpp | 10 +++-- 6 files changed, 181 insertions(+), 13 deletions(-) create mode 100644 lib/qra/q65/q65_set_list2.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 19de564e0..f274b5560 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -509,6 +509,7 @@ set (wsjt_FSRCS lib/qra/q65/q65_ap.f90 lib/qra/q65/q65_loops.f90 lib/qra/q65/q65_set_list.f90 + lib/qra/q65/q65_set_list2.f90 lib/refspectrum.f90 lib/savec2.f90 lib/save_dxbase.f90 diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 9db8f8695..a30ba4b33 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -55,9 +55,13 @@ contains use, intrinsic :: iso_c_binding use q65 !Shared variables use prog_args + use types - parameter (NMAX=300*12000) !Max TRperiod is 300 s + parameter (NMAX=300*12000) !Max TRperiod is 300 s + parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode + class(q65_decoder), intent(inout) :: this + procedure(q65_decode_callback) :: callback character(len=12) :: mycall, hiscall !Used for AP decoding character(len=6) :: hisgrid @@ -74,15 +78,17 @@ contains integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) integer nq65param(3) + integer stageno !Added by W3SZ + integer time logical lclearave,lnewdat0,lapcqonly,unpk77_success logical single_decode,lagain,ex complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s - integer stageno !Added by W3SZ - stageno=0 + type(q3list) callers(MAX_CALLERS) ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) + stageno=0 ndecodes=0 decodes=' ' f0decodes=0. @@ -103,9 +109,25 @@ contains if(lagain) ndepth=ior(ndepth,3) !Use 'Deep' for manual Q65 decodes dxcall13=hiscall ! initialize for use in packjt77 mycall13=mycall + nhist2=0 + if(ncontest.eq.1) then +! NA VHF Contest or ARRL Digi Contest + open(24,file=trim(data_dir)//'/q3list.bin',status='unknown', & + form='unformatted') + read(24,end=2) nhist2,callers(1:nhist2) + now=time() + do i=1,nhist2 + hours=(now - callers(i)%nsec)/3600.0 + if(hours.gt.18.0) then + callers(i:nhist2-1)=callers(i+1:nhist2) + nhist2=nhist2-1 + endif + enddo +! print*,'a nhist2:',nhist2 + endif ! Determine the T/R sequence: iseq=0 (even), or iseq=1 (odd) - n=nutc +2 n=nutc if(ntrperiod.ge.60 .and. nutc.le.2359) n=100*n write(cutc,'(i6.6)') n read(cutc,'(3i2)') ih,im,is @@ -151,7 +173,11 @@ contains if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' ncw=0 if(nqd.eq.1 .or. lagain) then - call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) + if(ncontest.eq.1) then + call q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) + else + call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) + endif endif dgen=0 call q65_enc(dgen,codewords) !Initialize the Q65 codec @@ -284,7 +310,11 @@ contains nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) - call q65_hist(nint(f0dec),msg0=decoded) + if(ncontest.eq.1) then + call q65_hist2(decoded,callers,nhist2) + else + call q65_hist(nint(f0dec),msg0=decoded) + endif if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg call sec0(1,tdecode) @@ -374,7 +404,11 @@ contains nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) - call q65_hist(nint(f0dec),msg0=decoded) + if(ncontest.eq.1) then + call q65_hist2(decoded,callers,nhist2) + else + call q65_hist(nint(f0dec),msg0=decoded) + endif if(iand(ndepth,128).ne.0 .and. .not.lagain .and. & int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg call sec0(1,tdecode) @@ -403,7 +437,9 @@ contains 800 continue enddo ! icand if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50 -900 return + +900 close(24) + return end subroutine decode end module q65_decode diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 920fbd5e1..35bdedbf0 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -397,7 +397,6 @@ subroutine q65_dec_q012(s3,LL,snr2,dat4,idec,decoded) read(c78,1060) apsymbols endif -! print*,'a',ibwa,ibwb,maxiters,iimax do ibw=ibwa,ibwb b90=1.72**ibw b90ts=b90/baud @@ -853,4 +852,55 @@ subroutine q65_hist(if0,msg0,dxcall,dxgrid) 900 return end subroutine q65_hist +subroutine q65_hist2(msg0,callers,nhist2) + + use types + parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode + character*37 msg0,msg + type(q3list) callers(MAX_CALLERS) + character*6 c6 + character*4 g4 + logical newcall,isgrid + + isgrid(g4)=g4(1:1).ge.'A' .and. g4(1:1).le.'R' .and. g4(2:2).ge.'A' .and. & + g4(2:2).le.'R' .and. g4(3:3).ge.'0' .and. g4(3:3).le.'9' .and. & + g4(4:4).ge.'0' .and. g4(4:4).le.'9' .and. g4(1:4).ne.'RR73' + + msg=msg0 + if(index(msg,'/').gt.0) goto 900 !Ignore messages withcompound calls + i0=index(msg,' R ') + if(i0.ge.7) msg=msg(1:i0)//msg(i0+3:) + i1=index(msg,' ') + c6=' ' + g4=' ' + if(i1.ge.4 .and. i1.le.13) then + i2=index(msg(i1+1:),' ') + i1 + c6=msg(i1+1:i2-1) !Extract DX call + g4=msg(i2+1:i2+4) !Extract DX grid + endif + + newcall=.true. + do i=1,nhist2 + if(callers(i)%call .eq. c6) then + newcall=.false. + callers(i)%nsec=time() + exit + endif + enddo + + if(newcall .and. isgrid(g4)) then + nhist2=nhist2+1 + callers(nhist2)%call=c6 + callers(nhist2)%grid=g4 + callers(nhist2)%nsec=time() + rewind(24) + write(24) nhist2,callers(1:nhist2) + rewind(24) + endif + +! print*,'c',nhist2,trim(msg),' ',c6,' ',g4 + +900 return +end subroutine q65_hist2 + end module q65 diff --git a/lib/qra/q65/q65_set_list2.f90 b/lib/qra/q65/q65_set_list2.f90 new file mode 100644 index 000000000..1015ac975 --- /dev/null +++ b/lib/qra/q65/q65_set_list2.f90 @@ -0,0 +1,73 @@ +subroutine q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) + + use types + parameter (MAX_NCW=206) + parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode + character*12 mycall,hiscall + character*6 hisgrid + character*37 msg,msgsent + logical my_std,his_std + integer codewords(63,MAX_NCW) + integer itone(85) + integer isync(22) + integer time + type(q3list) callers(MAX_CALLERS) + + data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ + +! print*,'b nhist2:',nhist2 + if(nhist2.ne.-99) return + + ncw=0 + if(hiscall(1:1).eq. ' ') return + call stdcall(mycall,my_std) + call stdcall(hiscall,his_std) + + ncw=MAX_NCW + do i=1,ncw + msg=trim(mycall)//' '//trim(hiscall) + if(.not.my_std) then + if(i.eq.1 .or. i.ge.6) msg='<'//trim(mycall)//'> '//trim(hiscall) + if(i.ge.2 .and. i.le.4) msg=trim(mycall)//' <'//trim(hiscall)//'>' + else if(.not.his_std) then + if(i.le.4 .or. i.eq.6) msg='<'//trim(mycall)//'> '//trim(hiscall) + if(i.ge.7) msg=trim(mycall)//' <'//trim(hiscall)//'>' + 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(his_std) msg='CQ '//trim(hiscall)//' '//hisgrid(1:4) + if(.not.his_std) msg='CQ '//trim(hiscall) + endif + if(i.eq.6 .and. his_std) msg(j0:j0+3)=hisgrid(1:4) + 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 + + call genq65(msg,0,msgsent,itone,i3,n3) + i0=1 + j=0 + do k=1,85 + if(k.eq.isync(i0)) then + i0=i0+1 + cycle + endif + j=j+1 + codewords(j,i)=itone(k) - 1 + enddo +! write(71,3001) i,isnr,codewords(1:13,i),trim(msg) +!3001 format(i3,2x,i3.2,2x,13i3,2x,a) + enddo +! print*,'aa',ncontest,ncw,1970.0 + time()/(365.25*86400.0) + + return +end subroutine q65_set_list2 diff --git a/lib/types.f90 b/lib/types.f90 index c0268357b..fe11579a6 100644 --- a/lib/types.f90 +++ b/lib/types.f90 @@ -7,4 +7,10 @@ module types integer, parameter :: dp = REAL64 integer, parameter :: qp = REAL128 + type q3list + character*6 call + character*4 grid + integer nsec + end type q3list + end module types diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f84212f93..76a900c46 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3314,7 +3314,9 @@ void MainWindow::decode() //decode() dec_data.params.ndiskdat=0; if(m_diskData) dec_data.params.ndiskdat=1; dec_data.params.nfa=m_wideGraph->nStartFreq(); - dec_data.params.nfSplit=m_wideGraph->Fmin(); + dec_data.params.nfSplit=m_wideGraph->Fmin(); // Not used any more? + if(dec_data.params.nfSplit==8) dec_data.params.nfSplit=1; + dec_data.params.nfb=m_wideGraph->Fmax(); if(m_mode=="FT8" and SpecOp::HOUND == m_specOp and !ui->cbRxAll->isChecked()) dec_data.params.nfb=1000; if(m_mode=="FT8" and SpecOp::FOX == m_specOp ) dec_data.params.nfqso=200; @@ -3370,7 +3372,8 @@ void MainWindow::decode() //decode() dec_data.params.emedelay=0.0; if(m_config.decode_at_52s()) dec_data.params.emedelay=2.5; dec_data.params.minSync=ui->syncSpinBox->isVisible () ? m_minSync : 0; - dec_data.params.nexp_decode = static_cast (m_specOp); + dec_data.params.nexp_decode=int(m_specOp); + if(dec_data.params.nexp_decode==8) dec_data.params.nexp_decode=1; //NA VHF and ARRL Digi are same if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); @@ -4874,8 +4877,7 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { -// qDebug() << "AAA" << nsec%60 << ipc_qmap[0] << ipc_qmap[1] << ipc_qmap[2] -// << ipc_qmap[3] << ipc_qmap[4] << m_fetched; +// qDebug() << "AAA" << nsec%60 << int(m_specOp); if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); From d6dd7016016c5a7351aef59047fc85b8f79d62be Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 8 Feb 2023 12:34:48 -0500 Subject: [PATCH 214/251] Decoding via q3list now basically working with grid exchanges. --- lib/q65_decode.f90 | 9 ++- lib/qra/q65/q65.f90 | 7 +-- lib/qra/q65/q65_set_list2.f90 | 100 +++++++++++++++++----------------- 3 files changed, 58 insertions(+), 58 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index a30ba4b33..8114565b1 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -112,9 +112,12 @@ contains nhist2=0 if(ncontest.eq.1) then ! NA VHF Contest or ARRL Digi Contest - open(24,file=trim(data_dir)//'/q3list.bin',status='unknown', & - form='unformatted') - read(24,end=2) nhist2,callers(1:nhist2) +! open(24,file=trim(data_dir)//'/q3list.bin',status='unknown', & +! form='unformatted') +! read(24,end=2) nhist2,callers(1:nhist2) + open(24,file=trim(data_dir)//'/q3list.bin',status='unknown') + read(24,3024,end=2) nhist2,callers(1:nhist2) +3024 format(i5/(a6,2x,a4,2x,i10)) now=time() do i=1,nhist2 hours=(now - callers(i)%nsec)/3600.0 diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 35bdedbf0..5f1909e59 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -598,7 +598,7 @@ subroutine q65_dec1(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) integer dat4(13) character c77*77,decoded*37 logical unpk77_success - + nFadingModel=1 decoded=' ' call q65_intrinsics_ff(s3,nsubmode,b90ts,nFadingModel,s3prob) @@ -894,12 +894,11 @@ subroutine q65_hist2(msg0,callers,nhist2) callers(nhist2)%grid=g4 callers(nhist2)%nsec=time() rewind(24) - write(24) nhist2,callers(1:nhist2) + write(24,3024) nhist2,callers(1:nhist2) +3024 format(i5/(a6,2x,a4,2x,i10)) rewind(24) endif -! print*,'c',nhist2,trim(msg),' ',c6,' ',g4 - 900 return end subroutine q65_hist2 diff --git a/lib/qra/q65/q65_set_list2.f90 b/lib/qra/q65/q65_set_list2.f90 index 1015ac975..31c920f95 100644 --- a/lib/qra/q65/q65_set_list2.f90 +++ b/lib/qra/q65/q65_set_list2.f90 @@ -4,9 +4,10 @@ subroutine q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) parameter (MAX_NCW=206) parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode character*12 mycall,hiscall - character*6 hisgrid + character*6 hisgrid,c6 + character*4 g4 character*37 msg,msgsent - logical my_std,his_std + logical std,isgrid integer codewords(63,MAX_NCW) integer itone(85) integer isync(22) @@ -15,59 +16,56 @@ subroutine q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ -! print*,'b nhist2:',nhist2 - if(nhist2.ne.-99) return - - ncw=0 - if(hiscall(1:1).eq. ' ') return - call stdcall(mycall,my_std) - call stdcall(hiscall,his_std) - - ncw=MAX_NCW - do i=1,ncw - msg=trim(mycall)//' '//trim(hiscall) - if(.not.my_std) then - if(i.eq.1 .or. i.ge.6) msg='<'//trim(mycall)//'> '//trim(hiscall) - if(i.ge.2 .and. i.le.4) msg=trim(mycall)//' <'//trim(hiscall)//'>' - else if(.not.his_std) then - if(i.le.4 .or. i.eq.6) msg='<'//trim(mycall)//'> '//trim(hiscall) - if(i.ge.7) msg=trim(mycall)//' <'//trim(hiscall)//'>' - 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(his_std) msg='CQ '//trim(hiscall)//' '//hisgrid(1:4) - if(.not.his_std) msg='CQ '//trim(hiscall) - endif - if(i.eq.6 .and. his_std) msg(j0:j0+3)=hisgrid(1:4) - 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 + isgrid(g4)=g4(1:1).ge.'A' .and. g4(1:1).le.'R' .and. g4(2:2).ge.'A' .and. & + g4(2:2).le.'R' .and. g4(3:3).ge.'0' .and. g4(3:3).le.'9' .and. & + g4(4:4).ge.'0' .and. g4(4:4).le.'9' .and. g4(1:4).ne.'RR73' - call genq65(msg,0,msgsent,itone,i3,n3) - i0=1 - j=0 - do k=1,85 - if(k.eq.isync(i0)) then - i0=i0+1 - cycle + call stdcall(hiscall,std) + jmax=nhist2 + if(std .and. isgrid(hisgrid(1:4))) then + jmax=nhist2+1 + do j=1,nhist2 + if(callers(j)%call .eq. hiscall(1:6)) then + jmax=nhist2 + exit endif - j=j+1 - codewords(j,i)=itone(k) - 1 enddo -! write(71,3001) i,isnr,codewords(1:13,i),trim(msg) -!3001 format(i3,2x,i3.2,2x,13i3,2x,a) + endif + + codewords(:,1)=0 + i=1 + do j=1,jmax + c6=callers(j)%call + g4=callers(j)%grid + if(j.eq.nhist2+1) then + c6=hiscall(1:6) + g4=hisgrid(1:4) + endif + do k=1,5 + i=i+1 + msg=trim(mycall)//' '//trim(c6) + j0=len(trim(msg))+1 + if(k.eq.1) msg=msg(1:j0)//g4 + if(k.eq.2) msg=msg(1:j0)//'R '//g4 + if(k.eq.3) msg(j0:j0+3)=' RRR' + if(k.eq.4) msg(j0:j0+4)=' RR73' + if(k.eq.5) msg(j0:j0+2)=' 73' + call genq65(msg,0,msgsent,itone,i3,n3) + i0=1 + jj=0 + do kk=1,85 + if(kk.eq.isync(i0)) then + i0=i0+1 + cycle + endif + jj=jj+1 + codewords(jj,i)=itone(kk) - 1 + enddo + write(71,3001) i,j,k,codewords(1:13,i),trim(msg) +3001 format(3i3,2x,13i3,2x,a) + enddo enddo -! print*,'aa',ncontest,ncw,1970.0 + time()/(365.25*86400.0) + ncw=i return end subroutine q65_set_list2 From a83649a7683f05deda9db66728c2e6240c35bc89 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 10 Feb 2023 10:37:27 -0500 Subject: [PATCH 215/251] Working to improve Q65 decode performnce. --- lib/q65_decode.f90 | 10 ++++++---- lib/qra/q65/q65.f90 | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 8114565b1..88c54e620 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -228,10 +228,10 @@ contains read(c78,1060) apsymbols endif - call timer('q65loops',0) + call timer('q65loop1',0) call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) - call timer('q65loops',1) + call timer('q65loop1',1) ! write(*,3001) '=b',nfqso,ntol,ndepth,xdt,f0,idec if(idec.ge.0) then dtdec=xdt1 @@ -366,6 +366,8 @@ contains if(lapcqonly) npasses=1 iaptype=0 do ipass=0,npasses !Loop over AP passes +! write(*,3001) nutc,icand,ipass,f0,xdt,snr1 +!3001 format('a',i5.4,2i3,3f7.1) apmask=0 !Try first with no AP information apsymbols=0 if(ipass.ge.1) then @@ -378,10 +380,10 @@ contains read(c78,1060) apsymbols endif - call timer('q65loops',0) + call timer('q65loop2',0) call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) - call timer('q65loops',1) + call timer('q65loop2',1) ! write(*,3001) '=e',nfqso,ntol,ndepth,xdt,f0,idec if(idec.ge.0) then dtdec=xdt1 diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 5f1909e59..a62193df8 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -567,6 +567,10 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & ! Save parameters for best candidates jzz=ib-ia+1 call indexx(ccf2(ia:ib),jzz,indx) + + call pctile(ccf2(ia:ib),jzz,50,ave) + call pctile(ccf2(ia:ib),jzz,84,base) + rms=base-ave ncand=0 maxcand=20 do j=1,20 @@ -578,8 +582,10 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & i4=min(iz,i+mode_q65) biggest=maxval(ccf2(i3:i4)) if(ccf2(i).ne.biggest) cycle + snr=(ccf2(i)-ave)/rms + if(snr.lt.6.0) exit ncand=ncand+1 - candidates(ncand,1)=ccf2(i) + candidates(ncand,1)=snr candidates(ncand,2)=xdt2(i) candidates(ncand,3)=f if(ncand.ge.maxcand) exit From d1a1578bc70ccd428652522ba32e5a45068d1d2b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 10 Feb 2023 13:09:47 -0500 Subject: [PATCH 216/251] Working to optimize the setting of ibwa and ibwb. Needs work still! --- lib/q65_decode.f90 | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 88c54e620..aa7657df1 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -126,7 +126,6 @@ contains nhist2=nhist2-1 endif enddo -! print*,'a nhist2:',nhist2 endif ! Determine the T/R sequence: iseq=0 (even), or iseq=1 (odd) @@ -161,7 +160,15 @@ contains this%callback => callback nFadingModel=1 - ibwa=max(1,int(1.8*log(baud*mode_q65)) + 5) +! ibwa=max(1,int(1.8*log(baud*mode_q65)) + 5) +!### This needs work! + ibwa=0 !Q65-60A + if(mode_q65.eq.2) ibwa=3 !Q65-60B + if(mode_q65.eq.4) ibwa=8 !Q65-60C + if(mode_q65.eq.2) ibwa=9 !Q65-60D + if(mode_q65.eq.2) ibwa=10 !Q65-60E +!### + ibwb=min(15,ibwa+4) maxiters=40 if(iand(ndepth,3).eq.2) maxiters=60 @@ -170,6 +177,7 @@ contains ibwb=ibwb+2 maxiters=100 endif +! print*,'a',iand(ndepth,3),ibwa,ibwb,maxiters ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' @@ -331,13 +339,13 @@ contains 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,'// & + fmt='(i6.4,1x,a4,i5,4i2,8i3,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) + ibwa,ibwb,ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt, & + f0,snr2,plog,tdecode,mycall(1:6),c6,c4,trim(decoded) close(22) endif endif @@ -428,13 +436,14 @@ contains 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,'// & + fmt='(i6.4,1x,a4,i5,4i2,8i3,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) + idtbest,ibwa,ibwb,ibw,ndistbest,nused,icand,ncand,nrc, & + ndepth,xdt,f0,snr2,plog,tdecode,mycall(1:6),c6,c4, & + trim(decoded) close(22) endif endif From 260f867cb9b19174bc04311451a77b5b333c3046 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 10 Feb 2023 14:31:45 -0500 Subject: [PATCH 217/251] Optimization looks pretty good for Q65-60A. What about 60C? --- lib/q65_decode.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index aa7657df1..318504314 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -162,7 +162,7 @@ contains ! ibwa=max(1,int(1.8*log(baud*mode_q65)) + 5) !### This needs work! - ibwa=0 !Q65-60A + ibwa=1 !Q65-60A if(mode_q65.eq.2) ibwa=3 !Q65-60B if(mode_q65.eq.4) ibwa=8 !Q65-60C if(mode_q65.eq.2) ibwa=9 !Q65-60D From 31bc12e3b9dc73ff947277e7774b68de893aff1e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 11 Feb 2023 14:08:10 -0500 Subject: [PATCH 218/251] Increase ibwb; enforce MAX_CALLERS. --- lib/q65_decode.f90 | 7 ++++--- lib/qra/q65/q65.f90 | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 318504314..e4facadd9 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -169,7 +169,8 @@ contains if(mode_q65.eq.2) ibwa=10 !Q65-60E !### - ibwb=min(15,ibwa+4) +! ibwb=min(15,ibwa+4) + ibwb=min(15,ibwa+6) maxiters=40 if(iand(ndepth,3).eq.2) maxiters=60 if(iand(ndepth,3).eq.3) then @@ -177,7 +178,6 @@ contains ibwb=ibwb+2 maxiters=100 endif -! print*,'a',iand(ndepth,3),ibwa,ibwb,maxiters ! Generate codewords for full-AP list decoding if(ichar(hiscall(1:1)).eq.0) hiscall=' ' @@ -185,7 +185,8 @@ contains ncw=0 if(nqd.eq.1 .or. lagain) then if(ncontest.eq.1) then - call q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) + call q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2, & + codewords,ncw) else call q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) endif diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index a62193df8..07676e13b 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -895,6 +895,11 @@ subroutine q65_hist2(msg0,callers,nhist2) enddo if(newcall .and. isgrid(g4)) then + if(nhist2.eq.MAX_CALLERS) then +! Purge the oldest caller + callers(1:MAX_CALLERS-1)=callers(2:MAX_CALLERS) + nhist2=nhist2-1 + endif nhist2=nhist2+1 callers(nhist2)%call=c6 callers(nhist2)%grid=g4 From 871198c44f0fcd471a12698b84e0770bc389e6e4 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 11 Feb 2023 15:41:33 -0500 Subject: [PATCH 219/251] Disable diagnostic write. --- lib/qra/q65/q65_set_list2.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/qra/q65/q65_set_list2.f90 b/lib/qra/q65/q65_set_list2.f90 index 31c920f95..6cce406c6 100644 --- a/lib/qra/q65/q65_set_list2.f90 +++ b/lib/qra/q65/q65_set_list2.f90 @@ -61,8 +61,8 @@ subroutine q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) jj=jj+1 codewords(jj,i)=itone(kk) - 1 enddo - write(71,3001) i,j,k,codewords(1:13,i),trim(msg) -3001 format(3i3,2x,13i3,2x,a) +! write(71,3001) i,j,k,codewords(1:13,i),trim(msg) +!3001 format(3i3,2x,13i3,2x,a) enddo enddo ncw=i From 7bf6a6123d8d3b3567b715058f89e010d73cfa65 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 12 Feb 2023 17:33:21 -0500 Subject: [PATCH 220/251] More progress on q3list decodes in NA VHF contest mode, Q65-60A. --- lib/decoder.f90 | 18 +++++++++++++- lib/map65_mmdec.f90 | 3 ++- lib/q65_decode.f90 | 58 +++++++++++++++++++++++++++++++++++++++------ lib/qra/q65/q65.f90 | 2 +- 4 files changed, 71 insertions(+), 10 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 0b12d020d..30a94b42b 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -45,6 +45,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) real ss(184,NSMAX) logical baddata,newdat65,newdat9,single_decode,bVHF,bad0,newdat,ex integer*2 id2(NTMAX*12000) + integer nqf(20) type(params_block) :: params real*4 dd(NTMAX*12000) character(len=20) :: datetime @@ -211,7 +212,22 @@ subroutine multimode_decoder(ss,id2,params,nfsample) params%nfa,params%nfb,logical(params%nclearave), & single_decode,logical(params%nagain),params%max_drift, & logical(params%newdat),params%emedelay,mycall,hiscall,hisgrid, & - params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0) + params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0,nqf) + +!### + do k=1,20 + if(nqf(k).eq.0) exit + nqd=1 + navg0=0 + ntol=5 + call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & + params%nsubmode,nqf(k),ntol,params%ndepth, & + params%nfa,params%nfb,logical(params%nclearave), & + .true.,.true.,params%max_drift, & + .false.,params%emedelay,mycall,hiscall,hisgrid, & + params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0,nqf) + enddo +!### call timer('dec_q65 ',1) close(17) go to 800 diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index 3e28e5464..52b70a4d7 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -14,6 +14,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & logical single_decode,bVHF,lnewdat,lagain,lclearave,lapcqonly integer*2 id2(300*12000) + integer nqf(20) ! type(params_block) :: params character(len=12) :: mycall, hiscall character(len=6) :: hisgrid @@ -43,7 +44,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & call timer('dec_q65 ',0) call my_q65%decode(q65_decoded,id2,nqd,nutc,ntrperiod,nsubmode,nfqso, & ntol,ndepth,nfa,nfb,lclearave,single_decode,lagain,max_drift,lnewdat, & - emedelay,mycall,hiscall,hisgrid,nQSOProgress,ncontest,lapcqonly,navg0) + emedelay,mycall,hiscall,hisgrid,nQSOProgress,ncontest,lapcqonly,navg0,nqf) call timer('dec_q65 ',1) return diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index e4facadd9..879e840f7 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -33,7 +33,7 @@ contains subroutine decode(this,callback,iwave,nqd0,nutc,ntrperiod,nsubmode,nfqso, & ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,max_drift0, & lnewdat0,emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest, & - lapcqonly,navg0) + lapcqonly,navg0,nqf) ! Top-level routine that organizes the decoding of Q65 signals ! Input: iwave Raw data, i*2 @@ -74,24 +74,26 @@ contains character*80 fmt integer*2 iwave(NMAX) !Raw data real, allocatable :: dd(:) !Raw data + real xdtdecodes(100) real f0decodes(100) integer dat4(13) !Decoded message as 12 6-bit integers integer dgen(13) - integer nq65param(3) + integer nqf(20) integer stageno !Added by W3SZ integer time logical lclearave,lnewdat0,lapcqonly,unpk77_success - logical single_decode,lagain,ex + logical single_decode,lagain complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s type(q3list) callers(MAX_CALLERS) - + ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) stageno=0 ndecodes=0 decodes=' ' f0decodes=0. + xdtdecodes=0. nfa=nfa0 nfb=nfb0 nqd=nqd0 @@ -183,7 +185,7 @@ contains if(ichar(hiscall(1:1)).eq.0) hiscall=' ' if(ichar(hisgrid(1:1)).eq.0) hisgrid=' ' ncw=0 - if(nqd.eq.1 .or. lagain) then + if(nqd.eq.1 .or. lagain .or. ncontest.eq.1) then if(ncontest.eq.1) then call q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2, & codewords,ncw) @@ -214,6 +216,7 @@ contains f0dec=f0 go to 100 endif + if(ncontest.eq.1 .and. lagain) go to 100 ! Prepare for a single-period decode with iaptype = 0, 1, 2, or 4 jpk0=(xdt+1.0)*6000 !Index of nominal start of signal @@ -318,6 +321,7 @@ contains ndecodes=min(ndecodes+1,100) decodes(ndecodes)=decoded f0decodes(ndecodes)=f0dec + xdtdecodes(ndecodes)=dtdec call q65_snr(dat4,dtdec,f0dec,mode_q65,snr2) nsnr=nint(snr2) call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & @@ -363,6 +367,24 @@ contains fdiff=f0-f0decodes(i) if(fdiff.gt.-baud*mode_q65 .and. fdiff.lt.65*baud*mode_q65) go to 800 enddo + +!### TEST REGION + if(ncontest.eq.-1) then + call timer('q65_dec0',0) +! Call top-level routine in q65 module: establish sync and try for a +! q3 or q0 decode. + call q65_dec0(iavg,iwave,ntrperiod,nint(f0),ntol,lclearave, & + emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) + call timer('q65_dec0',1) + write(*,3001) icand,nint(f0),xdt,idec +3001 format('a',i3,i5,f6.1,i3) + if(idec.ge.0) then + dtdec=xdt !We have a q3 or q0 decode at f0 + f0dec=f0 + go to 200 + endif + endif +!### jpk0=(xdt+1.0)*6000 !Index of nominal start of signal if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000 !For shortest sequences if(jpk0.lt.0) jpk0=0 @@ -452,9 +474,31 @@ contains 800 continue enddo ! icand if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50 - 900 close(24) - return + + if(ncontest.ne.1 .or. lagain) go to 999 + if(ntrperiod.ne.60 .or. nsubmode.ne.0) go to 999 + +! This is first time here, and we're running Q65-60A in NA VHF Contest mode. +! Return a list of potential sync frequencies at which to try q3 decoding. + + k=0 + nqf=0 + bw=baud*mode_q65*65 + do i=1,ncand +! snr1=candidates(i,1) +! xdt= candidates(i,2) + f0 = candidates(i,3) + do j=1,ndecodes ! Already decoded one at or near this frequency? + fj=f0decodes(j) + if(f0.gt.fj-5.0 .and. f0.lt.fj+bw+5.0) go to 990 + enddo + k=k+1 + nqf(k)=nint(f0) +990 continue + enddo + +999 return end subroutine decode end module q65_decode diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 07676e13b..922370b64 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -618,7 +618,7 @@ subroutine q65_dec1(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded) irc=-1 endif nrc=irc - + return end subroutine q65_dec1 From 7513a63ac5a0a69c50ddacf81b2f2024801626b7 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 11:49:12 -0500 Subject: [PATCH 221/251] Include WW-Digi contest for q3 decodes. Make LU 24 binary again. Set q3list timeout to 24 h. --- lib/q65_decode.f90 | 15 ++++++--------- lib/qra/q65/q65.f90 | 3 +-- widgets/mainwindow.cpp | 3 ++- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 879e840f7..f3366b61c 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -86,7 +86,7 @@ contains complex, allocatable :: c00(:) !Analytic signal, 6000 Sa/s complex, allocatable :: c0(:) !Analytic signal, 6000 Sa/s type(q3list) callers(MAX_CALLERS) - + ! Start by setting some parameters and allocating storage for large arrays call sec0(0,tdecode) stageno=0 @@ -113,17 +113,14 @@ contains mycall13=mycall nhist2=0 if(ncontest.eq.1) then -! NA VHF Contest or ARRL Digi Contest -! open(24,file=trim(data_dir)//'/q3list.bin',status='unknown', & -! form='unformatted') -! read(24,end=2) nhist2,callers(1:nhist2) - open(24,file=trim(data_dir)//'/q3list.bin',status='unknown') - read(24,3024,end=2) nhist2,callers(1:nhist2) -3024 format(i5/(a6,2x,a4,2x,i10)) +! NA VHF, WW-Digi, or ARRL Digi Contest + open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & + form='unformatted') + read(24,end=2) nhist2,callers(1:nhist2) now=time() do i=1,nhist2 hours=(now - callers(i)%nsec)/3600.0 - if(hours.gt.18.0) then + if(hours.gt.24.0) then callers(i:nhist2-1)=callers(i+1:nhist2) nhist2=nhist2-1 endif diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 922370b64..6d180edbc 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -905,8 +905,7 @@ subroutine q65_hist2(msg0,callers,nhist2) callers(nhist2)%grid=g4 callers(nhist2)%nsec=time() rewind(24) - write(24,3024) nhist2,callers(1:nhist2) -3024 format(i5/(a6,2x,a4,2x,i10)) + write(24) nhist2,callers(1:nhist2) rewind(24) endif diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 76a900c46..c2bbc7128 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3373,7 +3373,8 @@ void MainWindow::decode() //decode() if(m_config.decode_at_52s()) dec_data.params.emedelay=2.5; dec_data.params.minSync=ui->syncSpinBox->isVisible () ? m_minSync : 0; dec_data.params.nexp_decode=int(m_specOp); - if(dec_data.params.nexp_decode==8) dec_data.params.nexp_decode=1; //NA VHF and ARRL Digi are same + if(dec_data.params.nexp_decode==5) dec_data.params.nexp_decode=1; //NA VHF, WW Digi, and ARRL Digi + if(dec_data.params.nexp_decode==8) dec_data.params.nexp_decode=1; //contests all use grid exchange if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); From b252abb4623ae1461503182131054d4ff94b1bb9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 11:57:35 -0500 Subject: [PATCH 222/251] Keep plotting gains for orange and red Q65 sync curves constant. --- lib/qra/q65/q65.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 6d180edbc..65f72a821 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -691,9 +691,9 @@ subroutine q65_write_red(iz,xdt,ccf2_avg,ccf2) i2=min(iz,int(nfb/df)) y0=minval(ccf2(i1:i2)) y0_avg=minval(ccf2_avg(i1:i2)) - g=1.0/(maxval(ccf2(i1:i2))-y0) + g=0.4 g_avg=0. - if(maxval(ccf2_avg(i1:i2)).ne.y0_avg) g_avg=1.0/(maxval(ccf2_avg(i1:i2))-y0_avg) + if(maxval(ccf2_avg(i1:i2)).ne.y0_avg) g_avg=g do i=i1,i2 freq=i*df From 37cd5b3ede0794e08708db805ce3365ffc91bc29 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 13:52:01 -0500 Subject: [PATCH 223/251] Activate q3list decodes for message averaging. (What to do about "Clear Avg" ?) --- lib/q65_decode.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index f3366b61c..a0a3afaf6 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -213,7 +213,7 @@ contains f0dec=f0 go to 100 endif - if(ncontest.eq.1 .and. lagain) go to 100 + if(ncontest.eq.1 .and. lagain) go to 50 ! Prepare for a single-period decode with iaptype = 0, 1, 2, or 4 jpk0=(xdt+1.0)*6000 !Index of nominal start of signal @@ -252,10 +252,10 @@ contains if(iand(ndepth,16).eq.0 .or. navg(iseq).lt.2) go to 100 ! There was no single-transmission decode. Try for an average 'q3n' decode. -50 call timer('list_avg',0) +50 iavg=1 + call timer('list_avg',0) ! Call top-level routine in q65 module: establish sync and try for a q3 ! decode, this time using the cumulative 's1a' symbol spectra. - iavg=1 call q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('list_avg',1) From 6877a87fe4d440400a6a56e96383f99e11309da5 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 15:46:06 -0500 Subject: [PATCH 224/251] Allow q65sim toi generate multiple signals. --- lib/qra/q65/q65sim.f90 | 117 ++++++++++++++++++++++++++--------------- lib/sumsim.f90 | 2 +- 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/lib/qra/q65/q65sim.f90 b/lib/qra/q65/q65sim.f90 index f3db7b9d6..f24cbc66f 100644 --- a/lib/qra/q65/q65sim.f90 +++ b/lib/qra/q65/q65sim.f90 @@ -8,6 +8,7 @@ program q65sim type(hdr) h !Header for .wav file integer*2 iwave(NMAX) !Generated waveform integer itone(85) !Channel symbols (values 0-65) + integer ntone(85,10) !Channel symbols for up to 10 messages integer y(63) !Codeword integer istart !averaging compatible start seconds integer imins !minutes for 15s period timestamp @@ -18,18 +19,19 @@ program q65sim complex cspread(0:NMAX-1) !Complex amplitude for Rayleigh fading complex z real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq - character msg*37,fname*17,csubmode*1,arg*12 - character msgsent*37 + character fname*17,csubmode*1,arg*12,c2*2 + character*37 msg,msgsent,imsg(10) nargs=iargc() - if(nargs.ne.10) then - print*,'Usage: q65sim "msg" A-E freq fDop DT f1 Stp TRp Nfile SNR' - print*,'Example: q65sim "K1ABC W9XYZ EN37" A 1500 0.0 0.0 0.0 1 60 1 -26' + if(nargs.ne.11) then + print*,'Usage: q65sim "msg" A-E freq fDop DT f1 Stp TRp Nsig Nfile SNR' + print*,'Example: q65sim "K1ABC W9XYZ EN37" A 1500 0.0 0.0 0.0 1 60 1 1 -26' print*,'Example: q65sim "ST" A 1500 0.0 0.0 0.0 1 60 1 -26' print*,' fDop = Doppler spread' print*,' f1 = Drift or Doppler rate (Hz/min)' print*,' Stp = Step size (Hz)' print*,' Stp = 0 implies no Doppler tracking' + print*,' Nsig = number of generated signals, 1 - 10' print*,' Creates filenames which increment to permit averaging in first period' print*,' If msg = ST program produces a single tone at freq' go to 999 @@ -50,8 +52,10 @@ program q65sim call getarg(8,arg) read(arg,*) ntrperiod call getarg(9,arg) - read(arg,*) nfiles + read(arg,*) nsig call getarg(10,arg) + read(arg,*) nfiles + call getarg(11,arg) read(arg,*) snrdb if(ntrperiod.eq.15) then @@ -79,22 +83,39 @@ program q65sim nsym=85 !Number of channel symbols mode65=2**(ichar(csubmode) - ichar('A')) - ichk=0 - call genq65(msg,ichk,msgsent,itone,i3,n3) + + imsg(1)=msg + if(nsig.ge.2) then + i0=index(msg,' ') + i0=i0 + index(msg(i0+1:),' ')-2 + do i=1,nsig + c2=char(ichar('A')+i-1)//char(ichar('A')+i-1) + imsg(i)=msg(1:i0-1)//c2//msg(i0+2:) + enddo + endif - j=0 - do i=1,85 - if(itone(i).gt.0) then - j=j+1 - y(j)=itone(i)-1 - endif + ichk=0 + do i=1,nsig + msg=imsg(i) + call genq65(msg,ichk,msgsent,itone,i3,n3) + ntone(:,i)=itone enddo - write(*,1001) y(1:13),y(1:13) + + if(nsig.eq.1) then + j=0 + do i=1,85 + if(itone(i).gt.0) then + j=j+1 + y(j)=itone(i)-1 + endif + enddo + write(*,1001) y(1:13),y(1:13) 1001 format('Generated message'/'6-bit: ',13i3/'binary: ',13b6.6) - write(*,1002) y + write(*,1002) y 1002 format(/'Codeword:'/(20i3)) - write(*,1003) itone + write(*,1003) itone 1003 format(/'Channel symbols:'/(20i3)) + endif baud=12000.d0/nsps !Keying rate (6.67 baud fot 15-s sequences) h=default_header(12000,npts) @@ -116,43 +137,53 @@ program q65sim open(10,file=trim(fname),access='stream',status='unknown') xnoise=0. - cdat=0. if(snrdb.lt.90) then do i=1,npts xnoise(i)=gran() !Generate gaussian noise enddo endif + cdat=0. bandwidth_ratio=2500.0/6000.0 sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) if(snrdb.gt.90.0) sig=1.0 write(*,1020) ifile,ntrperiod,f0,csubmode,snrdb,fspread,xdt,f1,nstp,trim(msgsent) -1020 format(i4,i6,f7.1,2x,a1,2x,f5.1,1x,f6.2,2f6.1,i4,2x,a) - phi=0.d0 - dphi=0.d0 - k=(xdt+0.5)*12000 !Start audio at t=xdt+0.5 s (TR=15 and 30 s) - if(ntrperiod.ge.60) k=(xdt+1.0)*12000 !TR 60+ at t = xdt + 1.0 s - isym0=-99 - do i=1,npts !Add this signal into cdat() - isym=i/nsps + 1 - if(isym.gt.nsym) exit - if(isym.ne.isym0) then - freq_drift=f1*i*dt/60.0 - if(nstp.ne.0) freq_drift=freq_drift - nstp*nint(freq_drift/nstp) - if (msg(1:2).eq.'ST') then - freq = f0 + freq_drift - else - freq = f0 + freq_drift + itone(isym)*baud*mode65 - endif - dphi=twopi*freq*dt - isym0=isym +1020 format(i4,i6,f7.1,2x,a1,2x,f5.1,1x,f6.2,2f6.1,i4,2x,a) + + n=65.0*baud*mode65/100.0 + 0.9999 + nfstep=100*n + nf1=1500 - nfstep*nsig/2 + do n=1,nsig + if(nsig.ge.2) then + f0=nf1 + (n-1)*nfstep + itone=ntone(:,n) endif - phi=phi + dphi - if(phi.gt.twopi) phi=phi-twopi - xphi=phi - z=cmplx(cos(xphi),sin(xphi)) - k=k+1 - if(k.ge.1) cdat(k)=cdat(k) + sig*z + phi=0.d0 + dphi=0.d0 + k=(xdt+0.5)*12000 !Start audio at t=xdt+0.5 s (TR=15 and 30 s) + if(ntrperiod.ge.60) k=(xdt+1.0)*12000 !TR 60+ at t = xdt + 1.0 s + isym0=-99 + do i=1,npts !Add this signal into cdat() + isym=i/nsps + 1 + if(isym.gt.nsym) exit + if(isym.ne.isym0) then + freq_drift=f1*i*dt/60.0 + if(nstp.ne.0) freq_drift=freq_drift - nstp*nint(freq_drift/nstp) + if (msg(1:2).eq.'ST') then + freq = f0 + freq_drift + else + freq = f0 + freq_drift + itone(isym)*baud*mode65 + endif + dphi=twopi*freq*dt + isym0=isym + endif + phi=phi + dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + z=cmplx(cos(xphi),sin(xphi)) + k=k+1 + if(k.ge.1) cdat(k)=cdat(k) + sig*z + enddo enddo if(fspread.ne.0) then !Apply specified Doppler spread diff --git a/lib/sumsim.f90 b/lib/sumsim.f90 index dba801470..594b8b207 100644 --- a/lib/sumsim.f90 +++ b/lib/sumsim.f90 @@ -35,7 +35,7 @@ program sumsim fac=1.0/nargs iwave(1:npts)=nint(fac*wave(1:npts)) - open(12,file='000000_0000.wav',access='stream',status='unknown') + open(12,file='000001_0000.wav',access='stream',status='unknown') write(12) h,iwave(1:npts) close(12) From b5f9e0ff033e2f9846a0fa8abee159a04a0256d9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 15:50:26 -0500 Subject: [PATCH 225/251] Fix the starting frequency for multiple simulated signals. --- lib/qra/q65/q65sim.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/qra/q65/q65sim.f90 b/lib/qra/q65/q65sim.f90 index f24cbc66f..433200d6b 100644 --- a/lib/qra/q65/q65sim.f90 +++ b/lib/qra/q65/q65sim.f90 @@ -152,7 +152,7 @@ program q65sim n=65.0*baud*mode65/100.0 + 0.9999 nfstep=100*n - nf1=1500 - nfstep*nsig/2 + nf1=1500 - nfstep*(nsig-1)/2 do n=1,nsig if(nsig.ge.2) then f0=nf1 + (n-1)*nfstep From f9d2ca736df4d457a9eb88392d1865a0ae4f139c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 15:58:20 -0500 Subject: [PATCH 226/251] Another minor tweak to q65sim. --- lib/qra/q65/q65sim.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/qra/q65/q65sim.f90 b/lib/qra/q65/q65sim.f90 index 433200d6b..8007a55a9 100644 --- a/lib/qra/q65/q65sim.f90 +++ b/lib/qra/q65/q65sim.f90 @@ -18,7 +18,7 @@ program q65sim complex cdat(NMAX) !Generated complex waveform complex cspread(0:NMAX-1) !Complex amplitude for Rayleigh fading complex z - real*8 f0,dt,twopi,phi,dphi,baud,fsample,freq + real*8 f00,f0,dt,twopi,phi,dphi,baud,fsample,freq character fname*17,csubmode*1,arg*12,c2*2 character*37 msg,msgsent,imsg(10) @@ -40,7 +40,7 @@ program q65sim call getarg(2,csubmode) mode65=2**(ichar(csubmode)-ichar('A')) call getarg(3,arg) - read(arg,*) f0 + read(arg,*) f00 call getarg(4,arg) read(arg,*) fspread call getarg(5,arg) @@ -147,7 +147,7 @@ program q65sim bandwidth_ratio=2500.0/6000.0 sig=sqrt(2*bandwidth_ratio)*10.0**(0.05*snrdb) if(snrdb.gt.90.0) sig=1.0 - write(*,1020) ifile,ntrperiod,f0,csubmode,snrdb,fspread,xdt,f1,nstp,trim(msgsent) + write(*,1020) ifile,ntrperiod,f00,csubmode,snrdb,fspread,xdt,f1,nstp,trim(msgsent) 1020 format(i4,i6,f7.1,2x,a1,2x,f5.1,1x,f6.2,2f6.1,i4,2x,a) n=65.0*baud*mode65/100.0 + 0.9999 @@ -155,6 +155,7 @@ program q65sim nf1=1500 - nfstep*(nsig-1)/2 do n=1,nsig if(nsig.ge.2) then + f0=f00 f0=nf1 + (n-1)*nfstep itone=ntone(:,n) endif From da3c63e739b66d08848d3c224941314a11d6818c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 17:05:15 -0500 Subject: [PATCH 227/251] Process the q3 candidates in frequency order rather than snr1 order. --- lib/qra/q65/q65.f90 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 65f72a821..2e933a9e2 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -493,6 +493,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & real s1(iz,jz) real ccf2(iz) !Orange sync curve + real tmp(20,3) real, allocatable :: xdt2(:) real, allocatable :: s1avg(:) integer, allocatable :: indx(:) @@ -591,6 +592,13 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & if(ncand.ge.maxcand) exit enddo +! Resort the candidates back into frequency order + tmp(1:ncand,1:3)=candidates(1:ncand,1:3) + call indexx(tmp(1:ncand,3),ncand,indx) + do i=1,ncand + candidates(i,1:3)=tmp(indx(i),1:3) + enddo + return end subroutine q65_ccf_22 From 47aeb84c052547a95dc99ae23234582ee9697c80 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 15 Feb 2023 17:27:51 -0500 Subject: [PATCH 228/251] Try for q3 averages only if 'Enable averaging' is checked. --- lib/q65_decode.f90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index a0a3afaf6..f3367d481 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -213,7 +213,9 @@ contains f0dec=f0 go to 100 endif - if(ncontest.eq.1 .and. lagain) go to 50 + + if(ncontest.eq.1 .and. lagain .and. iand(ndepth,16).eq.16) go to 50 + if(ncontest.eq.1 .and. lagain .and. iand(ndepth,16).eq.0) go to 100 ! Prepare for a single-period decode with iaptype = 0, 1, 2, or 4 jpk0=(xdt+1.0)*6000 !Index of nominal start of signal From 5cdc476cbc864607fe1034da32230788fd9c6f56 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 16 Feb 2023 16:50:24 -0500 Subject: [PATCH 229/251] Work toward display of q3list in Active Stations Window. --- CMakeLists.txt | 1 + lib/get_q3list.f90 | 36 ++++++++++++++++++++++++++++++++++++ lib/q65_decode.f90 | 16 +++++++++++----- lib/qra/q65/q65.f90 | 5 ++--- lib/types.f90 | 1 + widgets/activeStations.cpp | 7 +++++-- widgets/mainwindow.cpp | 24 ++++++++++++++++++++++++ 7 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 lib/get_q3list.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index f274b5560..df5605e2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -327,6 +327,7 @@ set (wsjt_FSRCS lib/ft8_decode.f90 lib/ft4_decode.f90 lib/fst4_decode.f90 + lib/get_q3list.f90 lib/jt9_decode.f90 lib/options.f90 lib/packjt.f90 diff --git a/lib/get_q3list.f90 b/lib/get_q3list.f90 new file mode 100644 index 000000000..f6c3d7176 --- /dev/null +++ b/lib/get_q3list.f90 @@ -0,0 +1,36 @@ +subroutine get_q3list(fname,nlist,list) + + type q3list + character*6 call + character*4 grid + integer nsec + integer nfreq + end type q3list + + parameter (MAX_CALLERS=40) + character*(*) fname + character*36 list(40) + integer time + integer indx(MAX_CALLERS) + type(q3list) callers(MAX_CALLERS) + + + nhist2=0 + open(24,file=fname,status='unknown',form='unformatted') + read(24,end=1) nhist2,callers(1:nhist2) +1 close(24) + + moon_el=0 + now=time() + nlist=nhist2 + call indexx(callers(1:nlist)%nfreq,nlist,indx) + do i=1,nlist + hours=(now - callers(i)%nsec)/3600.0 + j=indx(i) + write(list(i),1000) i,callers(j)%nfreq,callers(j)%call, & + callers(j)%grid,moon_el,hours,char(0) +1000 format(i2,'.',i6,2x,a6,2x,a4,i5,f7.1,a1) + enddo + + return +end subroutine get_q3list diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index f3367d481..fb452377c 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -125,10 +125,11 @@ contains nhist2=nhist2-1 endif enddo +2 close(24) endif ! Determine the T/R sequence: iseq=0 (even), or iseq=1 (odd) -2 n=nutc + n=nutc if(ntrperiod.ge.60 .and. nutc.le.2359) n=100*n write(cutc,'(i6.6)') n read(cutc,'(3i2)') ih,im,is @@ -326,7 +327,10 @@ contains call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) if(ncontest.eq.1) then - call q65_hist2(decoded,callers,nhist2) + open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & + form='unformatted') + call q65_hist2(nint(f0dec),decoded,callers,nhist2) + close(24) else call q65_hist(nint(f0dec),msg0=decoded) endif @@ -440,7 +444,10 @@ contains call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, & idec,nused,ntrperiod) if(ncontest.eq.1) then - call q65_hist2(decoded,callers,nhist2) + open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & + form='unformatted') + call q65_hist2(nint(f0dec),decoded,callers,nhist2) + close(24) else call q65_hist(nint(f0dec),msg0=decoded) endif @@ -473,9 +480,8 @@ contains 800 continue enddo ! icand if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50 -900 close(24) - if(ncontest.ne.1 .or. lagain) go to 999 +900 if(ncontest.ne.1 .or. lagain) go to 999 if(ntrperiod.ne.60 .or. nsubmode.ne.0) go to 999 ! This is first time here, and we're running Q65-60A in NA VHF Contest mode. diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 2e933a9e2..fb323092f 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -866,7 +866,7 @@ subroutine q65_hist(if0,msg0,dxcall,dxgrid) 900 return end subroutine q65_hist -subroutine q65_hist2(msg0,callers,nhist2) +subroutine q65_hist2(nfreq,msg0,callers,nhist2) use types parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode @@ -912,9 +912,8 @@ subroutine q65_hist2(msg0,callers,nhist2) callers(nhist2)%call=c6 callers(nhist2)%grid=g4 callers(nhist2)%nsec=time() - rewind(24) + callers(nhist2)%nfreq=nfreq write(24) nhist2,callers(1:nhist2) - rewind(24) endif 900 return diff --git a/lib/types.f90 b/lib/types.f90 index fe11579a6..2b4be6272 100644 --- a/lib/types.f90 +++ b/lib/types.f90 @@ -11,6 +11,7 @@ module types character*6 call character*4 grid integer nsec + integer nfreq end type q3list end module types diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 04e79f477..62ba70c4a 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -60,14 +60,17 @@ void ActiveStations::write_settings () void ActiveStations::displayRecentStations(QString mode, QString const& t) { m_mode=mode; - bool b=(m_mode=="Q65"); - if(b) { + if(m_mode=="Q65") { ui->header_label2->setText(" N Frx Fsked S/N Call Grid Tx Age"); ui->label->setText("QSOs:"); + } else if(m_mode=="Q65-pileup") { + ui->header_label2->setText(" N Freq Call Grid El Age(h)"); + } else { ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); ui->label->setText("Rate:"); } + bool b=(m_mode.left(3)=="Q65"); ui->bandChanges->setVisible(!b); ui->cbReadyOnly->setVisible(!b); ui->label_2->setVisible(!b); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index cda4d4d39..3b7055c9a 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -185,6 +185,8 @@ extern "C" { void save_dxbase_(char* dxbase, FCL len); void indexx_(float arr[], int* n, int indx[]); + + void get_q3list_(char* fname, int* nlist, char* list, FCL len1, FCL len2); } int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols @@ -3556,6 +3558,28 @@ void MainWindow::decodeDone () ARRL_Digi_Display(); // Update the ARRL_DIGI display } if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0; + + if(m_mode=="Q65" and (m_specOp==SpecOp::NA_VHF or m_specOp==SpecOp::ARRL_DIGI + or m_specOp==SpecOp::WW_DIGI) and m_ActiveStationsWidget!=NULL) { + + int nlist=0; + char list[2000]; + char line[36]; + list[0]=0; +// QString t="1200 W9XYZ EN37"; + auto fname {QDir::toNativeSeparators(m_config.writeable_data_dir ().absoluteFilePath ("tsil.3q"))}; + +// morse_(const_cast (m_config.my_callsign ().toLatin1().constData()), +// const_cast (icw), &m_ncw, (FCL)m_config.my_callsign().length()); + get_q3list_(const_cast (fname.toLatin1().constData()), &nlist, + &list[0], (FCL)fname.length(), (FCL)2000); + QString t=""; + for(int i=0; idisplayRecentStations("Q65-pileup",t); + } } void MainWindow::read_log() From f968c740936ad3fc57427dbc9145fd6bb7831d32 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 16 Feb 2023 21:17:56 -0500 Subject: [PATCH 230/251] Working on getting moon elevation. Still need to insert common/jplcom/, etc. --- lib/get_q3list.f90 | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/get_q3list.f90 b/lib/get_q3list.f90 index f6c3d7176..91fa3251d 100644 --- a/lib/get_q3list.f90 +++ b/lib/get_q3list.f90 @@ -10,7 +10,9 @@ subroutine get_q3list(fname,nlist,list) parameter (MAX_CALLERS=40) character*(*) fname character*36 list(40) + character*8 grid6 integer time + integer nt(8) integer indx(MAX_CALLERS) type(q3list) callers(MAX_CALLERS) @@ -22,13 +24,22 @@ subroutine get_q3list(fname,nlist,list) moon_el=0 now=time() + call date_and_time(values=nt) + uth=nt(5) + (nt(6)-nt(4))/60.0 + nt(7)/3600.0 nlist=nhist2 call indexx(callers(1:nlist)%nfreq,nlist,indx) do i=1,nlist - hours=(now - callers(i)%nsec)/3600.0 + age=(now - callers(i)%nsec)/3600.0 j=indx(i) + grid6=callers(j)%grid//'mm' + call grid2deg(grid6,xlon,xlat) + call sun(nt(1),nt(2),nt(3),uth,-xlon,xlat,RASun,DecSun,xLST, & + AzSun,ElSun,mjd,day) +! call moondopjpl(nt(1),nt(2),nt(3),uth,-xlon,xlat,RAMoon,DecMoon, & +! xLST,HA,AzMoon,ElMoon,vr,techo) + print*,i,grid6,azmoon,elsun,elmoon write(list(i),1000) i,callers(j)%nfreq,callers(j)%call, & - callers(j)%grid,moon_el,hours,char(0) + callers(j)%grid,moon_el,age,char(0) 1000 format(i2,'.',i6,2x,a6,2x,a4,i5,f7.1,a1) enddo From b61e8aeb24419f22477cd22091c656eb7e309731 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 17 Feb 2023 10:25:07 -0500 Subject: [PATCH 231/251] Finish connecting moondopjpl() to the JPL ephemeris file. --- lib/get_q3list.f90 | 27 +++++++++++++++++++++------ widgets/mainwindow.cpp | 5 +++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/get_q3list.f90 b/lib/get_q3list.f90 index 91fa3251d..1e0e72ce3 100644 --- a/lib/get_q3list.f90 +++ b/lib/get_q3list.f90 @@ -15,14 +15,14 @@ subroutine get_q3list(fname,nlist,list) integer nt(8) integer indx(MAX_CALLERS) type(q3list) callers(MAX_CALLERS) - + character*256 jpleph_file_name + common/jplcom/jpleph_file_name nhist2=0 open(24,file=fname,status='unknown',form='unformatted') read(24,end=1) nhist2,callers(1:nhist2) -1 close(24) +1 close(24) - moon_el=0 now=time() call date_and_time(values=nt) uth=nt(5) + (nt(6)-nt(4))/60.0 + nt(7)/3600.0 @@ -35,13 +35,28 @@ subroutine get_q3list(fname,nlist,list) call grid2deg(grid6,xlon,xlat) call sun(nt(1),nt(2),nt(3),uth,-xlon,xlat,RASun,DecSun,xLST, & AzSun,ElSun,mjd,day) -! call moondopjpl(nt(1),nt(2),nt(3),uth,-xlon,xlat,RAMoon,DecMoon, & -! xLST,HA,AzMoon,ElMoon,vr,techo) - print*,i,grid6,azmoon,elsun,elmoon + call moondopjpl(nt(1),nt(2),nt(3),uth,-xlon,xlat,RAMoon,DecMoon, & + xLST,HA,AzMoon,ElMoon,vr,techo) + moon_el=nint(ElMoon) write(list(i),1000) i,callers(j)%nfreq,callers(j)%call, & callers(j)%grid,moon_el,age,char(0) 1000 format(i2,'.',i6,2x,a6,2x,a4,i5,f7.1,a1) + + h1=mod(now,86400)/3600.0 + h2=mod(callers(i)%nsec,86400)/3600.0 + hd=h1-h2 + if(hd.lt.0.0) hd=hd+24.0 +! write(*,3301) i,callers(i)%call,now,callers(i)%nsec,h1,h2,hd +!3301 format(i3,2x,a6,2i12,3f10.6) + enddo return end subroutine get_q3list + +subroutine jpl_setup(fname) + character*256 fname,jpleph_file_name + common/jplcom/jpleph_file_name + jpleph_file_name=fname + return +end subroutine jpl_setup diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 3f9cfff0e..76579a086 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -187,6 +187,8 @@ extern "C" { void indexx_(float arr[], int* n, int indx[]); void get_q3list_(char* fname, int* nlist, char* list, FCL len1, FCL len2); + + void jpl_setup_(char* fname, FCL len); } int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols @@ -1078,6 +1080,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->labDXped->setStyleSheet("QLabel {background-color: red; color: white;}"); ui->pbBestSP->setVisible(m_mode=="FT4"); + QString jpleph = m_config.data_dir().absoluteFilePath("JPLEPH"); + jpl_setup_(const_cast(jpleph.toLocal8Bit().constData()),256); + // this must be the last statement of constructor if (!m_valid) throw std::runtime_error {"Fatal initialization exception"}; } From 96c7d6bf36f790516a805872c3f503b20f1c1fc8 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 17 Feb 2023 10:43:37 -0500 Subject: [PATCH 232/251] Open/close LU 24 in q65_hist2. --- lib/qra/q65/q65.f90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index fb323092f..754e27349 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -869,6 +869,7 @@ end subroutine q65_hist subroutine q65_hist2(nfreq,msg0,callers,nhist2) use types + use prog_args parameter (MAX_CALLERS=40) !For multiple q3 decodes in NA VHf Contest mode character*37 msg0,msg type(q3list) callers(MAX_CALLERS) @@ -913,9 +914,13 @@ subroutine q65_hist2(nfreq,msg0,callers,nhist2) callers(nhist2)%grid=g4 callers(nhist2)%nsec=time() callers(nhist2)%nfreq=nfreq - write(24) nhist2,callers(1:nhist2) endif + open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & + form='unformatted') + write(24) nhist2,callers(1:nhist2) + close(24) + 900 return end subroutine q65_hist2 From f1dbb8d134fe278857bb37511489c3bf7cfdeb88 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 17 Feb 2023 16:17:38 -0500 Subject: [PATCH 233/251] Clean up a few things having to do with averaging and q3 decodes. --- lib/decoder.f90 | 1 + lib/q65_decode.f90 | 4 ---- lib/qra/q65/q65.f90 | 1 + 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 116a07fa8..33d6e5be6 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -214,6 +214,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) single_decode,logical(params%nagain),params%max_drift, & logical(params%newdat),params%emedelay,mycall,hiscall,hisgrid, & params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0,nqf) + params%nclearave=.false. !### do k=1,20 diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index fb452377c..fecad60b1 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -111,7 +111,6 @@ contains if(lagain) ndepth=ior(ndepth,3) !Use 'Deep' for manual Q65 decodes dxcall13=hiscall ! initialize for use in packjt77 mycall13=mycall - nhist2=0 if(ncontest.eq.1) then ! NA VHF, WW-Digi, or ARRL Digi Contest open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & @@ -244,7 +243,6 @@ contains call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, & xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec) call timer('q65loop1',1) -! write(*,3001) '=b',nfqso,ntol,ndepth,xdt,f0,idec if(idec.ge.0) then dtdec=xdt1 f0dec=f1 @@ -379,8 +377,6 @@ contains call q65_dec0(iavg,iwave,ntrperiod,nint(f0),ntol,lclearave, & emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno) call timer('q65_dec0',1) - write(*,3001) icand,nint(f0),xdt,idec -3001 format('a',i3,i5,f6.1,i3) if(idec.ge.0) then dtdec=xdt !We have a q3 or q0 decode at f0 f0dec=f0 diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 754e27349..fab3516c0 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -594,6 +594,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,iavg,ipk,jpk, & ! Resort the candidates back into frequency order tmp(1:ncand,1:3)=candidates(1:ncand,1:3) + candidates=0. call indexx(tmp(1:ncand,3),ncand,indx) do i=1,ncand candidates(i,1:3)=tmp(indx(i),1:3) From 56dfb99a5d2e0689a25c62ab47ac92bad4502af3 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 18 Feb 2023 08:46:13 -0500 Subject: [PATCH 234/251] Correct the logic that determines when the Q65 red sync curve is plotted. --- lib/qra/q65/q65.f90 | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index fab3516c0..12dc4f08e 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -125,10 +125,7 @@ subroutine q65_dec0(iavg,iwave,ntrperiod,nfqso,ntol,lclearave, & lclearave=.false. endif ccf1=0. - if(iavg.eq.0) then - ccf2=0. - ccf2_avg=0. - endif + if(iavg.eq.0) ccf2=0. dtstep=nsps/(NSTEP*12000.0) !Step size in seconds lag1=-1.0/dtstep lag2=1.0/dtstep + 0.9999 @@ -694,16 +691,15 @@ subroutine q65_write_red(iz,xdt,ccf2_avg,ccf2) call q65_sync_curve(ccf2_avg,1,iz,rms1) call q65_sync_curve(ccf2,1,iz,rms2) - rewind 17 - write(17,1000) xdt,minval(ccf2_avg),maxval(ccf2_avg) i1=max(1,nint(nfa/df)) i2=min(iz,int(nfb/df)) y0=minval(ccf2(i1:i2)) y0_avg=minval(ccf2_avg(i1:i2)) g=0.4 g_avg=0. - if(maxval(ccf2_avg(i1:i2)).ne.y0_avg) g_avg=g - + if(navg(iseq).ge.2) g_avg=g + rewind 17 + write(17,1000) xdt,g_avg*minval(ccf2_avg),g_avg*maxval(ccf2_avg) do i=i1,i2 freq=i*df y1=g_avg*(ccf2_avg(i)-y0_avg) From 39c935a882deb5a111715af768d8263c83eada90 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 18 Feb 2023 10:03:47 -0500 Subject: [PATCH 235/251] No need for a second call to q65_decode() when nagain is true. --- lib/decoder.f90 | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/lib/decoder.f90 b/lib/decoder.f90 index 33d6e5be6..d105093d5 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -216,20 +216,25 @@ subroutine multimode_decoder(ss,id2,params,nfsample) params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0,nqf) params%nclearave=.false. -!### - do k=1,20 - if(nqf(k).eq.0) exit - nqd=1 - navg0=0 - ntol=5 - call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & - params%nsubmode,nqf(k),ntol,params%ndepth, & - params%nfa,params%nfb,logical(params%nclearave), & - .true.,.true.,params%max_drift, & - .false.,params%emedelay,mycall,hiscall,hisgrid, & - params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0,nqf) - enddo -!### + if(.not.params%nagain) then +! Go through identified candidates again, treating each as if it had been +! double-clicked on the waterfall. + do k=1,20 + if(nqf(k).eq.0) exit + if(params%nagain .and. abs(nqf(k)-params%nfqso).gt.params%ntol) cycle + nqd=1 + navg0=0 + ntol=5 + call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & + params%nsubmode,nqf(k),ntol,params%ndepth, & + params%nfa,params%nfb,logical(params%nclearave), & + .true.,.true.,params%max_drift, & + .false.,params%emedelay,mycall,hiscall,hisgrid, & + params%nQSOProgress,ncontest,logical(params%lapcqonly), & + navg0,nqf) + enddo + endif + call timer('dec_q65 ',1) close(17) go to 800 From 3f5cbbb1476b543a656eb996a8c3a54d23e68ae9 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 19 Feb 2023 16:48:14 -0500 Subject: [PATCH 236/251] Implement Special Operating Activity "Q65 Pileup". Needs more checking for completeness. --- Configuration.cpp | 1 + Configuration.hpp | 4 ++-- Configuration.ui | 25 ++++++++++++++++--- widgets/mainwindow.cpp | 54 ++++++++++++++++++++++++++++++++---------- widgets/mainwindow.h | 1 + 5 files changed, 68 insertions(+), 17 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index ee67abc77..d128d0746 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -1227,6 +1227,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->special_op_activity_button_group->setId (ui_->rbARRL_Digi, static_cast (SpecialOperatingActivity::ARRL_DIGI)); ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast (SpecialOperatingActivity::FOX)); ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast (SpecialOperatingActivity::HOUND)); + ui_->special_op_activity_button_group->setId (ui_->rbQ65pileup, static_cast (SpecialOperatingActivity::Q65_PILEUP)); // // setup PTT port combo box drop down content diff --git a/Configuration.hpp b/Configuration.hpp index dbf6b9124..8344af8f7 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -190,8 +190,8 @@ public: bool highlight_DXgrid () const; bool Individual_Contest_Name() const; -// 0 1 2 3 4 5 6 7 8 - enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND, ARRL_DIGI}; +// 0 1 2 3 4 5 6 7 8 9 + enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND, ARRL_DIGI, Q65_PILEUP}; SpecialOperatingActivity special_op_id () const; struct CalibrationParams diff --git a/Configuration.ui b/Configuration.ui index acf225f5d..836b1b635 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2923,6 +2923,25 @@ Right click for insert and delete options. + + + + + 0 + 18 + + + + <html><head/><body><p>Exchange 4-character locator instead of signal report. Provides q3-level sensitivities for the DX operator. Especially useful for 6m EME DXpeditions.</p></body></html> + + + Q65 Pileup + + + special_op_activity_button_group + + + @@ -3337,12 +3356,12 @@ Right click for insert and delete options. + + + - - - diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 76579a086..faec9dc92 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3380,8 +3380,9 @@ void MainWindow::decode() //decode() if(m_config.decode_at_52s()) dec_data.params.emedelay=2.5; dec_data.params.minSync=ui->syncSpinBox->isVisible () ? m_minSync : 0; dec_data.params.nexp_decode=int(m_specOp); - if(dec_data.params.nexp_decode==5) dec_data.params.nexp_decode=1; //NA VHF, WW Digi, and ARRL Digi - if(dec_data.params.nexp_decode==8) dec_data.params.nexp_decode=1; //contests all use grid exchange + if(dec_data.params.nexp_decode==5) dec_data.params.nexp_decode=1; //NA VHF, WW Digi, ARRL Digi contests + if(dec_data.params.nexp_decode==8) dec_data.params.nexp_decode=1; //and Q65 Pileup all use 4-character + if(dec_data.params.nexp_decode==9) dec_data.params.nexp_decode=1; //grid exchange if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); @@ -3565,7 +3566,8 @@ void MainWindow::decodeDone () if(m_mode!="FT8" or dec_data.params.nzhsym==50) m_nDecodes=0; if(m_mode=="Q65" and (m_specOp==SpecOp::NA_VHF or m_specOp==SpecOp::ARRL_DIGI - or m_specOp==SpecOp::WW_DIGI) and m_ActiveStationsWidget!=NULL) { + or m_specOp==SpecOp::WW_DIGI or m_specOp==SpecOp::Q65_PILEUP) + and m_ActiveStationsWidget!=NULL) { int nlist=0; char list[2000]; @@ -3579,11 +3581,16 @@ void MainWindow::decodeDone () get_q3list_(const_cast (fname.toLatin1().constData()), &nlist, &list[0], (FCL)fname.length(), (FCL)2000); QString t=""; + QString t0=""; for(int i=0; isetClickOK(false); m_ActiveStationsWidget->displayRecentStations("Q65-pileup",t); + m_ActiveStationsWidget->setClickOK(true); } } @@ -3750,6 +3757,24 @@ void MainWindow::callSandP2(int n) { if(m_mode!="Q65" and m_ready2call[n]=="") return; QStringList w=m_ready2call[n].split(' ', SkipEmptyParts); + if(m_mode=="Q65" and m_specOp==SpecOp::Q65_PILEUP) { + // This is the mode for 6m EME DXpeditions + w=m_callers[n].split(' ', SkipEmptyParts); + m_deCall=w[2]; + m_deGrid=w[3]; + m_bDoubleClicked=true; //### needed? + m_txFirst=true; + ui->dxCallEntry->setText(m_deCall); + ui->dxGridEntry->setText(m_deGrid); + ui->txFirstCheckBox->setChecked(m_txFirst); + genStdMsgs("-22"); + setTxMsg(3); + if (!ui->autoButton->isChecked()) ui->autoButton->click(); // Enable Tx + if(m_transmitting) m_restart=true; +// qDebug() << "aa" << int(m_specOp) << n << m_callers[n]; + return; + } + if(m_mode=="Q65") { double kHz=w[1].toDouble(); int nMHz=m_freqNominal/1000000; @@ -4877,7 +4902,8 @@ void MainWindow::guiUpdate() SpecOp::FIELD_DAY==m_specOp or SpecOp::RTTY==m_specOp or SpecOp::WW_DIGI==m_specOp or - SpecOp::ARRL_DIGI==m_specOp) ) { + SpecOp::ARRL_DIGI==m_specOp or + SpecOp::Q65_PILEUP==m_specOp) ) { //We're in a contest-like mode other than EU_VHF: start QSO with Tx2. ui->tx1->setEnabled(false); ui->txb1->setEnabled(false); @@ -5521,7 +5547,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie or bEU_VHF_w2 or (m_QSOProgress==CALLING))) { if(message_words.at(4).contains(grid_regexp) and SpecOp::EU_VHF!=m_specOp) { if((SpecOp::NA_VHF==m_specOp or SpecOp::WW_DIGI==m_specOp or - SpecOp::ARRL_DIGI==m_specOp ) + SpecOp::ARRL_DIGI==m_specOp or SpecOp::Q65_PILEUP==m_specOp) and bContestOK) { setTxMsg(3); m_QSOProgress=ROGER_REPORT; @@ -6009,6 +6035,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional) if(SpecOp::NA_VHF==m_specOp) sent=my_grid; if(SpecOp::WW_DIGI==m_specOp) sent=my_grid; if(SpecOp::ARRL_DIGI==m_specOp) sent=my_grid; + if(SpecOp::Q65_PILEUP==m_specOp) sent=my_grid; if(SpecOp::FIELD_DAY==m_specOp) sent=m_config.Field_Day_Exchange(); if(SpecOp::RTTY==m_specOp) { sent=rst + m_config.RTTY_Exchange(); @@ -6949,8 +6976,9 @@ void MainWindow::on_actionFT8_triggered() if(SpecOp::EU_VHF==m_specOp) t0="EU VHF"; if(SpecOp::FIELD_DAY==m_specOp) t0="Field Day"; if(SpecOp::RTTY==m_specOp) t0="FT RU"; - if(SpecOp::WW_DIGI==m_specOp) t0="WW_DIGI"; - if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL_DIGI"; + if(SpecOp::WW_DIGI==m_specOp) t0="WW Digi"; + if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL Digi"; + if(SpecOp::Q65_PILEUP==m_specOp) t0="Q65 Pileup"; if(t0=="") { ui->labDXped->setVisible(false); } else { @@ -7185,8 +7213,9 @@ void MainWindow::on_actionQ65_triggered() if(SpecOp::EU_VHF==m_specOp) t0="EU VHF"; if(SpecOp::FIELD_DAY==m_specOp) t0="Field Day"; if(SpecOp::RTTY==m_specOp) t0="FT RU"; - if(SpecOp::WW_DIGI==m_specOp) t0="WW_DIGI"; - if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL_DIGI"; + if(SpecOp::WW_DIGI==m_specOp) t0="WW Digi"; + if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL Digi"; + if(SpecOp::Q65_PILEUP==m_specOp) t0="Q65 Pileup"; if(t0=="") { ui->labDXped->setVisible(false); } else { @@ -10254,8 +10283,9 @@ void MainWindow::chkFT4() if(SpecOp::EU_VHF==m_specOp) t0="EU VHF"; if(SpecOp::FIELD_DAY==m_specOp) t0="Field Day"; if(SpecOp::RTTY==m_specOp) t0="FT RU"; - if(SpecOp::WW_DIGI==m_specOp) t0="WW_DIGI"; - if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL_DIGI"; + if(SpecOp::WW_DIGI==m_specOp) t0="WW Digi"; + if(SpecOp::ARRL_DIGI==m_specOp) t0="ARRL Digi"; + if(SpecOp::Q65_PILEUP==m_specOp) t0="Q65 Pileup"; if(t0=="") { ui->labDXped->setVisible(false); } else { diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index e8096cf08..3f2384c83 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -667,6 +667,7 @@ private: QString m_deCall; QString m_deGrid; QString m_ready2call[50]; + QString m_callers[40]; QSet m_pfx; QSet m_sfx; From 68e4671e000a1b40bfb8c7175fe9e49e7ab13877 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 20 Feb 2023 08:19:53 -0500 Subject: [PATCH 237/251] Don't force display of contest log when Q65 Pileup is active. --- widgets/mainwindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index faec9dc92..ae09df60c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6985,7 +6985,8 @@ void MainWindow::on_actionFT8_triggered() ui->labDXped->setVisible(true); ui->labDXped->setText(t0); } - on_contest_log_action_triggered(); + qDebug() << "aa" << int(m_specOp); + if(m_specOp!=SpecOp::Q65_PILEUP) on_contest_log_action_triggered(); } if((SpecOp::FOX==m_specOp or SpecOp::HOUND==m_specOp) and !m_config.split_mode() and !m_bWarnedSplit) { @@ -7222,9 +7223,8 @@ void MainWindow::on_actionQ65_triggered() ui->labDXped->setVisible(true); ui->labDXped->setText(t0); } - on_contest_log_action_triggered(); + if(m_specOp!=SpecOp::Q65_PILEUP) on_contest_log_action_triggered(); } - } void MainWindow::on_actionMSK144_triggered() From 1e96c8ae85ddbca6a5d8912ff3b02242854b6d4f Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 20 Feb 2023 11:56:48 -0500 Subject: [PATCH 238/251] Make several Active Stations widgets invisible in Q65 Pileup mode. --- widgets/activeStations.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 62ba70c4a..a998a51e3 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -65,7 +65,6 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->label->setText("QSOs:"); } else if(m_mode=="Q65-pileup") { ui->header_label2->setText(" N Freq Call Grid El Age(h)"); - } else { ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); ui->label->setText("Rate:"); @@ -78,6 +77,11 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) ui->score->setVisible(!b); ui->sbMaxRecent->setVisible(!b); ui->RecentStationsPlainTextEdit->insertPlainText(t); + + b=(m_mode!="Q65-pileup"); + ui->sbMaxAge->setVisible(b); + ui->label->setVisible(b); + ui->rate->setVisible(b); } int ActiveStations::maxRecent() From 910b58ace8dc9a4f6a6d91c8c162df5f0601b50c Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 20 Feb 2023 18:10:07 +0100 Subject: [PATCH 239/251] Don't allow any CQ extension when Q65 Pileup is active. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index ae09df60c..18605a09d 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5911,7 +5911,7 @@ void MainWindow::genCQMsg () QString t=ui->tx6->text(); QStringList tlist=t.split(" "); if((m_mode=="FT4" or m_mode=="FT8" or m_mode=="MSK144" || "Q65" == m_mode) and - SpecOp::NONE != m_specOp and SpecOp::HOUND != m_specOp and + SpecOp::NONE != m_specOp and SpecOp::HOUND != m_specOp and SpecOp::Q65_PILEUP != m_specOp and ( tlist.at(1)==my_callsign or tlist.at(2)==my_callsign ) and stdCall(my_callsign)) { From d870c06b8e819d331c312aab320e55fd27f3aace Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 20 Feb 2023 19:03:41 +0100 Subject: [PATCH 240/251] Always switch to Q65 mode when in Q65 Pileup mode. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 18605a09d..064ead9e4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -2458,6 +2458,7 @@ void MainWindow::displayDialFrequency () void MainWindow::statusChanged() { + if (m_specOp==SpecOp::Q65_PILEUP && m_mode != "Q65") on_actionQ65_triggered(); statusUpdate (); QFile f {m_config.temp_dir ().absoluteFilePath ("wsjtx_status.txt")}; if(f.open(QFile::WriteOnly | QIODevice::Text)) { From 92c9dd7fd67299e48d16beafdff3f9df9dc530bb Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 20 Feb 2023 19:46:12 +0100 Subject: [PATCH 241/251] Leave Q65 Pileup special operating activity when switching to any other mode. --- widgets/mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 064ead9e4..995329b69 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7401,6 +7401,10 @@ void MainWindow::on_actionFreqCal_triggered() void MainWindow::switch_mode (Mode mode) { + if (m_mode != "Q65" && m_specOp==SpecOp::Q65_PILEUP) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } m_fastGraph->setMode(m_mode); m_config.frequencies ()->filter (m_config.region (), mode, true); // filter on current time auto const& row = m_config.frequencies ()->best_working_frequency (m_freqNominal); From 16f9f50263d9356a1be79bad5d1c1554a310f3ee Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 20 Feb 2023 14:19:38 -0500 Subject: [PATCH 242/251] Protect against faulty or missing tsil.3q file. --- lib/get_q3list.f90 | 7 +++++- lib/q65_decode.f90 | 23 +++++++++++-------- lib/qra/q65/q65.f90 | 11 +++++---- widgets/activeStations.cpp | 46 ++++++++++++++++++++------------------ 4 files changed, 51 insertions(+), 36 deletions(-) diff --git a/lib/get_q3list.f90 b/lib/get_q3list.f90 index 1e0e72ce3..6109cf66c 100644 --- a/lib/get_q3list.f90 +++ b/lib/get_q3list.f90 @@ -20,7 +20,12 @@ subroutine get_q3list(fname,nlist,list) nhist2=0 open(24,file=fname,status='unknown',form='unformatted') - read(24,end=1) nhist2,callers(1:nhist2) + read(24,end=1) nhist2 + if(nhist2.ge.1 .and. nhist2.le.40) then + read(24,end=1) callers(1:nhist2) + else + nhist2=0 + endif 1 close(24) now=time() diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index fecad60b1..d6cad6999 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -115,15 +115,20 @@ contains ! NA VHF, WW-Digi, or ARRL Digi Contest open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & form='unformatted') - read(24,end=2) nhist2,callers(1:nhist2) - now=time() - do i=1,nhist2 - hours=(now - callers(i)%nsec)/3600.0 - if(hours.gt.24.0) then - callers(i:nhist2-1)=callers(i+1:nhist2) - nhist2=nhist2-1 - endif - enddo + read(24,end=2) nhist2 + if(nhist2.ge.1 .and. nhist2.le.40) then + read(24,end=2) callers(1:nhist2) + now=time() + do i=1,nhist2 + hours=(now - callers(i)%nsec)/3600.0 + if(hours.gt.24.0) then + callers(i:nhist2-1)=callers(i+1:nhist2) + nhist2=nhist2-1 + endif + enddo + else + nhist2=0 + endif 2 close(24) endif diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 12dc4f08e..a93b12719 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -913,10 +913,13 @@ subroutine q65_hist2(nfreq,msg0,callers,nhist2) callers(nhist2)%nfreq=nfreq endif - open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & - form='unformatted') - write(24) nhist2,callers(1:nhist2) - close(24) + if(nhist2.ge.1 .and. nhist2.le.40) then + open(24,file=trim(data_dir)//'/tsil.3q',status='unknown', & + form='unformatted') + write(24) nhist2 + write(24) callers(1:nhist2) + close(24) + endif 900 return end subroutine q65_hist2 diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index a998a51e3..619a710dd 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -59,29 +59,31 @@ void ActiveStations::write_settings () void ActiveStations::displayRecentStations(QString mode, QString const& t) { - m_mode=mode; - if(m_mode=="Q65") { - ui->header_label2->setText(" N Frx Fsked S/N Call Grid Tx Age"); - ui->label->setText("QSOs:"); - } else if(m_mode=="Q65-pileup") { - ui->header_label2->setText(" N Freq Call Grid El Age(h)"); - } else { - ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); - ui->label->setText("Rate:"); - } - bool b=(m_mode.left(3)=="Q65"); - ui->bandChanges->setVisible(!b); - ui->cbReadyOnly->setVisible(!b); - ui->label_2->setVisible(!b); - ui->label_3->setVisible(!b); - ui->score->setVisible(!b); - ui->sbMaxRecent->setVisible(!b); - ui->RecentStationsPlainTextEdit->insertPlainText(t); + if(mode!=m_mode) { + m_mode=mode; + if(m_mode=="Q65") { + ui->header_label2->setText(" N Frx Fsked S/N Call Grid Tx Age"); + ui->label->setText("QSOs:"); + } else if(m_mode=="Q65-pileup") { + ui->header_label2->setText(" N Freq Call Grid El Age(h)"); + } else { + ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts"); + ui->label->setText("Rate:"); + } + bool b=(m_mode.left(3)=="Q65"); + ui->bandChanges->setVisible(!b); + ui->cbReadyOnly->setVisible(!b); + ui->label_2->setVisible(!b); + ui->label_3->setVisible(!b); + ui->score->setVisible(!b); + ui->sbMaxRecent->setVisible(!b); - b=(m_mode!="Q65-pileup"); - ui->sbMaxAge->setVisible(b); - ui->label->setVisible(b); - ui->rate->setVisible(b); + b=(m_mode!="Q65-pileup"); + ui->sbMaxAge->setVisible(b); + ui->label->setVisible(b); + ui->rate->setVisible(b); + } + ui->RecentStationsPlainTextEdit->insertPlainText(t); } int ActiveStations::maxRecent() From 6be56a775efc3d053f6801e626eb89ae5a9a459b Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Mon, 20 Feb 2023 17:15:29 -0500 Subject: [PATCH 243/251] Use Q_SIGNAL and Q_SLOT macros in activeStations.h. --- widgets/activeStations.h | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/widgets/activeStations.h b/widgets/activeStations.h index 207668ddd..69c065537 100644 --- a/widgets/activeStations.h +++ b/widgets/activeStations.h @@ -33,17 +33,15 @@ public: bool m_clickOK=false; bool m_bReadyOnly; -signals: - void callSandP(int nline); - void activeStationsDisplay(); - -private slots: - void on_textEdit_clicked(); - private: void read_settings (); void write_settings (); + Q_SIGNAL void callSandP(int nline); + Q_SIGNAL void activeStationsDisplay(); + Q_SIGNAL void cursorPositionChanged(); + Q_SLOT void on_cbReadyOnly_toggled(bool b); + Q_SLOT void on_textEdit_clicked(); qint64 m_msec0=0; QString m_mode=""; From 5ccf66e6b4984bec28a37697ea1163e811b1673d Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Mon, 20 Feb 2023 23:23:45 +0100 Subject: [PATCH 244/251] Right-click on the Q65 mode button to toggle Q65 Pileup mode On/Off. --- Configuration.cpp | 9 +++++++++ Configuration.hpp | 1 + widgets/mainwindow.cpp | 13 +++++++++++++ widgets/mainwindow.h | 1 + widgets/mainwindow.ui | 2 +- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Configuration.cpp b/Configuration.cpp index d128d0746..632537b8e 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -997,6 +997,15 @@ void Configuration::set_location (QString const& grid_descriptor) m_->dynamic_grid_ = grid_descriptor.trimmed (); } +void Configuration::setSpecial_Q65_Pileup() +{ + m_->bSpecialOp_=true; + m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_); + m_->ui_->rbQ65pileup->setChecked(true); + m_->SelectedActivity_ = static_cast (SpecialOperatingActivity::Q65_PILEUP); + m_->write_settings(); +} + void Configuration::setSpecial_Hound() { m_->bSpecialOp_=true; diff --git a/Configuration.hpp b/Configuration.hpp index 8344af8f7..13c54372b 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -183,6 +183,7 @@ public: bool highlight_only_fields () const; bool include_WAE_entities () const; bool highlight_73 () const; + void setSpecial_Q65_Pileup(); void setSpecial_Hound(); void setSpecial_Fox(); void setSpecial_None(); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 995329b69..114836a3c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6461,6 +6461,19 @@ void MainWindow::on_RoundRobin_currentTextChanged(QString text) ui->sbTxPercent->setEnabled (text == tr ("Random")); } +void MainWindow::mousePressEvent(QMouseEvent *event) +{ + if(ui->q65Button->hasFocus() && (event->button() & Qt::RightButton)) { + m_specOp=m_config.special_op_id(); + if (m_specOp==SpecOp::Q65_PILEUP) { + m_config.setSpecial_None(); + } else { + m_config.setSpecial_Q65_Pileup(); + } + m_specOp=m_config.special_op_id(); + on_actionQ65_triggered(); + } +} void MainWindow::on_dxCallEntry_textChanged (QString const& call) { diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 3f2384c83..21ec187a1 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -211,6 +211,7 @@ private slots: void on_txb6_clicked(); void on_lookupButton_clicked(); void on_addButton_clicked(); + void mousePressEvent(QMouseEvent *event) override; void on_dxCallEntry_textChanged (QString const&); void on_dxGridEntry_textChanged (QString const&); void on_dxCallEntry_editingFinished(); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index e5ed6cefe..2b6ff1f21 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2982,7 +2982,7 @@ QLabel[oob="true"] { - Switch to Q65 mode + <html><head/><body><p>Switch to Q65 mode. Right-click to toggle Q65 Pileup mode On/Off.</p></body></html> Q65 From dddb542a6633e376d6ae119accbfef8b3c95cecf Mon Sep 17 00:00:00 2001 From: Uwe Risse Date: Tue, 21 Feb 2023 10:14:21 +0100 Subject: [PATCH 245/251] Initialize some more parameters when switching to Q65 Pilup mode and back. --- widgets/mainwindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 114836a3c..90301bffc 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6469,6 +6469,8 @@ void MainWindow::mousePressEvent(QMouseEvent *event) m_config.setSpecial_None(); } else { m_config.setSpecial_Q65_Pileup(); + ui->houndButton->setChecked(false); + ui->houndButton->setStyleSheet(""); } m_specOp=m_config.special_op_id(); on_actionQ65_triggered(); @@ -10310,7 +10312,7 @@ void MainWindow::chkFT4() ui->labDXped->setVisible(true); ui->labDXped->setText(t0); } - on_contest_log_action_triggered(); + if(m_specOp!=SpecOp::Q65_PILEUP) on_contest_log_action_triggered(); } if (SpecOp::HOUND == m_specOp or SpecOp::FOX == m_specOp) { ui->labDXped->setVisible(false); From 06f3b36939d7264181257761a6523024171da033 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 21 Feb 2023 09:44:56 -0500 Subject: [PATCH 246/251] Initialize nhist2 to zero. --- lib/q65_decode.f90 | 1 + lib/qra/q65/q65_set_list2.f90 | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index d6cad6999..95c7d91f7 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -108,6 +108,7 @@ contains nfft1=ntrperiod*12000 nfft2=ntrperiod*6000 npasses=1 + nhist2=0 if(lagain) ndepth=ior(ndepth,3) !Use 'Deep' for manual Q65 decodes dxcall13=hiscall ! initialize for use in packjt77 mycall13=mycall diff --git a/lib/qra/q65/q65_set_list2.f90 b/lib/qra/q65/q65_set_list2.f90 index 6cce406c6..a01681e6d 100644 --- a/lib/qra/q65/q65_set_list2.f90 +++ b/lib/qra/q65/q65_set_list2.f90 @@ -11,7 +11,6 @@ subroutine q65_set_list2(mycall,hiscall,hisgrid,callers,nhist2,codewords,ncw) integer codewords(63,MAX_NCW) integer itone(85) integer isync(22) - integer time type(q3list) callers(MAX_CALLERS) data isync/1,9,12,13,15,22,23,26,27,33,35,38,46,50,55,60,62,66,69,74,76,85/ From 3f7888a5c7d95c9a3c383d7e64f02fa73b2b1f99 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 22 Feb 2023 12:35:00 -0500 Subject: [PATCH 247/251] Fix a link in the User Guide. --- doc/common/links.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/common/links.adoc b/doc/common/links.adoc index 605849a0e..095fc6afd 100644 --- a/doc/common/links.adoc +++ b/doc/common/links.adoc @@ -80,7 +80,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes. :jtalert: https://hamapps.com/[JTAlert] :launchpadki7mt: https://launchpad.net/~ki7mt[KI7MT PPA's] :log4om: https://www.log4om.com[Log4OM] -:lunarEchoes: https://sourceforge.net/projects/wsjt/files/wsjtx-{VERSION}/LunarEchoes_QEX.pdf[QEX] +:lunarEchoes: https://wsjt.sourceforge.io/LunarEchoes_QEX.pdf[QEX] :msk144: https://wsjt.sourceforge.io/MSK144_Protocol_QEX.pdf[QEX] :msvcpp_redist: https://www.microsoft.com/en-ph/download/details.aspx?id=40784[Microsoft VC++ 2013 Redistributable] :msys_url: https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/[MSYS Download] From 631e3ed1cb7373c43f31ac2a7904cb0c7a7b22ad Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 Feb 2023 11:28:41 -0500 Subject: [PATCH 248/251] Minor tweaks to the QMAP user interface. --- qmap/devsetup.ui | 24 +++++++----------------- qmap/mainwindow.cpp | 2 +- qmap/mainwindow.ui | 2 +- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/qmap/devsetup.ui b/qmap/devsetup.ui index e3be1344e..5bccece7d 100644 --- a/qmap/devsetup.ui +++ b/qmap/devsetup.ui @@ -11,7 +11,7 @@ - Setup / Options + Settings @@ -268,6 +268,9 @@ + + true + I/O Devices @@ -298,24 +301,11 @@ - - - - false - - - - 0 - 20 - - - - Swap I/Q - - - + + true + <html><head/><body><p>Adjust to scale digital I/Q data.</p></body></html> diff --git a/qmap/mainwindow.cpp b/qmap/mainwindow.cpp index 04e9351d5..8e4377ba0 100644 --- a/qmap/mainwindow.cpp +++ b/qmap/mainwindow.cpp @@ -478,7 +478,7 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_monitorButton_clicked() //Monitor { - if(m_monitoring) { + if(m_monitoring or m_loopall) { m_monitoring=false; soundInThread.setMonitoring(false); m_loopall=false; diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index 877ce4850..be100c692 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -327,7 +327,7 @@ - UTC Freq Fsked DT dB Message + UTC Frx Fsked DT dB Message From 73e1198f085555d3f7dc33e7171e69a1f4fbb1ee Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 Feb 2023 12:03:38 -0500 Subject: [PATCH 249/251] More tweaks to the QMAP user interface. --- qmap/about.cpp | 5 +++-- qmap/mainwindow.cpp | 11 +++++++++++ qmap/mainwindow.h | 2 ++ qmap/mainwindow.ui | 12 ++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/qmap/about.cpp b/qmap/about.cpp index 6c20e36b9..508e9692a 100644 --- a/qmap/about.cpp +++ b/qmap/about.cpp @@ -10,8 +10,9 @@ CAboutDlg::CAboutDlg(QWidget *parent) : ui->labelTxt->setText("

" + QString {"QMAP v" + QCoreApplication::applicationVersion () + " " + revision ()}.simplified () + "


" - "QMAP is a wideband receiver for the Q65 protocol,
" - "intended primarily for amateur radio EME communication.

" + "QMAP is a wideband receiver for the Q65 protocol, intnded
" + "primarily for amateur radio EME communication. It works
" + "in close cooperation with WSJT-X, versions 2.7 and later.

" "Copyright 2001-2023 by Joe Taylor, K1JT. Additional
" "acknowledgments are contained in the source code."); } diff --git a/qmap/mainwindow.cpp b/qmap/mainwindow.cpp index 8e4377ba0..7d59a8e20 100644 --- a/qmap/mainwindow.cpp +++ b/qmap/mainwindow.cpp @@ -1057,3 +1057,14 @@ bool MainWindow::isGrid4(QString g) if(g.mid(3,1)<'0' or g.mid(3,1)>'9') return false; return true; } + +void MainWindow::on_actionQuick_Start_Guide_to_Q65_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://wsjt.sourceforge.io/Q65_Quick_Start.pdf"}); +} + +void MainWindow::on_actionQuick_Start_Guide_to_WSJT_X_2_7_and_QMAP_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://wsjt.sourceforge.io/Quick_Start_WSJT-X_2.7_QMAP.pdf"}); +} + diff --git a/qmap/mainwindow.h b/qmap/mainwindow.h index 03dd7f1fc..e5551c8ec 100644 --- a/qmap/mainwindow.h +++ b/qmap/mainwindow.h @@ -80,6 +80,8 @@ private slots: void on_actionQ65C_triggered(); void on_actionQ65D_triggered(); void on_actionQ65E_triggered(); + void on_actionQuick_Start_Guide_to_Q65_triggered(); + void on_actionQuick_Start_Guide_to_WSJT_X_2_7_and_QMAP_triggered(); private: Ui::MainWindow *ui; diff --git a/qmap/mainwindow.ui b/qmap/mainwindow.ui index be100c692..2fa897775 100644 --- a/qmap/mainwindow.ui +++ b/qmap/mainwindow.ui @@ -431,6 +431,8 @@ p, li { white-space: pre-wrap; } Help + +
@@ -787,6 +789,16 @@ p, li { white-space: pre-wrap; } F2
+ + + Quick-Start Guide to WSJT-X 2.7 and QMAP + + + + + Quick-Start Guide to Q65 + + From 5d0b58009316d79cc7a63d7048296129902b8ac0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 Feb 2023 12:44:09 -0500 Subject: [PATCH 250/251] Bump version number to 2.7.0 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f646a8877..503db9c71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if (POLICY CMP0075) endif () project (wsjtx - VERSION 2.6.2.0 + VERSION 2.7.0.0 LANGUAGES C CXX Fortran ) set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") From 6a6647c5f82c5b7b0ec8021ad800ea567ed72278 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Thu, 23 Feb 2023 13:00:59 -0500 Subject: [PATCH 251/251] Add the QSG for 2.7.0 to the WSJT-X Help menu. --- widgets/mainwindow.cpp | 5 +++++ widgets/mainwindow.h | 1 + widgets/mainwindow.ui | 10 +++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 90301bffc..880c19ff3 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -2698,6 +2698,11 @@ void MainWindow::on_actionQSG_X250_M3_triggered() QDesktopServices::openUrl (QUrl {"https://wsjt.sourceforge.io/WSJTX_2.5.0_MAP65_3.0_Quick_Start.pdf"}); } +void MainWindow::on_actionQuick_Start_Guide_to_WSJT_X_2_7_0_and_QMAP_triggered() +{ + QDesktopServices::openUrl (QUrl {"https://wsjt.sourceforge.io/Quick_Start_WSJT-X_2.7_QMAP.pdf"}); +} + void MainWindow::on_actionOnline_User_Guide_triggered() //Display manual { #if defined (CMAKE_BUILD) diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 21ec187a1..a0cf8328b 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -167,6 +167,7 @@ private slots: void on_actionQSG_FST4_triggered(); void on_actionQSG_Q65_triggered(); void on_actionQSG_X250_M3_triggered(); + void on_actionQuick_Start_Guide_to_WSJT_X_2_7_0_and_QMAP_triggered(); void on_actionOnline_User_Guide_triggered(); void on_actionLocal_User_Guide_triggered(); void on_actionWide_Waterfall_triggered(); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 2b6ff1f21..21ce1fb1b 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -42,6 +42,7 @@ 10 + 50 false @@ -185,6 +186,7 @@ 10 + 50 false @@ -3151,7 +3153,7 @@ QPushButton[state="ok"] { 0 0 880 - 22 + 21 @@ -3229,6 +3231,7 @@ QPushButton[state="ok"] { + @@ -3805,6 +3808,11 @@ QPushButton[state="ok"] { Active Stations + + + Quick-Start Guide to WSJT-X 2.7.0 and QMAP + +