mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-25 05:38:46 -05:00
Test program to exercise features of the "WSPR QSO mode" that was tested briefly in 2008.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8446 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
2fd2e0c7fe
commit
c470611cc9
8
lib/qso50/g0
Normal file
8
lib/qso50/g0
Normal file
@ -0,0 +1,8 @@
|
||||
gfortran -o twq -Wall -Wno-conversion -fbounds-check twq.f90 \
|
||||
../packjt.f90 wqenc.f90 wqdec.f90 packprop.f90 \
|
||||
packname.f90 packtext2.f90 unpackprop.f90 unpackname.f90 \
|
||||
unpacktext2.f90 unpackpfx.f90 pack50.f90 unpack50.f90 \
|
||||
../hash.f90 ../deg2grid.f90 ../grid2deg.f90 \
|
||||
../fix_contest_msg.f90 ../to_contest_msg.f90 \
|
||||
../fmtmsg.f90 ../azdist.f90 ../geodist.f90 ../wsprd/nhash.c
|
||||
|
26
lib/qso50/pack50.f90
Normal file
26
lib/qso50/pack50.f90
Normal file
@ -0,0 +1,26 @@
|
||||
subroutine pack50(n1,n2,dat)
|
||||
|
||||
integer*1 dat(11),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
|
||||
|
23
lib/qso50/packname.f90
Normal file
23
lib/qso50/packname.f90
Normal file
@ -0,0 +1,23 @@
|
||||
subroutine packname(name,len,n1,n2)
|
||||
|
||||
character*9 name
|
||||
real*8 dn
|
||||
|
||||
dn=0
|
||||
do i=1,len
|
||||
n=ichar(name(i:i))
|
||||
if(n.ge.97 .and. n.le.122) n=n-32
|
||||
dn=27*dn + n-64
|
||||
enddo
|
||||
if(len.lt.9) then
|
||||
do i=len+1,9
|
||||
dn=27*dn
|
||||
enddo
|
||||
endif
|
||||
|
||||
n2=mod(dn,32768.d0)
|
||||
dn=dn/32768.d0
|
||||
n1=dn
|
||||
|
||||
return
|
||||
end subroutine packname
|
36
lib/qso50/packprop.f90
Normal file
36
lib/qso50/packprop.f90
Normal file
@ -0,0 +1,36 @@
|
||||
subroutine packprop(k,muf,ccur,cxp,n1)
|
||||
|
||||
! Pack propagation indicators into a 21-bit number.
|
||||
|
||||
! k k-index, 0-9; 10="N/A"
|
||||
! muf muf, 2-60 MHz; 0=N/A, 1="none", 61=">60 MHz"
|
||||
! ccur up to two current events, each indicated by single
|
||||
! or double letter.
|
||||
! cxp zero or one expected event, indicated by single or
|
||||
! double letter
|
||||
|
||||
character ccur*4,cxp*2
|
||||
|
||||
j=ichar(ccur(1:1))-64
|
||||
if(j.lt.0) j=0
|
||||
n1=j
|
||||
do i=2,4
|
||||
if(ccur(i:i).eq.' ') go to 10
|
||||
if(ccur(i:i).eq.ccur(i-1:i-1)) then
|
||||
n1=n1+26
|
||||
else
|
||||
j=ichar(ccur(i:i))-64
|
||||
if(j.lt.0) j=0
|
||||
n1=53*n1 + j
|
||||
endif
|
||||
enddo
|
||||
|
||||
10 j=ichar(cxp(1:1))-64
|
||||
if(j.lt.0) j=0
|
||||
if(cxp(2:2).eq.cxp(1:1)) j=j+26
|
||||
n1=53*n1 + j
|
||||
n1=11*n1 + k
|
||||
n1=62*n1 + muf
|
||||
|
||||
return
|
||||
end subroutine packprop
|
22
lib/qso50/packtext2.f90
Normal file
22
lib/qso50/packtext2.f90
Normal file
@ -0,0 +1,22 @@
|
||||
subroutine packtext2(msg,n1,ng)
|
||||
|
||||
character*8 msg
|
||||
real*8 dn
|
||||
character*41 c
|
||||
data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +./?'/
|
||||
|
||||
dn=0.
|
||||
do i=1,8
|
||||
do j=1,41
|
||||
if(msg(i:i).eq.c(j:j)) go to 10
|
||||
enddo
|
||||
j=37
|
||||
10 j=j-1 !Codes should start at zero
|
||||
dn=41.d0*dn + j
|
||||
enddo
|
||||
|
||||
ng=mod(dn,32768.d0)
|
||||
n1=(dn-ng)/32768.d0
|
||||
|
||||
return
|
||||
end subroutine packtext2
|
18
lib/qso50/twq.f90
Normal file
18
lib/qso50/twq.f90
Normal file
@ -0,0 +1,18 @@
|
||||
program twq
|
||||
|
||||
character*22 msg0,msg
|
||||
integer*1 data0(11)
|
||||
|
||||
open(10,file='wqmsg.txt',status='old')
|
||||
write(*,1000)
|
||||
1000 format(4x,'Encoded message',9x,'Decoded as',12x,'itype'/55('-'))
|
||||
|
||||
do line=1,9999
|
||||
read(10,*,end=999) msg0
|
||||
call wqenc(msg0,itype,data0)
|
||||
call wqdec(data0,msg,ntype)
|
||||
write(*,1100) line,msg0,msg,ntype
|
||||
1100 format(i2,'.',1x,a22,2x,a22,i3)
|
||||
enddo
|
||||
|
||||
999 end program twq
|
30
lib/qso50/unpack50.f90
Normal file
30
lib/qso50/unpack50.f90
Normal file
@ -0,0 +1,30 @@
|
||||
subroutine unpack50(dat,n1,n2)
|
||||
|
||||
integer*1 dat(11)
|
||||
|
||||
i=dat(1)
|
||||
i4=iand(i,255)
|
||||
n1=ishft(i4,20)
|
||||
i=dat(2)
|
||||
i4=iand(i,255)
|
||||
n1=n1 + ishft(i4,12)
|
||||
i=dat(3)
|
||||
i4=iand(i,255)
|
||||
n1=n1 + ishft(i4,4)
|
||||
i=dat(4)
|
||||
i4=iand(i,255)
|
||||
n1=n1 + iand(ishft(i4,-4),15)
|
||||
n2=ishft(iand(i4,15),18)
|
||||
i=dat(5)
|
||||
i4=iand(i,255)
|
||||
n2=n2 + ishft(i4,10)
|
||||
i=dat(6)
|
||||
i4=iand(i,255)
|
||||
n2=n2 + ishft(i4,2)
|
||||
i=dat(7)
|
||||
i4=iand(i,255)
|
||||
n2=n2 + iand(ishft(i4,-6),3)
|
||||
|
||||
return
|
||||
end subroutine unpack50
|
||||
|
20
lib/qso50/unpackname.f90
Normal file
20
lib/qso50/unpackname.f90
Normal file
@ -0,0 +1,20 @@
|
||||
subroutine unpackname(n1,n2,name,len)
|
||||
|
||||
character*9 name
|
||||
real*8 dn
|
||||
|
||||
dn=32768.d0*n1 + n2
|
||||
len=0
|
||||
do i=9,1,-1
|
||||
j=mod(dn,27.d0)
|
||||
if(j.ge.1) then
|
||||
name(i:i)=char(64+j)
|
||||
len=len+1
|
||||
else
|
||||
name(i:i)=' '
|
||||
endif
|
||||
dn=dn/27.d0
|
||||
enddo
|
||||
|
||||
return
|
||||
end subroutine unpackname
|
35
lib/qso50/unpackpfx.f90
Normal file
35
lib/qso50/unpackpfx.f90
Normal file
@ -0,0 +1,35 @@
|
||||
subroutine unpackpfx(ng,call1)
|
||||
|
||||
character*12 call1
|
||||
character*3 pfx
|
||||
|
||||
if(ng.lt.60000) then
|
||||
! Add-on prefix of 1 to 3 characters
|
||||
n=ng
|
||||
do i=3,1,-1
|
||||
nc=mod(n,37)
|
||||
if(nc.ge.0 .and. nc.le.9) then
|
||||
pfx(i:i)=char(nc+48)
|
||||
else if(nc.ge.10 .and. nc.le.35) then
|
||||
pfx(i:i)=char(nc+55)
|
||||
else
|
||||
pfx(i:i)=' '
|
||||
endif
|
||||
n=n/37
|
||||
enddo
|
||||
call1=pfx//'/'//call1
|
||||
if(call1(1:1).eq.' ') call1=call1(2:)
|
||||
if(call1(1:1).eq.' ') call1=call1(2:)
|
||||
else
|
||||
! Add-on suffix, one character
|
||||
i1=index(call1,' ')
|
||||
nc=ng-60000
|
||||
if(nc.ge.0 .and. nc.le.9) then
|
||||
call1=call1(:i1-1)//'/'//char(nc+48)
|
||||
else if(nc.ge.10 .and. nc.le.35) then
|
||||
call1=call1(:i1-1)//'/'//char(nc+55)
|
||||
endif
|
||||
endif
|
||||
|
||||
return
|
||||
end subroutine unpackpfx
|
28
lib/qso50/unpackprop.f90
Normal file
28
lib/qso50/unpackprop.f90
Normal file
@ -0,0 +1,28 @@
|
||||
subroutine unpackprop(n1,k,muf,ccur,cxp)
|
||||
|
||||
character ccur*4,cxp*2
|
||||
|
||||
muf=mod(n1,62)
|
||||
n1=n1/62
|
||||
|
||||
k=mod(n1,11)
|
||||
n1=n1/11
|
||||
|
||||
j=mod(n1,53)
|
||||
n1=n1/53
|
||||
if(j.eq.0) cxp='*'
|
||||
if(j.ge.1 .and. j.le.26) cxp=char(64+j)
|
||||
if(j.gt.26) cxp=char(64+j-26)//char(64+j-26)
|
||||
|
||||
j=mod(n1,53)
|
||||
n1=n1/53
|
||||
if(j.eq.0) ccur(2:2)='*'
|
||||
if(j.ge.1 .and. j.le.26) ccur(2:2)=char(64+j)
|
||||
if(j.gt.26) ccur(2:3)=char(64+j-26)//char(64+j-26)
|
||||
j=n1
|
||||
if(j.eq.0) ccur(1:1)='*'
|
||||
if(j.ge.1 .and. j.le.26) ccur(1:1)=char(64+j)
|
||||
if(j.gt.26) ccur=char(64+j-26)//char(64+j-26)//ccur(2:3)
|
||||
|
||||
return
|
||||
end subroutine unpackprop
|
17
lib/qso50/unpacktext2.f90
Normal file
17
lib/qso50/unpacktext2.f90
Normal file
@ -0,0 +1,17 @@
|
||||
subroutine unpacktext2(n1,ng,msg)
|
||||
|
||||
character*22 msg
|
||||
real*8 dn
|
||||
character*41 c
|
||||
data c/'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ +./?'/
|
||||
|
||||
msg=' '
|
||||
dn=32768.d0*n1 + ng
|
||||
do i=8,1,-1
|
||||
j=mod(dn,41.d0)
|
||||
msg(i:i)=c(j+1:j+1)
|
||||
dn=dn/41.d0
|
||||
enddo
|
||||
|
||||
return
|
||||
end subroutine unpacktext2
|
316
lib/qso50/wqdec.f90
Normal file
316
lib/qso50/wqdec.f90
Normal file
@ -0,0 +1,316 @@
|
||||
subroutine wqdec(data0,message,ntype)
|
||||
|
||||
use packjt
|
||||
parameter (N15=32758)
|
||||
integer*1 data0(11)
|
||||
character*22 message
|
||||
character*12 callsign
|
||||
character*3 cdbm,cf
|
||||
character*2 crpt
|
||||
character*4 grid,psfx
|
||||
character*9 name
|
||||
character*36 fmt
|
||||
character*6 cwx(4)
|
||||
character*7 cwind(5)
|
||||
character ccur*4,cxp*2
|
||||
logical first
|
||||
character*12 dcall(0:N15-1)
|
||||
data first/.true./
|
||||
data cwx/'CLEAR','CLOUDY','RAIN','SNOW'/
|
||||
data cwind/'CALM','BREEZES','WINDY','DRY','HUMID'/
|
||||
save first,dcall
|
||||
|
||||
if(first) then
|
||||
dcall=' '
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
message=' '
|
||||
call unpack50(data0,n1,n2)
|
||||
call unpackcall(n1,callsign,iv2,psfx)
|
||||
i1=index(callsign,' ')
|
||||
call unpackgrid(n2/128,grid)
|
||||
ntype=iand(n2,127) -64
|
||||
|
||||
! Standard WSPR message (types 0 3 7 10 13 17 ... 60)
|
||||
nu=mod(ntype,10)
|
||||
if(ntype.ge.0 .and. ntype.le.60 .and. (nu.eq.0 .or. nu.eq.3 .or. &
|
||||
nu.eq.7)) then
|
||||
write(cdbm,'(i3)'),ntype
|
||||
if(cdbm(1:1).eq.' ') cdbm=cdbm(2:)
|
||||
if(cdbm(1:1).eq.' ') cdbm=cdbm(2:)
|
||||
message=callsign(1:i1)//grid//' '//cdbm
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1)
|
||||
|
||||
! "Best DX" WSPR response (type 1)
|
||||
else if(ntype.eq.1) then
|
||||
message=grid//' DE '//callsign
|
||||
|
||||
! CQ (msg 3; types 2,4,5)
|
||||
else if(ntype.eq.2) then
|
||||
message='CQ '//callsign(:i1)//grid
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1)
|
||||
else if(ntype.eq.4 .or. ntype.eq.5) then
|
||||
ng=n2/128 + 32768*(ntype-4)
|
||||
call unpackpfx(ng,callsign)
|
||||
message='CQ '//callsign
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1)
|
||||
|
||||
! Reply to CQ (msg #2; type 6)
|
||||
else if(ntype.eq.6) then
|
||||
ih=(n2-64-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message='<'//dcall(ih)(:i2-1)//'> '//callsign(:i1-1)
|
||||
else
|
||||
message='<...> '//callsign
|
||||
endif
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Reply to CQ (msg #2; type 8)
|
||||
else if(ntype.eq.8) then
|
||||
message='DE '//callsign(:i1)//grid
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Reply to CQ, DE pfx/call (msg #2; types 9, 11)
|
||||
else if(ntype.eq.9 .or. ntype.eq.11) then
|
||||
ng=n2/128 + 32768*(ntype-9)/2
|
||||
call unpackpfx(ng,callsign)
|
||||
message='DE '//callsign
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Calls and report (msg #3; types -1 to -9)
|
||||
else if(ntype.le.-1 .and. ntype.ge.-9) then
|
||||
write(crpt,1010) -ntype
|
||||
1010 format('S',i1)
|
||||
ih=(n2-62-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message=callsign(:i1)//'<'//dcall(ih)(:i2-1)//'> '//crpt
|
||||
else
|
||||
message=callsign(:i1)//'<...> '//crpt
|
||||
endif
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! pfx/call and report (msg #3; types -10 to -27)
|
||||
else if(ntype.le.-10 .and. ntype.ge.-27) then
|
||||
ng=n2/128
|
||||
nrpt=-ntype-9
|
||||
if(ntype.le.-19) then
|
||||
ng=ng + 32768
|
||||
nrpt=-ntype-18
|
||||
endif
|
||||
write(crpt,1010) nrpt
|
||||
call unpackpfx(ng,callsign)
|
||||
message=callsign//' '//crpt
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Calls and R and report (msg #4; types -28 to -36)
|
||||
else if(ntype.le.-28 .and. ntype.ge.-36) then
|
||||
write(crpt,1010) -(ntype+27)
|
||||
ih=(n2-64+28-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message=callsign(:i1)//'<'//dcall(ih)(:i2-1)//'> '//'R '//crpt
|
||||
else
|
||||
message=callsign(:i1)//'<...> '//'R '//crpt
|
||||
endif
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! pfx/call R and report (msg #4; types -37 to -54)
|
||||
else if(ntype.le.-37 .and. ntype.ge.-54) then
|
||||
ng=n2/128
|
||||
nrpt=-ntype-36
|
||||
if(ntype.le.-46) then
|
||||
ng=ng + 32768
|
||||
nrpt=-ntype-45
|
||||
endif
|
||||
write(crpt,1010) nrpt
|
||||
call unpackpfx(ng,callsign)
|
||||
message=callsign//' R '//crpt
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Calls and RRR (msg#5; type 12)
|
||||
else if(ntype.eq.12) then
|
||||
ih=(n2-64+28-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message=callsign(:i1)//'<'//dcall(ih)(:i2-1)//'> RRR'
|
||||
else
|
||||
message=callsign(:i1)//'<...> RRR'
|
||||
endif
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! Calls and RRR (msg#5; type 14)
|
||||
else if(ntype.eq.14) then
|
||||
ih=(n2-64+28-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message='<'//dcall(ih)(:i2-1)//'> '//callsign(:i1)//'RRR'
|
||||
else
|
||||
message='<...> '//callsign(:i1)//' RRR'
|
||||
endif
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! DE pfx/call and RRR (msg#5; types 15, 16)
|
||||
else if(ntype.eq.15 .or. ntype.eq.16) then
|
||||
ng=n2/128 + 32768*(ntype-15)
|
||||
call unpackpfx(ng,callsign)
|
||||
message='DE '//callsign//' RRR'
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! TNX [name] 73 GL (msg #6; type 18)
|
||||
else if(ntype.eq.18) then
|
||||
ng=(n2-18-64)/128
|
||||
call unpackname(n1,ng,name,len)
|
||||
message='TNX '//name(:len)//' 73 GL'
|
||||
|
||||
! OP [name] 73 GL (msg #6; type 18)
|
||||
else if(ntype.eq.-56) then
|
||||
ng=(n2+56-64)/128
|
||||
call unpackname(n1,ng,name,len)
|
||||
message='OP '//name(:len)//' 73 GL'
|
||||
|
||||
! 73 DE [call] [grid] (msg #6; type 19)
|
||||
else if(ntype.eq.19) then
|
||||
ng=(n2-19-64)/128
|
||||
message='73 DE '//callsign(:i1)//grid
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! 73 DE pfx/call (msg #6; type 21, 22)
|
||||
else if(ntype.eq.21 .or. ntype.eq.22) then
|
||||
ng=n2/128 + (ntype-21)*32768
|
||||
call unpackpfx(ng,callsign)
|
||||
i1=index(callsign,' ')
|
||||
message='73 DE '//callsign
|
||||
call hash(callsign,i1-1,ih)
|
||||
dcall(ih)=callsign(:i1-1)
|
||||
|
||||
! [power] W [gain] DBD 73 GL (msg#6; type 24, 25)
|
||||
else if(ntype.eq.24 .or. ntype.eq.25) then
|
||||
ng=(n2-24-64)/128 - 32
|
||||
i1=1
|
||||
if(n1.gt.0) i1=log10(float(n1)) + 1
|
||||
i2=1
|
||||
if(ng.ge.10) i2=2
|
||||
if(ng.lt.0) i2=i2+1
|
||||
if(n1.le.3000) then
|
||||
if(ntype.eq.24) fmt="(i4,' W ',i2,' DBD 73 GL')"
|
||||
if(ntype.eq.25) fmt="(i4,' W ',i2,' DBD ')"
|
||||
fmt(3:3)=char(48+i1)
|
||||
fmt(12:12)=char(48+i2)
|
||||
if(ng.le.100) then
|
||||
write(message,fmt) n1,ng
|
||||
else
|
||||
if(ng.eq.30000) fmt=fmt(1:8)//"DIPOLE')"
|
||||
if(ng.eq.30001) fmt=fmt(1:8)//"VERTICAL')"
|
||||
write(message,fmt) n1
|
||||
endif
|
||||
else
|
||||
mw=n1-3000
|
||||
if(ntype.eq.24) fmt="('0.',i3.3,' W ',i2,' DBD 73 GL')"
|
||||
if(ntype.eq.25) fmt="('0.',i3.3,' W ',i2,' DBD ')"
|
||||
fmt(19:19)=char(48+i2)
|
||||
if(ng.le.100) then
|
||||
write(message,fmt) mw,ng
|
||||
else
|
||||
if(ng.eq.30000) fmt=fmt(1:15)//"DIPOLE')"
|
||||
if(ng.eq.30001) fmt=fmt(1:15)//"VERTICAL')"
|
||||
write(message,fmt) n1
|
||||
endif
|
||||
if(index(message,'***').gt.0) go to 700
|
||||
endif
|
||||
|
||||
! QRZ call (msg #3; type 26)
|
||||
else if(ntype.eq.26) then
|
||||
ng=(n2-24-64)/128 - 32
|
||||
message='QRZ '//callsign
|
||||
|
||||
! PSE QSY [nnn] KHZ (msg #6; type 28)
|
||||
else if(ntype.eq.28) then
|
||||
if(n1.gt.0) i1=log10(float(n1)) + 1
|
||||
fmt="('PSE QSY ',i2,' KHZ')"
|
||||
fmt(14:14)=char(48+i1)
|
||||
write(message,fmt) n1
|
||||
|
||||
! WX wx temp C/F wind (msg #6; type 29)
|
||||
else if(ntype.eq.29) then
|
||||
nwx=n1/10000
|
||||
ntemp=mod(n1,10000) - 100
|
||||
cf=' F '
|
||||
if(ntemp.gt.800) then
|
||||
ntemp=ntemp-1000
|
||||
cf=' C '
|
||||
endif
|
||||
n2a=n2/128
|
||||
if(nwx.ge.1 .and. nwx.le.4 .and. n2a.ge.1 .and. n2a.le.5) then
|
||||
write(message,1020) cwx(nwx),ntemp,cf,cwind(n2/128)
|
||||
1020 format('WX ',a6,i3,a3,a7)
|
||||
else
|
||||
message='WX'//' (BadMsg)'
|
||||
endif
|
||||
|
||||
! Hexadecimal data (type 62)
|
||||
else if(ntype.eq.62) then
|
||||
ng=n2/128
|
||||
write(message,'(z4.4,z7.7)') ng,n1
|
||||
|
||||
! Solar/geomagnetic/ionospheric data (type 63)
|
||||
else if(ntype.eq.63) then
|
||||
ih=(n2-64-ntype)/128
|
||||
if(dcall(ih)(1:1).ne.' ') then
|
||||
i2=index(dcall(ih),' ')
|
||||
message='<'//dcall(ih)(:i2-1)//'> '
|
||||
else
|
||||
message='<...> '
|
||||
endif
|
||||
call unpackprop(n1,k,muf,ccur,cxp)
|
||||
i2=index(message,'>')
|
||||
write(message(i2+1:),'(i3,i3)') k,muf
|
||||
message=message(:i2+7)//ccur//' '//cxp
|
||||
|
||||
! [plain text] (msg #6; type -57)
|
||||
else if(ntype.eq.-57) then
|
||||
ng=n2/128
|
||||
call unpacktext2(n1,ng,message)
|
||||
else
|
||||
go to 700
|
||||
endif
|
||||
go to 750
|
||||
|
||||
! message='<Unknown message type>'
|
||||
700 i1=index(callsign,' ')
|
||||
if(i1.lt.1) i1=12
|
||||
message=callsign(:i1)//' (BadMsg)'
|
||||
|
||||
750 do i=1,22
|
||||
if(ichar(message(i:i)).eq.0) message(i:i)=' '
|
||||
enddo
|
||||
|
||||
do i=22,1,-1
|
||||
if(message(i:i).ne.' ') go to 800
|
||||
enddo
|
||||
800 i2=i
|
||||
do n=1,20
|
||||
i1=index(message(:i2),' ')
|
||||
if(i1.le.0) go to 900
|
||||
message=message(1:i1)//message(i1+2:)
|
||||
i2=i2-1
|
||||
enddo
|
||||
|
||||
900 return
|
||||
end subroutine wqdec
|
346
lib/qso50/wqenc.f90
Normal file
346
lib/qso50/wqenc.f90
Normal file
@ -0,0 +1,346 @@
|
||||
subroutine wqenc(msg,ntype,data0)
|
||||
|
||||
! Parse and encode a WSPR message.
|
||||
|
||||
use packjt
|
||||
parameter (MASK15=32767)
|
||||
character*22 msg
|
||||
character*12 call1,call2
|
||||
character*4 grid
|
||||
character*9 name
|
||||
character ccur*4,cxp*2
|
||||
logical lbad1,lbad2
|
||||
integer*1 data0(11)
|
||||
integer nu(0:9)
|
||||
data nu/0,-1,1,0,-1,2,1,0,-1,1/
|
||||
|
||||
read(msg,1001,end=1,err=1) ng,n1
|
||||
1001 format(z4,z7)
|
||||
ntype=62
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0) !Pack 8 bits per byte, add tail
|
||||
go to 900
|
||||
|
||||
1 if(msg(1:6).eq.'73 DE ') go to 80
|
||||
if(index(msg,' W ').gt.0 .and. index(msg,' DBD ').gt.0) go to 90
|
||||
if(msg(1:4).eq.'QRZ ') go to 100
|
||||
if(msg(1:8).eq.'PSE QSY ') go to 110
|
||||
if(msg(1:3).eq.'WX ') go to 120
|
||||
|
||||
! Standard WSPR message (types 0 3 7 10 13 17 ... 60)
|
||||
i1=index(msg,' ')
|
||||
if(i1.lt.4 .or. i1.gt.7) go to 10
|
||||
call1=msg(:i1-1)
|
||||
grid=msg(i1+1:i1+4)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad1 .or. lbad2) go to 10
|
||||
ndbm=0
|
||||
read(msg(i1+5:),*,err=10,end=800) ndbm
|
||||
if(ndbm.lt.0 .or. ndbm.gt.60) go to 800
|
||||
ndbm=ndbm+nu(mod(ndbm,10))
|
||||
n2=128*ng + (ndbm+64)
|
||||
call pack50(n1,n2,data0)
|
||||
ntype=ndbm
|
||||
go to 900
|
||||
|
||||
! "BestDX" automated WSPR reply (type 1)
|
||||
10 if(i1.ne.5 .or. msg(5:8).ne.' DE ') go to 20
|
||||
grid=msg(1:4)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad2) go to 800
|
||||
call1=msg(9:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 800
|
||||
ntype=1
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0) !Pack 8 bits per byte, add tail
|
||||
go to 900
|
||||
|
||||
! CQ (msg #1; types 2, 4, 5)
|
||||
20 if(msg(1:3).ne.'CQ ') go to 30
|
||||
if(index(msg,'/').le.0) then
|
||||
i2=index(msg(4:),' ')
|
||||
call1=msg(4:i2+3)
|
||||
grid=msg(i2+4:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 30
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad2) go to 30
|
||||
ntype=2
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
ntype=4 ! or 5
|
||||
call1=msg(4:)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype+nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! Reply to CQ (msg #2; types 6,8,9,11)
|
||||
30 if(msg(1:1).ne.'<' .and. msg(1:3).ne.'DE ') go to 40
|
||||
if(index(msg,' RRR ').gt.0) go to 50
|
||||
if(msg(1:1).eq.'<') then
|
||||
ntype=6
|
||||
i1=index(msg,'>')
|
||||
call1=msg(2:i1-1)
|
||||
read(msg(i1+1:),*,err=31,end=31) k,muf,ccur,cxp
|
||||
go to 130
|
||||
31 call2=msg(i1+2:)
|
||||
call hash(call1,i1-2,ih)
|
||||
call packcall(call2,n1,lbad1)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
i1=index(msg(4:),' ')
|
||||
call1=msg(4:i1+2)
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=8
|
||||
ih=0
|
||||
call packcall(call1,n1,lbad1)
|
||||
grid=msg(i1+4:i1+7)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
ntype=9 ! or 11
|
||||
call1=msg(4:)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype + 2*nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! Call(s) + report (msg #3; types -1 to -27)
|
||||
! Call(s) + R + report (msg #4; types -28 to -54)
|
||||
40 if(index(msg,' RRR').gt.0) go to 50
|
||||
i1=index(msg,'<')
|
||||
if(i1.gt.0 .and. (i1.lt.5 .or. i1.gt.8)) go to 50
|
||||
i2=index(msg,'/')
|
||||
if(i2.gt.0 .and.i2.le.4) then
|
||||
ntype=-10 ! -10 to -27
|
||||
i0=index(msg,' ')
|
||||
call1=msg(:i0-1)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype - 9*nadd
|
||||
i2=index(msg,' ')
|
||||
i3=index(msg,' R ')
|
||||
if(i3.gt.0) i2=i2+2 !-28 to -36
|
||||
read(msg(i2+2:i2+2),*,end=800,err=800) nrpt
|
||||
ntype=ntype - (nrpt-1)
|
||||
if(i3.gt.0) ntype=ntype-27
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
else if(i1.eq.0) then
|
||||
go to 50
|
||||
endif
|
||||
call1=msg(:i1-2) !-1 to -9
|
||||
i2=index(msg,'>')
|
||||
call2=msg(i1+1:i2-1)
|
||||
call hash(call2,i2-i1-1,ih)
|
||||
i3=index(msg,' R ')
|
||||
if(i3.gt.0) i2=i2+2 !-28 to -36
|
||||
read(msg(i2+3:i2+3),*,end=42,err=42) nrpt
|
||||
go to 43
|
||||
42 nrpt=1
|
||||
43 ntype=-nrpt
|
||||
if(i3.gt.0) ntype=-(nrpt+27)
|
||||
call packcall(call1,n1,lbad1)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
50 i0=index(msg,'<')
|
||||
if(i0.le.0 .and. msg(1:3).ne.'DE ') go to 60
|
||||
i3=index(msg,' RRR')
|
||||
if(i3.le.0) go to 60
|
||||
! Call or calls and RRR (msg#5; type2 12,14,15,16)
|
||||
i0=index(msg,'<')
|
||||
if(i0.eq.1) then
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=14
|
||||
i1=index(msg,'>')
|
||||
call1=msg(2:i1-1)
|
||||
call2=msg(i1+2:)
|
||||
i2=index(call2,' ')
|
||||
call2=call2(:i2-1)
|
||||
call packcall(call2,n1,lbad1)
|
||||
call hash(call1,i1-2,ih)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
stop '0002'
|
||||
endif
|
||||
else if(i0.ge.5 .and. i0.le.8) then
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=12
|
||||
i1=index(msg,'>')
|
||||
call1=msg(:i0-2)
|
||||
call2=msg(i0+1:i1-1)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call hash(call2,i1-i0-1,ih)
|
||||
n2=128*ih + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
else
|
||||
stop '0002'
|
||||
endif
|
||||
else
|
||||
i1=index(msg(4:),' ')
|
||||
call1=msg(4:i1+2)
|
||||
if(index(msg,'/').le.0) then
|
||||
ntype=9
|
||||
grid=msg(i1+4:i1+7)
|
||||
else
|
||||
ntype=15 ! or 16
|
||||
call1=msg(4:)
|
||||
i0=index(call1,' ')
|
||||
call1=call1(:i0-1)
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype+nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
endif
|
||||
endif
|
||||
go to 900
|
||||
|
||||
! TNX <name> 73 GL (msg #6; type 18 ...)
|
||||
60 if(msg(1:4).ne.'TNX ') go to 70
|
||||
ntype=18
|
||||
n1=0
|
||||
i2=index(msg(5:),' ')
|
||||
name=msg(5:i2+4)
|
||||
call packname(name,i2-1,n1,ng)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! TNX name 73 GL (msg #6; type -56 ...)
|
||||
70 if(msg(1:3).ne.'OP ') go to 80
|
||||
ntype=-56
|
||||
n1=0
|
||||
i2=index(msg(4:),' ')
|
||||
name=msg(4:i2+3)
|
||||
call packname(name,i2-1,n1,ng)
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! 73 DE call grid (msg #6; type 19)
|
||||
80 if(msg(1:6).ne.'73 DE ') go to 90
|
||||
ntype=19
|
||||
i1=index(msg(7:),' ')
|
||||
call1=msg(7:)
|
||||
if(index(call1,'/').le.0) then
|
||||
i1=index(call1,' ')
|
||||
grid=call1(i1+1:)
|
||||
call1=call1(:i1-1)
|
||||
call packcall(call1,n1,lbad1)
|
||||
call packgrid(grid,ng,lbad2)
|
||||
if(lbad1 .or. lbad2) go to 800
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
else
|
||||
ntype=21 ! or 22
|
||||
call packpfx(call1,n1,ng,nadd)
|
||||
ntype=ntype + nadd
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
endif
|
||||
|
||||
! [pwr] W [gain] DBD [73 GL] (msg #6; types 24, 25)
|
||||
90 if(index(msg,' W ').le.0) go to 140
|
||||
ntype=25
|
||||
if(index(msg,' DBD 73 GL').gt.0) ntype=24
|
||||
i1=index(msg,' ')
|
||||
read(msg(:i1-1),*,end=800,err=800) watts
|
||||
if(watts.ge.1.0) nwatts=watts
|
||||
if(watts.lt.1.0) nwatts=3000 + nint(1000.*watts)
|
||||
if(index(msg,'DIPOLE').gt.0) then
|
||||
ndbd=30000
|
||||
else if(index(msg,'VERTICAL').gt.0) then
|
||||
ndbd=30001
|
||||
else
|
||||
i2=index(msg(i1+3:),' ')
|
||||
read(msg(i1+3:i1+i2+1),*,end=800,err=800) ndbd
|
||||
endif
|
||||
n1=nwatts
|
||||
ng=ndbd + 32
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! QRZ call (msg #3; type 26)
|
||||
100 call1=msg(5:)
|
||||
call packcall(call1,n1,lbad1)
|
||||
if(lbad1) go to 800
|
||||
ntype=26
|
||||
n2=ntype+64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! PSE QSY [nnn] KHZ (msg #6; type 28)
|
||||
110 ntype=28
|
||||
read(msg(9:),*,end=800,err=800) n1
|
||||
n2=ntype+64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
! WX wx temp C|F wind (msg #6; type 29)
|
||||
120 ntype=29
|
||||
if(index(msg,' CLEAR ').gt.0) then
|
||||
i1=10
|
||||
n1=10000
|
||||
else if(index(msg,' CLOUDY ').gt.0) then
|
||||
i1=11
|
||||
n1=20000
|
||||
else if(index(msg,' RAIN ').gt.0) then
|
||||
i1=9
|
||||
n1=30000
|
||||
else if(index(msg,' SNOW ').gt.0) then
|
||||
i1=9
|
||||
n1=40000
|
||||
endif
|
||||
read(msg(i1:),*,err=800,end=800) ntemp
|
||||
ntemp=ntemp+100
|
||||
i1=index(msg,' C ')
|
||||
if(i1.gt.0) ntemp=ntemp+1000
|
||||
n1=n1+ntemp
|
||||
if(index(msg,' CALM').gt.0) ng=1
|
||||
if(index(msg,' BREEZES').gt.0) ng=2
|
||||
if(index(msg,' WINDY').gt.0) ng=3
|
||||
if(index(msg,' DRY').gt.0) ng=4
|
||||
if(index(msg,' HUMID').gt.0) ng=5
|
||||
|
||||
n2=128*ng + (ntype+64)
|
||||
call pack50(n1,n2,data0)
|
||||
|
||||
go to 900
|
||||
|
||||
! Solar/geomagnetic/ionospheric data
|
||||
130 ntype=63
|
||||
call packprop(k,muf,ccur,cxp,n1)
|
||||
call hash(call1,i1-2,ih)
|
||||
n2=128*ih + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
140 continue
|
||||
|
||||
! Plain text
|
||||
800 ntype=-57
|
||||
call packtext2(msg(:8),n1,ng)
|
||||
n2=128*ng + ntype + 64
|
||||
call pack50(n1,n2,data0)
|
||||
go to 900
|
||||
|
||||
900 continue
|
||||
return
|
||||
end subroutine wqenc
|
31
lib/qso50/wqmsg.txt
Normal file
31
lib/qso50/wqmsg.txt
Normal file
@ -0,0 +1,31 @@
|
||||
"CQ K1JT FN20"
|
||||
"CQ PJ4/K1JT"
|
||||
"<K1JT> W6CQZ"
|
||||
"DE W6CQZ CM87"
|
||||
"DE PJ4/K1JT"
|
||||
"W6CQZ <K1JT> S4"
|
||||
"QRZ K1JT"
|
||||
"PJ4/W6CQZ S4"
|
||||
"K1JT <W6CQZ> R S3"
|
||||
"PJ4/K1JT R S3"
|
||||
"<W6CQZ> K1JT RRR"
|
||||
"W6CQZ <K1JT> RRR"
|
||||
"DE PJ4/K1JT RRR"
|
||||
"73 DE W6CQZ CM87"
|
||||
"73 DE PJ4/K1JT"
|
||||
"TNX VICTORIA 73 GL"
|
||||
"OP HARRY 73 GL"
|
||||
"5 W DIPOLE"
|
||||
"10 W VERTICAL"
|
||||
"1 W 0 DBD"
|
||||
"1500 W 21 DBD 73 GL"
|
||||
"PSE QSY 1811 KHZ"
|
||||
"WX SNOW -5 C CALM"
|
||||
"CUL JACK"
|
||||
"."
|
||||
"CQ K1JT FN20"
|
||||
"<K1JT> W6CQZ"
|
||||
"W6CQZ <K1JT> S4"
|
||||
"K1JT <W6CQZ> R S3"
|
||||
"<W6CQZ> K1JT RRR"
|
||||
"TNX JOE 73 GL"
|
Loading…
Reference in New Issue
Block a user