diff --git a/libm65/CMakeLists.txt b/libm65/CMakeLists.txt index 87ce9aaa9..baf10a761 100644 --- a/libm65/CMakeLists.txt +++ b/libm65/CMakeLists.txt @@ -89,6 +89,7 @@ set (FSRCS ftninit.f90 ftnquit.f90 gen65.f90 + genqra64a.f90 geocentric.f90 getdphi.f90 getpfx1.f90 diff --git a/libm65/genqra64a.f90 b/libm65/genqra64a.f90 new file mode 100644 index 000000000..c97605ec5 --- /dev/null +++ b/libm65/genqra64a.f90 @@ -0,0 +1,87 @@ +subroutine genqra64a(msg0,ichk,ntxfreq,mode64,itype,msgsent,iwave,nwave) + +! Encodes a QRA64 message to yield itone(1:84) + + use packjt + parameter (NMAX=2*60*11025) + character*22 msg0 + character*22 message !Message to be generated + character*22 msgsent !Message as it will be received + integer itone(84) + character*3 cok !' ' or 'OOO' + real*8 t,dt,phi,f,f0,dfgen,dphi,twopi,samfac,tsym + integer dgen(13) + integer sent(63) + 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 + + if(msg0(1:1).eq.'@') then + read(msg0(2:5),*,end=1,err=1) nfreq + go to 2 +1 nfreq=1000 +2 itone(1)=nfreq + write(msgsent,1000) nfreq +1000 format(i5,' Hz') + else + message=msg0 + do i=1,22 + if(ichar(message(i:i)).eq.0) then + message(i:)=' ' + exit + endif + enddo + + do i=1,22 !Strip leading blanks + if(message(1:1).ne.' ') exit + message=message(i+1:) + enddo + + call chkmsg(message,cok,nspecial,flip) + call packmsg(message,dgen,itype) !Pack message into 72 bits + call unpackmsg(dgen,msgsent) !Unpack to get message sent + if(ichk.ne.0) go to 999 !Return if checking only + call qra64_enc(dgen,sent) !Encode using QRA64 + + nsync=10 + itone(1:7)=nsync*icos7 !Insert 7x7 Costas array in 3 places + itone(8:39)=sent(1:32) + itone(40:46)=nsync*icos7 + itone(47:77)=sent(33:63) + itone(78:84)=nsync*icos7 + endif + +! Set up necessary constants + nsym=84 + tsym=6912.d0/12000.d0 + samfac=1.d0 + dt=1.d0/(samfac*11025.d0) + f0=ntxfreq + ndf=2**(mode64-1) + dfgen=ndf*12000.d0/6912.d0 + phi=0.d0 + dphi=twopi*dt*f0 + i=0 + iz=84*6912*11025.d0/12000.d0 + t=0.d0 + j0=0 + do i=1,iz + t=t+dt + j=t/tsym + 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 genqra64a diff --git a/mainwindow.cpp b/mainwindow.cpp index 11972cd4a..f425e1d34 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1477,10 +1477,19 @@ void MainWindow::guiUpdate() ba2msg(ba,message); int len1=22; int mode65=m_mode65; + int ichk=0; + int ntxFreq=1000; + int itype=0; double samfac=1.0; - gen65_(message,&mode65,&m_nfast,&samfac,&nsendingsh,msgsent,iwave, - &nwave,len1,len1); + if(m_modeTx=="JT65") { + gen65_(message,&mode65,&m_nfast,&samfac,&nsendingsh,msgsent,iwave, + &nwave,len1,len1); + } else { + if(m_modeQRA64==5) ntxFreq=600; + genqra64a_(message,&ichk,&ntxFreq,&m_modeQRA64,&itype,msgsent,iwave, + &nwave,len1,len1); + } msgsent[22]=0; if(m_restart) { @@ -1723,7 +1732,7 @@ void MainWindow::doubleClickOnCall(QString hiscall, bool ctrl) } ui->txFirstCheckBox->setChecked(m_txFirst); QString rpt=""; - if(ctrl) rpt=t2.mid(25,3); + if(ctrl or m_modeTx=="QRA64") rpt=t2.mid(25,3); lookup(); genStdMsgs(rpt); if(t2.indexOf(m_myCall)>0) { @@ -1767,7 +1776,7 @@ void MainWindow::genStdMsgs(QString rpt) //genStdMsgs() QString t=t0; if(t0.indexOf("/")<0) t=t0 + m_myGrid.mid(0,4); msgtype(t, ui->tx1); - if(rpt == "") { + if(rpt == "" and m_modeTx=="JT65") { t=t+" OOO"; msgtype(t, ui->tx2); msgtype("RO", ui->tx3); diff --git a/mainwindow.h b/mainwindow.h index 8c4c8feaf..65a6a4578 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -300,6 +300,10 @@ extern "C" { int* nsendingsh, char* msgsent, short iwave[], int* nwave, int len1, int len2); + void genqra64a_(char* msg, int* ichk, int* ntxFreq, int* mode64, + int* itype, char* msgsent, short iwave[], int* nwave, + int len1, int len2); + int ptt_(int* nport, int* itx, int* iptt); }