From a6722648c7da82fafec1afff5b46d1f98c3ac37b Mon Sep 17 00:00:00 2001 From: Joe Taylor <k1jt@arrl.org> Date: Wed, 28 Nov 2012 01:57:45 +0000 Subject: [PATCH] Permit signal reports in the range -50 to +49 dB git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2779 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- lib/packgrid.f90 | 38 +++++++--------- lib/packmsg.f | 111 --------------------------------------------- lib/packmsg.f90 | 111 +++++++++++++++++++++++++++++++++++++++++++++ lib/unpackgrid.f90 | 75 ++++++++++++++++-------------- lib/unpackmsg.f | 100 ---------------------------------------- lib/unpackmsg.f90 | 100 ++++++++++++++++++++++++++++++++++++++++ mainwindow.cpp | 2 +- 7 files changed, 268 insertions(+), 269 deletions(-) delete mode 100644 lib/packmsg.f create mode 100644 lib/packmsg.f90 delete mode 100644 lib/unpackmsg.f create mode 100644 lib/unpackmsg.f90 diff --git a/lib/packgrid.f90 b/lib/packgrid.f90 index ab4d43aa3..bfb0f5f40 100644 --- a/lib/packgrid.f90 +++ b/lib/packgrid.f90 @@ -2,33 +2,26 @@ 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 - if(grid(1:1).eq.'-') then !Test for numerical signal report - read(grid(2:3),*,err=1,end=1) n !NB: n is positive - if(n.lt.1) n=1 - if(n.gt.50) n=50 - if(n.gt.30) then - call n2grid(-n,grid) !Very low S/N use locators near -90 - go to 10 + n=99 + c1=grid(1:1) + read(grid,*,err=1) n + go to 2 +1 read(grid(2:4),*,err=2) n +2 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 -1 ng=NGBASE+1+n - go to 100 - else if(grid(1:2).eq.'R-') then - read(grid(3:4),*,err=2,end=2) n - if(n.lt.1) n=1 - if(n.gt.50) n=50 - if(n.gt.30) then - call n2grid(-n-20,grid) !Very low S/N use locators near -90 - go to 10 - endif - -2 if(n.eq.0) go to 90 - ng=NGBASE+31+n - go to 100 + go to 10 else if(grid(1:2).eq.'RO') then ng=NGBASE+62 go to 100 @@ -54,6 +47,7 @@ subroutine packgrid(grid,ng,text) 90 ng=NGBASE + 1 -100 return +100 continue + return end subroutine packgrid diff --git a/lib/packmsg.f b/lib/packmsg.f deleted file mode 100644 index 4d131400b..000000000 --- a/lib/packmsg.f +++ /dev/null @@ -1,111 +0,0 @@ - subroutine packmsg(msg,dat,text) - - parameter (NBASE=37*36*10*27*27*27) - parameter (NBASE2=262178562) - character*22 msg - integer dat(12) - character*12 c1,c2 - character*4 c3 - character*6 grid6 - logical text1,text2,text3,text - - text=.false. -C 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 5 - msg=msg(1:ib2)//msg(ib2+2:) - iz=iz-1 - enddo - -C See if it's a CQ message - 5 if(msg(1:3).eq.'CQ ') then - i=3 -C ... 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,junk) - call packcall(c1,nc1,text1) - call getpfx1(c2,k2,nv2) - call packcall(c2,nc2,text2) - if(nv2.eq.0) 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(nv2.eq.0 .and. (.not.text1) .and. (.not.text2) .and. - + (.not.text3)) go to 20 - if(nv2.gt.0) then - if(nv2.eq.1) 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 - endif - if(nv2.eq.2) 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 - go to 20 - endif - -C The message will be treated as plain text. - 10 text=.true. - call packtext(msg,nc1,nc2,ng) - ng=ng+32768 - -C Encode data into 6-bit words - 20 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 diff --git a/lib/packmsg.f90 b/lib/packmsg.f90 new file mode 100644 index 000000000..509e4679c --- /dev/null +++ b/lib/packmsg.f90 @@ -0,0 +1,111 @@ +subroutine packmsg(msg,dat,text) + + parameter (NBASE=37*36*10*27*27*27) + parameter (NBASE2=262178562) + character*22 msg + integer dat(12) + character*12 c1,c2 + character*4 c3 + character*6 grid6 + logical text1,text2,text3,text + + text=.false. +! 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 5 + msg=msg(1:ib2)//msg(ib2+2:) + iz=iz-1 + enddo + +! See if it's a CQ message +5 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,junk) + call packcall(c1,nc1,text1) + call getpfx1(c2,k2,nv2) + call packcall(c2,nc2,text2) + if(nv2.eq.0) 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(nv2.eq.0 .and. (.not.text1) .and. (.not.text2) .and. & + (.not.text3)) go to 20 + if(nv2.gt.0) then + if(nv2.eq.1) 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 + endif + if(nv2.eq.2) 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 + go to 20 + endif + +! The message will be treated as plain text. +10 text=.true. + call packtext(msg,nc1,nc2,ng) + ng=ng+32768 + +! Encode data into 6-bit words +20 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 diff --git a/lib/unpackgrid.f90 b/lib/unpackgrid.f90 index 3cbdca2e3..84dc7441d 100644 --- a/lib/unpackgrid.f90 +++ b/lib/unpackgrid.f90 @@ -1,40 +1,45 @@ - subroutine unpackgrid(ng,grid) +subroutine unpackgrid(ng,grid) - parameter (NGBASE=180*180) - character grid*4,grid6*6 + 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(2:2).eq.'A' .and. grid(4:4).eq.'0') then - i=ichar(grid(1:1)) - if(i.ge.ichar('A') .and. i.le.ichar('D')) then - call grid2n(grid,n) - if(n.ge.-50) write(grid,1012) n - if(n.lt.-50) write(grid,1022) n+20 - endif - endif - go to 100 + 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 +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 - 100 return - end +900 return +end subroutine unpackgrid diff --git a/lib/unpackmsg.f b/lib/unpackmsg.f deleted file mode 100644 index f9d3962fd..000000000 --- a/lib/unpackmsg.f +++ /dev/null @@ -1,100 +0,0 @@ - subroutine unpackmsg(dat,msg) - - parameter (NBASE=37*36*10*27*27*27) - parameter (NGBASE=180*180) - integer dat(12) - 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.gt.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 - 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 - 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 return - end diff --git a/lib/unpackmsg.f90 b/lib/unpackmsg.f90 new file mode 100644 index 000000000..8b9c5fad8 --- /dev/null +++ b/lib/unpackmsg.f90 @@ -0,0 +1,100 @@ +subroutine unpackmsg(dat,msg) + + parameter (NBASE=37*36*10*27*27*27) + parameter (NGBASE=180*180) + integer dat(12) + 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.gt.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 + 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 + 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 return +end subroutine unpackmsg diff --git a/mainwindow.cpp b/mainwindow.cpp index 04b7626f6..555e5db69 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,4 +1,4 @@ -//--------------------------------------------------------------- MainWindow +//---------------------------------------------------------------- MainWindow #include "mainwindow.h" #include "ui_mainwindow.h" #include "devsetup.h"