mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-28 23:28:49 -05:00
280 lines
7.7 KiB
Fortran
280 lines
7.7 KiB
Fortran
program ft2
|
|
|
|
use packjt77
|
|
include 'gcom1.f90'
|
|
integer ft2audio,ptt
|
|
logical allok
|
|
character*20 pttport
|
|
character*8 arg
|
|
character*80 fname
|
|
integer*2 id2(30000)
|
|
|
|
open(12,file='all_ft2.txt',status='unknown',position='append')
|
|
nargs=iargc()
|
|
if(nargs.eq.1) then
|
|
call getarg(1,fname)
|
|
open(10,file=fname,status='old',access='stream')
|
|
read(10) id2(1:22) !Read (and ignore) the header
|
|
read(10) id2 !Read the Rx data
|
|
close(10)
|
|
call ft2_decode(fname(1:17),nfqso,id2,ndecodes,mycall,hiscall,nrx)
|
|
go to 999
|
|
endif
|
|
|
|
allok=.true.
|
|
! Get home-station details
|
|
open(10,file='ft2.ini',status='old',err=1)
|
|
go to 2
|
|
1 print*,'Cannot open ft2.ini'
|
|
allok=.false.
|
|
2 read(10,*,err=3) mycall,mygrid,ndevin,ndevout,pttport,exch
|
|
go to 4
|
|
3 print*,'Error reading ft2.ini'
|
|
allok=.false.
|
|
4 if(index(pttport,'/').lt.1) read(pttport,*) nport
|
|
hiscall=' '
|
|
hiscall_next=' '
|
|
idevin=ndevin
|
|
idevout=ndevout
|
|
call padevsub(idevin,idevout)
|
|
if(idevin.ne.ndevin .or. idevout.ne.ndevout) allok=.false.
|
|
i1=0
|
|
i1=ptt(nport,1,1,iptt)
|
|
i1=ptt(nport,1,0,iptt)
|
|
if(i1.lt.0 .and. nport.ne.0) allok=.false.
|
|
if(.not.allok) then
|
|
write(*,"('Please fix setup error(s) and restart.')")
|
|
go to 999
|
|
endif
|
|
|
|
nright=1
|
|
iwrite=0
|
|
iwave=0
|
|
nwave=NTZ
|
|
nfsample=12000
|
|
ngo=1
|
|
npabuf=1152
|
|
ntxok=0
|
|
ntransmitting=0
|
|
tx_once=.false.
|
|
snrdb=99.0
|
|
txmsg='CQ K1JT FN20'
|
|
ltx=.false.
|
|
lrx=.false.
|
|
autoseq=.false.
|
|
QSO_in_progress=.false.
|
|
ntxed=0
|
|
|
|
if(nargs.eq.3) then
|
|
call getarg(1,txmsg)
|
|
call getarg(2,arg)
|
|
read(arg,*) f0
|
|
call getarg(3,arg)
|
|
read(arg,*) snrdb
|
|
tx_once=.true.
|
|
ftx=1500.0
|
|
call transmit(-1,ftx,iptt)
|
|
snrdb=99.0
|
|
endif
|
|
|
|
! Start the audio streams
|
|
ierr=ft2audio(idevin,idevout,npabuf,nright,y1,y2,NRING,iwrite,itx, &
|
|
iwave,nwave+3*1152,nfsample,nTxOK,nTransmitting,ngo)
|
|
if(ierr.ne.0) then
|
|
print*,'Error',ierr,' starting audio input and/or output.'
|
|
endif
|
|
|
|
999 end program ft2
|
|
|
|
subroutine update(total_time,ic1,ic2)
|
|
|
|
use wavhdr
|
|
type(hdr) h
|
|
real*8 total_time
|
|
integer*8 count0,count1,clkfreq
|
|
integer ptt
|
|
integer*2 id(30000)
|
|
logical transmitted,level,ok
|
|
character*70 line
|
|
character cdatetime*17,fname*17,mode*8,band*6
|
|
include 'gcom1.f90'
|
|
data nt0/-1/,transmitted/.false./,snr/-99.0/
|
|
data level/.false./
|
|
save nt0,transmitted,level,snr,iptt
|
|
|
|
if(ic1.ne.0 .or. ic2.ne.0) then
|
|
if(ic1.eq.27 .and. ic2.eq.0) ngo=0 !ESC
|
|
if(nTxOK.eq.0 .and. ntransmitting.eq.0) then
|
|
nfunc=0
|
|
if(ic1.eq.0 .and. ic2.eq.59) nfunc=1 !F1
|
|
if(ic1.eq.0 .and. ic2.eq.60) nfunc=2 !F2
|
|
if(ic1.eq.0 .and. ic2.eq.61) nfunc=3 !F3
|
|
if(ic1.eq.0 .and. ic2.eq.62) nfunc=4 !F4
|
|
if(ic1.eq.0 .and. ic2.eq.63) nfunc=5 !F5
|
|
if(nfunc.eq.1 .or. (nfunc.ge.2 .and. hiscall.ne.' ')) then
|
|
ftx=1500.0
|
|
call transmit(nfunc,ftx,iptt)
|
|
endif
|
|
endif
|
|
if(ic1.eq.13 .and. ic2.eq.0) hiscall=hiscall_next
|
|
if((ic1.eq.97 .or. ic1.eq.65) .and. ic2.eq.0) autoseq=.not.autoseq
|
|
if((ic1.eq.108 .or. ic1.eq.76) .and. ic2.eq.0) level=.not.level
|
|
endif
|
|
|
|
if(ntransmitting.eq.1) transmitted=.true.
|
|
if(transmitted .and. ntransmitting.eq.0) then
|
|
i1=0
|
|
if(iptt.eq.1 .and. nport.gt.0) i1=ptt(nport,0,1,iptt)
|
|
if(tx_once .and. transmitted) stop
|
|
transmitted=.false.
|
|
endif
|
|
|
|
nt=2*total_time
|
|
if(nt.gt.nt0 .or. ic1.ne.0 .or. ic2.ne.0) then
|
|
if(level) then
|
|
! Measure and display the average level of signal plus noise in past 0.5 s
|
|
k=iwrite-6000
|
|
if(k.lt.1) k=k+NRING
|
|
sq=0.
|
|
do i=1,6000
|
|
k=k+1
|
|
if(k.gt.NRING) k=k-NRING
|
|
x=y1(k)
|
|
sq=sq + x*x
|
|
enddo
|
|
sigdb=0.
|
|
if(sq.gt.0.0) sigdb=db(sq/6000.0)
|
|
n=sigdb
|
|
if(n.lt.1) n=1
|
|
if(n.gt.70) n=70
|
|
line=' '
|
|
line(n:n)='*'
|
|
write(*,1030) sigdb,ntxed,autoseq,QSO_in_progress,(line(i:i),i=1,n)
|
|
1030 format(f4.1,i3,2L2,1x,70a1)
|
|
! write(*,1020) nt,total_time,iwrite,itx,ntxok,ntransmitting,ndecodes, &
|
|
! snr,sigdb,line
|
|
!1020 format(i6,f9.3,i10,i6,3i3,f6.0,f6.1,1x,a30)
|
|
endif
|
|
k=iwrite-30000
|
|
if(k.lt.1) k=k+NRING
|
|
do i=1,30000
|
|
k=k+1
|
|
if(k.gt.NRING) k=k-NRING
|
|
id(i)=y1(k)
|
|
enddo
|
|
nutc=0
|
|
nfqso=1500
|
|
ndecodes=0
|
|
if(maxval(abs(id)).gt.0) then
|
|
call system_clock(count0,clkfreq)
|
|
nrx=-1
|
|
call ft2_decode(cdatetime(),nfqso,id,ndecodes,mycall,hiscall,nrx)
|
|
call system_clock(count1,clkfreq)
|
|
! tdecode=float(count1-count0)/float(clkfreq)
|
|
|
|
if(ndecodes.ge.1) then
|
|
fMHz=7.074
|
|
mode='FT2'
|
|
nsubmode=1
|
|
ntrperiod=0
|
|
h=default_header(12000,30000)
|
|
k=0
|
|
do i=1,250
|
|
sq=0
|
|
do n=1,120
|
|
k=k+1
|
|
x=id(k)
|
|
sq=sq + x*x
|
|
enddo
|
|
write(43,3043) i,0.01*i,1.e-4*sq
|
|
3043 format(i7,f12.6,f12.3)
|
|
enddo
|
|
call set_wsjtx_wav_params(fMHz,mode,nsubmode,ntrperiod,id)
|
|
band=""
|
|
mode=""
|
|
nsubmode=-1
|
|
ntrperiod=-1
|
|
call get_wsjtx_wav_params(id,band,mode,nsubmode,ntrperiod,ok)
|
|
! write(*,1010) band,ntrperiod,mode,char(ichar('A')-1+id(3))
|
|
!1010 format('Band: ',a6,' T/R period:',i4,' Mode: ',a8,1x,a1)
|
|
|
|
fname=cdatetime()
|
|
fname(14:17)='.wav'
|
|
open(13,file=fname,status='unknown',access='stream')
|
|
write(13) h,id
|
|
close(13)
|
|
endif
|
|
if(autoseq .and.nrx.eq.2) QSO_in_progress=.true.
|
|
if(autoseq .and. QSO_in_progress .and. nrx.ge.1 .and. nrx.le.4) then
|
|
lrx(nrx)=.true.
|
|
ftx=1500.0
|
|
if(ntxed.eq.1) then
|
|
if(nrx.eq.2) then
|
|
call transmit(3,ftx,iptt)
|
|
else
|
|
call transmit(1,ftx,iptt)
|
|
endif
|
|
endif
|
|
if(ntxed.eq.2) then
|
|
if(nrx.eq.3) then
|
|
call transmit(4,ftx,iptt)
|
|
QSO_in_progress=.false.
|
|
write(*,1032)
|
|
1032 format('QSO complete: S+P side')
|
|
else
|
|
call transmit(2,ftx,iptt)
|
|
endif
|
|
endif
|
|
if(ntxed.eq.3) then
|
|
if(nrx.eq.4) then
|
|
QSO_in_progress=.false.
|
|
write(*,1034)
|
|
1034 format('QSO complete: CQ side')
|
|
else
|
|
call transmit(3,ftx,iptt)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
nt0=nt
|
|
endif
|
|
|
|
return
|
|
end subroutine update
|
|
|
|
character*17 function cdatetime()
|
|
character cdate*8,ctime*10
|
|
call date_and_time(cdate,ctime)
|
|
cdatetime=cdate(3:8)//'_'//ctime
|
|
return
|
|
end function cdatetime
|
|
|
|
subroutine transmit(nfunc,ftx,iptt)
|
|
include 'gcom1.f90'
|
|
character*17 cdatetime
|
|
integer ptt
|
|
|
|
if(nTxOK.eq.1) return
|
|
|
|
if(nfunc.eq.1) txmsg='CQ '//trim(mycall)//' '//mygrid
|
|
if(nfunc.eq.2) txmsg=trim(hiscall)//' '//trim(mycall)// &
|
|
' 559 '//trim(exch)
|
|
if(nfunc.eq.3) txmsg=trim(hiscall)//' '//trim(mycall)// &
|
|
' R 559 '//trim(exch)
|
|
if(nfunc.eq.4) txmsg=trim(hiscall)//' '//trim(mycall)//' RR73'
|
|
if(nfunc.eq.5) txmsg='TNX 73 GL'
|
|
call ft2_iwave(txmsg,ftx,snrdb,iwave)
|
|
iwave(23041:)=0
|
|
i1=ptt(nport,1,1,iptt)
|
|
ntxok=1
|
|
n=len(trim(txmsg))
|
|
write(*,1010) cdatetime(),0,0.0,nint(ftx),(txmsg(i:i),i=1,n)
|
|
write(12,1010) cdatetime(),0,0.0,nint(ftx),(txmsg(i:i),i=1,n)
|
|
1010 format(a17,i4,f6.2,i5,' Tx ',37a1)
|
|
if(nfunc.ge.1 .and. nfunc.le.4) ntxed=nfunc
|
|
if(nfunc.ge.1 .and. nfunc.le.5) ltx(nfunc)=.true.
|
|
if(nfunc.eq.2 .or. nfunc.eq.3) QSO_in_progress=.true.
|
|
|
|
return
|
|
end subroutine transmit
|