diff --git a/CMakeLists.txt b/CMakeLists.txt index cfd644278..7aaec4f5b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ message (STATUS "******************************************************") include (set_build_type) # RC 0 or omitted is a development build, GA is a General Availability release build -set_build_type (RC 2) +set_build_type (RC 3) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # diff --git a/NEWS b/NEWS index 8409bd71c..fea3fb76b 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,25 @@ Copyright 2001 - 2021 by Joe Taylor, K1JT. + Release: WSJT-X 2.5.0-rc3 + Jul 3, 2021 + ------------------------- + +Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes +in the package since WSJT-X 2.5.0-rc2 include the following +enhancements and defect repairs: + +MAP65: + - Correct two defects that could cause "hung decoder" status + - Translate reported frequencies so that |DF| <= 500 Hz for Q65 + decodes. + - Provide access to Release Notes from the Help menu + +WSJT-X: + - Repair a long standing defect that caused UDP Protocol Heartbeat + messages to not be sent when no other intervening messages are + sent. + Release: WSJT-X 2.5.0-rc2 Jun 28, 2021 ------------------------- diff --git a/Network/MessageClient.cpp b/Network/MessageClient.cpp index 4374e8dc1..94f564bc5 100644 --- a/Network/MessageClient.cpp +++ b/Network/MessageClient.cpp @@ -71,12 +71,12 @@ public: void heartbeat (); void closedown (); StreamStatus check_status (QDataStream const&) const; - void send_message (QByteArray const&, bool queue_if_pending = true); - void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true) + void send_message (QByteArray const&, bool queue_if_pending = true, bool allow_duplicates = false); + void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true, bool allow_duplicates = false) { if (OK == check_status (out)) { - send_message (message, queue_if_pending); + send_message (message, queue_if_pending, allow_duplicates); } else { @@ -197,7 +197,7 @@ void MessageClient::impl::start () // clear any backlog while (pending_messages_.size ()) { - send_message (pending_messages_.dequeue (), false); + send_message (pending_messages_.dequeue (), true, false); } } @@ -429,7 +429,7 @@ void MessageClient::impl::heartbeat () out << NetworkMessage::Builder::schema_number // maximum schema number accepted << version_.toUtf8 () << revision_.toUtf8 (); TRACE_UDP ("schema:" << schema_ << "max schema:" << NetworkMessage::Builder::schema_number << "version:" << version_ << "revision:" << revision_); - send_message (out, message, false); + send_message (out, message, false, true); } } @@ -444,13 +444,13 @@ void MessageClient::impl::closedown () } } -void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending) +void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending, bool allow_duplicates) { if (server_port_) { if (!server_.isNull ()) { - if (message != last_message_) // avoid duplicates + if (allow_duplicates || message != last_message_) // avoid duplicates { if (is_multicast_address (server_)) { diff --git a/Release_Notes.txt b/Release_Notes.txt index 9989e95a3..85edbce68 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -12,6 +12,25 @@ Copyright 2001 - 2021 by Joe Taylor, K1JT. + Release: WSJT-X 2.5.0-rc3 + Jul 3, 2021 + ------------------------- + +Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes +in the package since WSJT-X 2.5.0-rc2 include the following +enhancements and defect repairs: + +MAP65: + - Correct two defects that could cause "hung decoder" status + - Translate reported frequencies so that |DF| <= 500 Hz for Q65 + decodes. + - Provide access to Release Notes from the Help menu + +WSJT-X: + - Repair a long standing defect that caused UDP Protocol Heartbeat + messages to not be sent when no other intervening messages are + sent. + Release: WSJT-X 2.5.0-rc2 Jun 28, 2021 ------------------------- @@ -23,7 +42,7 @@ enhancements and defect repairs: MAP65: - Compute polarization angle for Xpol systems and display to nearest degree - - Compute and display the recommended Tx polarization + - Compute and display the recommended Tx polarization - Protect against Fortran bounds errors in several places - Insert leading 0 when needed in UTC hours and minutes on waterfall - Wideband Q65 synchronization corrected to include single-polarization diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 914932705..8aabe4152 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -453,6 +453,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & ibest=0 lagpk=0 lagbest=0 + idrift_best=0 do i=ia,ib ccfmax=0. do lag=lag1,lag2 diff --git a/lib/qra/q65/q65_loops.f90 b/lib/qra/q65/q65_loops.f90 index a1bcc64cb..ec93adb09 100644 --- a/lib/qra/q65/q65_loops.f90 +++ b/lib/qra/q65/q65_loops.f90 @@ -59,8 +59,9 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, & ndt=idt/2 if(mod(idt,2).eq.0) ndt=-ndt jpk=jpk0 + nsps2*ndt/16 !tsym/16 - if(jpk.lt.0) jpk=0 - call spec64(c0,nsps2,mode_q65,jpk,s3,LL,NN) + jpk=max(0,jpk) + jpk=min(29000,jpk) + call spec64(c0,npts2,nsps2,mode_q65,jpk,s3,LL,NN) call pctile(s3,LL*NN,40,base) s3=s3/base where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim diff --git a/lib/spec64.f90 b/lib/spec64.f90 index b3b7d54d6..793220500 100644 --- a/lib/spec64.f90 +++ b/lib/spec64.f90 @@ -1,8 +1,7 @@ -subroutine spec64(c0,nsps,mode_q65,jpk,s3,LL,NN) +subroutine spec64(c0,npts,nsps,mode_q65,jpk,s3,LL,NN) parameter (MAXFFT=20736) -!### Fix this: - complex c0(0:1800000-1) !Complex spectrum of dd() + complex c0(0:npts-1) !Complex spectrum of dd() complex cs(0:MAXFFT-1) !Complex symbol spectrum real s3(LL,NN) !Synchronized symbol spectra real xbase0(LL),xbase(LL) @@ -21,7 +20,11 @@ subroutine spec64(c0,nsps,mode_q65,jpk,s3,LL,NN) j=j+1 ja=(k-1)*nsps + jpk jb=ja+nsps-1 - cs(0:nfft-1)=c0(ja:jb) + if(ja.lt.0) ja=0 + if(jb.gt.npts-1) jb=npts-1 + nz=jb-ja + cs(0:nz)=c0(ja:jb) + if(nz.lt.nfft-1) cs(nz+1:)=0. call four2a(cs,nsps,1,-1,1) !c2c FFT to frequency do ii=1,LL i=ii-65+mode_q65 !mode_q65 = 1 2 4 8 16 for Q65 A B C D E diff --git a/map65/libm65/m65.f90 b/map65/libm65/m65.f90 index d79ecdcd7..179ffceb8 100644 --- a/map65/libm65/m65.f90 +++ b/map65/libm65/m65.f90 @@ -11,7 +11,7 @@ program m65 ! 13 map65.log ! 14 ! 15 -! 16 +! 16 tquick log ! 17 saved *.tf2 files ! 18 test file to be transmitted (wsjtgen.f90) ! 19 livecq.txt diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 index e8359a5a0..efa1da34b 100644 --- a/map65/libm65/map65a.f90 +++ b/map65/libm65/map65a.f90 @@ -37,6 +37,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/ save + call sec0(0,tquick) nkhz_center=nint(1000.0*(fcenter-int(fcenter))) mfa=nfa-nkhz_center+48 mfb=nfb-nkhz_center+48 @@ -381,6 +382,11 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & write(*,1013) nsum,nsave 1013 format('',2i4) flush(6) + call sec0(1,tquick) + open(16,file='tquick.dat',status='unknown',access='append') + write(16,1016) nutc,tquick +1016 format(i4.4,f7.1) + close(16) endif if(nqd.eq.1 .and. nagain.eq.1) go to 900 @@ -481,9 +487,9 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & nsync2,nutc,decoded,cp,cmode 1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) - write(21,1016) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & + write(21,1100) f0,ndf,dt,npol,nsync2,nutc,decoded,cp, & cmode(1:1),cmode(2:2) -1016 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) +1100 format(f8.3,i5,f5.1,2i4,i5.4,2x,a22,2x,a1,3x,a1,1x,a1) ! write(21,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, & ! nutc,decoded,cp,cmode diff --git a/map65/libm65/polfit.f90 b/map65/libm65/polfit.f90 index 7013432e2..e01bbe6a9 100644 --- a/map65/libm65/polfit.f90 +++ b/map65/libm65/polfit.f90 @@ -56,15 +56,16 @@ subroutine polfit(y,npts,a) deltaa(j)=deltaa(j)*fn/3. ! write(*,4000) iter,j,a,deltaa,chisq2 !4000 format(2i2,2(2x,3f8.2),f12.5) - enddo + enddo ! j=1,nterms chisqr=fchisq_pol(y,npts,a) ! write(*,4000) 0,0,a,chisqr + if(chisqr.lt.1.0) exit if(deltaa(1).lt.0.01*(a(2)-a(1)) .and. deltaa(2).lt.0.01*(a(2)-a(1)) & .and. deltaa(3).lt.1.0) exit if(chisqr/chisqr0.gt.0.99) exit - a(3)=mod(a(3)+360.0,180.0) chisqr0=chisqr - enddo + enddo ! iter + a(3)=mod(a(3)+360.0,180.0) return end subroutine polfit diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 1f1840b30..41e1f1854 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -24,7 +24,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1),cz(0:MAXFFT2) logical xpol integer ipk1(1) - real*8 fcenter,freq0 + real*8 fcenter,freq0,freq1 character*12 mycall0,hiscall0 character*12 mycall,hiscall character*6 mygrid,hisgrid @@ -138,7 +138,7 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & newdat,nagain,max_drift,mycall,hiscall,hisgrid) MHz=fcenter - freq0=MHz + 0.001*ikhz + freq0=MHz + 0.001d0*ikhz if(nsnr0.gt.-99) then nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal @@ -149,8 +149,13 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & if(npol.lt.0) npol=npol+180 endif call txpol(xpol,msg0(1:22),mygrid,npol,nxant,ntxpol,cp) + ikhz1=ikhz + ndf=nq65df + if(ndf.gt.500) ikhz1=ikhz + (nq65df+500)/1000 + if(ndf.lt.-500) ikhz1=ikhz + (nq65df-500)/1000 + ndf=nq65df - 1000*(ikhz1-ikhz) if(nqd.eq.1 .and. abs(nq65df-mousedf).lt.ntol) then - write(line,1020) ikhz,nq65df,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0, & + write(line,1020) ikhz1,ndf,npol,nutc,xdt0,nsnr0,msg0(1:27),cq0, & ntxpol,cp 1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3,i4,1x,a1) write(*,1100) trim(line) @@ -161,12 +166,13 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & cmode=': ' cmode(2:2)=char(ichar('A') + mode_q65-1) - write(26,1014) freq0,nq65df,0,0,0,xdt0,npol,0, & - nsnr0,nutc,msg0(1:22),':',cp,cmode + freq1=freq0 + 0.001d0*(ikhz1-ikhz) + write(26,1014) freq1,ndf,0,0,0,xdt0,npol,0,nsnr0,nutc,msg0(1:22), & + ':',cp,cmode 1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,1x,2a1,2x,a2) ! Write to file map65_rx.log: - write(21,1110) freq0,nq65df,xdt0,npol,nsnr0,nutc,msg0(1:28),cq0 + write(21,1110) freq1,ndf,xdt0,npol,nsnr0,nutc,msg0(1:28),cq0 1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': A',2x,a3) endif diff --git a/map65/libm65/wideband_sync.f90 b/map65/libm65/wideband_sync.f90 index 65b5074ce..ee582549d 100644 --- a/map65/libm65/wideband_sync.f90 +++ b/map65/libm65/wideband_sync.f90 @@ -44,7 +44,7 @@ subroutine get_candidates(ss,savg,xpol,nfa,nfb,nts_jt65,nts_q65,cand,ncand) enddo jz=j -call wb_sync(ss,savg,xpol,jz,nfa,nfb) + call wb_sync(ss,savg,xpol,jz,nfa,nfb) tstep=2048.0/11025.0 !0.185760 s: 0.5*tsym_jt65, 0.3096*tsym_q65 df3=96000.0/NFFT diff --git a/map65/main.cpp b/map65/main.cpp index fb910a116..c03d14cb8 100644 --- a/map65/main.cpp +++ b/map65/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char *argv[]) QApplication a {argc, argv}; // Override programs executable basename as application name. a.setApplicationName ("MAP65"); - a.setApplicationVersion ("3.0.0-rc2"); + a.setApplicationVersion ("3.0.0-rc3"); // switch off as we share an Info.plist file with WSJT-X a.setAttribute (Qt::AA_DontUseNativeMenuBar); MainWindow w; diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index f3d08f2a1..e8f574f9f 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -952,8 +952,8 @@ void MainWindow::closeEvent (QCloseEvent * e) proc_m65.setReadChannel (QProcess::StandardError); proc_m65.readAll (); - // allow time for any decode cycle to finish - if (!proc_m65.waitForFinished ()) proc_m65.kill(); + proc_m65.disconnect (); + if (!proc_m65.waitForFinished (1000)) proc_m65.kill(); quitFile.remove(); mem_m65.detach(); if (m_astro_window) m_astro_window->close (); @@ -981,6 +981,13 @@ void MainWindow::stub() //stub() msgBox("Not yet implemented."); } +void MainWindow::on_actionRelease_Notes_triggered() +{ + QDesktopServices::openUrl(QUrl( + "https://www.physics.princeton.edu/pulsar/K1JT/Release_Notes.txt", + QUrl::TolerantMode)); +} + void MainWindow::on_actionOnline_Users_Guide_triggered() //Display manual { QDesktopServices::openUrl(QUrl( diff --git a/map65/mainwindow.h b/map65/mainwindow.h index 7dbe1194c..d03028de4 100644 --- a/map65/mainwindow.h +++ b/map65/mainwindow.h @@ -76,6 +76,7 @@ private slots: void on_tolSpinBox_valueChanged(int arg1); void on_actionAstro_Data_triggered(); void on_stopButton_clicked(); + void on_actionRelease_Notes_triggered(); void on_actionOnline_Users_Guide_triggered(); void on_actionQSG_Q65_triggered(); void on_actionQSG_MAP65_v3_triggered(); diff --git a/map65/mainwindow.ui b/map65/mainwindow.ui index c52295a93..7497108da 100644 --- a/map65/mainwindow.ui +++ b/map65/mainwindow.ui @@ -1233,6 +1233,7 @@ p, li { white-space: pre-wrap; } Help + @@ -1698,6 +1699,11 @@ p, li { white-space: pre-wrap; } Q65 Sensitivity in MAP65 3.0 + + + Release Notes + +