WSJT-X/recvpkt.F90
Joe Taylor 5f66aff299 1. Center frequency send by Linrad is now used to set frequency scale in
SpecJT and frequency labels on lines of decoded text.  (Needs checking!)
2. Corrected logic for Rx buffer assignment on program startup, and
   for when a transmission is started late.  (Needs checking!)
3. Diagnostic display of kbuf, kk, and kxp/96000 in status-bar msg7.


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@943 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2008-07-12 18:11:36 +00:00

160 lines
3.8 KiB
Fortran

subroutine recvpkt(iarg)
! Receive timf2 packets from Linrad and stuff data into array id().
! (This routine runs in a background thread and will never return.)
parameter (NSZ=2*60*96000)
real*8 d8(NSZ)
integer*1 userx_no,iusb
integer*2 nblock,nblock0
integer txnow
logical first
real*8 center_freq,buf8
common/plrscom/center_freq,msec,fqso,iptr,nblock,userx_no,iusb,buf8(174)
include 'datcom.f90'
include 'gcom1.f90'
include 'gcom2.f90'
equivalence (id,d8)
data nblock0/0/,first/.true./,kb/1/,npkt/0/,nw/0/
data sqave/0.0/,u/0.001/,rxnoise/0.0/,kbuf/1/,lost_tot/0/
data multicast0/-99/
save
1 call setup_rsocket(multicast) !Open socket for multicast/unicast data
nreset=-1
k=0
nsec0=-999
fcenter=144.125 !Default (startup) frequency)
multicast0=multicast
10 if(multicast.ne.multicast0) go to 1
call recv_pkt(center_freq)
fcenter=center_freq
! Wait for an even minute to start accepting Rx data.
if(nsec0.eq.-999) then
if(mod(msec/1000,60).ne.0) go to 10
nsec0=-998
endif
isec=sec_midn()
imin=isec/60
if((monitoring.eq.0) .or. (lauto.eq.1 .and. mod(imin,2).eq.(1-TxFirst))) then
first=.true.
! If we're transmitting and were previously receiving in this minute,
! switch buffers to prepare for the next Rx minute.
if(lauto.eq.1 .and. mod(imin,2).eq.(1-TxFirst) .and. reset.eq.1) then
nreset=0
kb=3-kb
k=0
if(kb.eq.2) k=NSMAX
lost_tot=0
ndone1=0
ndone2=0
endif
go to 10
endif
! If we get here, we're in Rx mode
lost=nblock-nblock0-1
if(lost.ne.0 .and. .not.first) then
nb=nblock
if(nb.lt.0) nb=nb+65536
nb0=nblock0
if(nb0.lt.0) nb0=nb0+65536
lost_tot=lost_tot + lost ! Insert zeros for the lost data.
do i=1,174*lost
k=k+1
d8(k)=0
enddo
endif
nblock0=nblock
nsec=msec/1000
if(mod(nsec,60).eq.1) nreset=1
! If this is the start of a new minute, switch buffers
if(mod(nsec,60).eq.0 .and. nreset.eq.1) then
nreset=0
kb=3-kb
k=0
if(kb.eq.2) k=NSMAX
lost_tot=0
ndone1=0
ndone2=0
endif
if(kb.eq.1 .and. (k+174).gt.NSMAX) go to 20
if(kb.eq.2 .and. (k+174).gt.2*NSMAX) go to 20
sq=0.
do i=1,174
k=k+1
d8(k)=buf8(i)
k2=k
n=1
if(k.gt.NSMAX) then
k2=k2-NSMAX
n=2
endif
sq=sq + float(int(id(1,k2,n)))**2 + float(int(id(1,k2,n)))**2 + &
float(int(id(1,k2,n)))**2 + float(int(id(1,k2,n)))**2
enddo
sqave=sqave + u*(sq-sqave)
rxnoise=10.0*log10(sqave) - 48.0
kxp=k
if(k.lt.1 .or. k.gt.NSZ) then
print*,'Error in recvpkt: ',k,NSZ,NSMAX
stop
endif
! The following may be a bad idea because it uses non-reentrant Fortran I/O ???
if(mode.eq.'Measur') then
npkt=npkt+1
if(npkt.ge.551) then
npkt=0
nw=nw+1
rewind 11
write(11,1000) nw,rxnoise
1000 format(i6,f8.2)
write(11,*) '$EOF'
call flushqqq(11)
ndecdone=1
write(24,1000) nw,rxnoise
endif
else
nw=0
endif
20 if(nsec.ne.nsec0) then
mutch=nsec/3600
mutcm=mod(nsec/60,60)
mutc=100*mutch + mutcm
ns=mod(nsec,60)
nsec0=nsec
! See if it's time to start FFTs
if(ns.ge.nt1 .and. ndone1.eq.0) then
nutc=mutc
fcenter=center_freq
kbuf=kb
kk=k
ndiskdat=0
ndone1=1
endif
! See if it's time to start second stage of processing
if(ns.ge.nt2 .and. ndone2.eq.0) then
kk=k
ndone2=1
nlost=lost_tot ! Save stats for printout
endif
endif
first=.false.
go to 10
end subroutine recvpkt