Merge branch 'release-2.5.0'

This commit is contained in:
Bill Somerville 2021-07-02 16:44:46 +01:00
commit fd326893be
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
16 changed files with 101 additions and 31 deletions

View File

@ -71,7 +71,7 @@ message (STATUS "******************************************************")
include (set_build_type) include (set_build_type)
# RC 0 or omitted is a development build, GA is a General Availability release build # 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}") set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
# #

19
NEWS
View File

@ -12,6 +12,25 @@
Copyright 2001 - 2021 by Joe Taylor, K1JT. 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 Release: WSJT-X 2.5.0-rc2
Jun 28, 2021 Jun 28, 2021
------------------------- -------------------------

View File

@ -71,12 +71,12 @@ public:
void heartbeat (); void heartbeat ();
void closedown (); void closedown ();
StreamStatus check_status (QDataStream const&) const; StreamStatus check_status (QDataStream const&) const;
void send_message (QByteArray const&, 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) void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true, bool allow_duplicates = false)
{ {
if (OK == check_status (out)) if (OK == check_status (out))
{ {
send_message (message, queue_if_pending); send_message (message, queue_if_pending, allow_duplicates);
} }
else else
{ {
@ -197,7 +197,7 @@ void MessageClient::impl::start ()
// clear any backlog // clear any backlog
while (pending_messages_.size ()) 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 out << NetworkMessage::Builder::schema_number // maximum schema number accepted
<< version_.toUtf8 () << revision_.toUtf8 (); << version_.toUtf8 () << revision_.toUtf8 ();
TRACE_UDP ("schema:" << schema_ << "max schema:" << NetworkMessage::Builder::schema_number << "version:" << version_ << "revision:" << revision_); 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_port_)
{ {
if (!server_.isNull ()) if (!server_.isNull ())
{ {
if (message != last_message_) // avoid duplicates if (allow_duplicates || message != last_message_) // avoid duplicates
{ {
if (is_multicast_address (server_)) if (is_multicast_address (server_))
{ {

View File

@ -12,6 +12,25 @@
Copyright 2001 - 2021 by Joe Taylor, K1JT. 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 Release: WSJT-X 2.5.0-rc2
Jun 28, 2021 Jun 28, 2021
------------------------- -------------------------

View File

@ -453,6 +453,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, &
ibest=0 ibest=0
lagpk=0 lagpk=0
lagbest=0 lagbest=0
idrift_best=0
do i=ia,ib do i=ia,ib
ccfmax=0. ccfmax=0.
do lag=lag1,lag2 do lag=lag1,lag2

View File

@ -59,8 +59,9 @@ subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0, &
ndt=idt/2 ndt=idt/2
if(mod(idt,2).eq.0) ndt=-ndt if(mod(idt,2).eq.0) ndt=-ndt
jpk=jpk0 + nsps2*ndt/16 !tsym/16 jpk=jpk0 + nsps2*ndt/16 !tsym/16
if(jpk.lt.0) jpk=0 jpk=max(0,jpk)
call spec64(c0,nsps2,mode_q65,jpk,s3,LL,NN) jpk=min(29000,jpk)
call spec64(c0,npts2,nsps2,mode_q65,jpk,s3,LL,NN)
call pctile(s3,LL*NN,40,base) call pctile(s3,LL*NN,40,base)
s3=s3/base s3=s3/base
where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim

View File

@ -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) parameter (MAXFFT=20736)
!### Fix this: complex c0(0:npts-1) !Complex spectrum of dd()
complex c0(0:1800000-1) !Complex spectrum of dd()
complex cs(0:MAXFFT-1) !Complex symbol spectrum complex cs(0:MAXFFT-1) !Complex symbol spectrum
real s3(LL,NN) !Synchronized symbol spectra real s3(LL,NN) !Synchronized symbol spectra
real xbase0(LL),xbase(LL) real xbase0(LL),xbase(LL)
@ -21,7 +20,11 @@ subroutine spec64(c0,nsps,mode_q65,jpk,s3,LL,NN)
j=j+1 j=j+1
ja=(k-1)*nsps + jpk ja=(k-1)*nsps + jpk
jb=ja+nsps-1 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 call four2a(cs,nsps,1,-1,1) !c2c FFT to frequency
do ii=1,LL do ii=1,LL
i=ii-65+mode_q65 !mode_q65 = 1 2 4 8 16 for Q65 A B C D E i=ii-65+mode_q65 !mode_q65 = 1 2 4 8 16 for Q65 A B C D E

View File

@ -11,7 +11,7 @@ program m65
! 13 map65.log ! 13 map65.log
! 14 ! 14
! 15 ! 15
! 16 ! 16 tquick log
! 17 saved *.tf2 files ! 17 saved *.tf2 files
! 18 test file to be transmitted (wsjtgen.f90) ! 18 test file to be transmitted (wsjtgen.f90)
! 19 livecq.txt ! 19 livecq.txt

View File

@ -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/ data nfile/0/,nutc0/-999/,nid/0/,ip000/1/,ip001/1/,mousefqso0/-999/
save save
call sec0(0,tquick)
nkhz_center=nint(1000.0*(fcenter-int(fcenter))) nkhz_center=nint(1000.0*(fcenter-int(fcenter)))
mfa=nfa-nkhz_center+48 mfa=nfa-nkhz_center+48
mfb=nfb-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 write(*,1013) nsum,nsave
1013 format('<QuickDecodeDone>',2i4) 1013 format('<QuickDecodeDone>',2i4)
flush(6) 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 endif
if(nqd.eq.1 .and. nagain.eq.1) go to 900 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, & write(26,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, &
nsync2,nutc,decoded,cp,cmode nsync2,nutc,decoded,cp,cmode
1014 format(f8.3,i5,3i3,f5.1,i4,i3,i4,i5.4,4x,a22,2x,a1,3x,a2) 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) 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, & ! write(21,1014) f0,ndf,ndf0,ndf1,ndf2,dt,npol,nsync1, &
! nutc,decoded,cp,cmode ! nutc,decoded,cp,cmode

View File

@ -56,15 +56,16 @@ subroutine polfit(y,npts,a)
deltaa(j)=deltaa(j)*fn/3. deltaa(j)=deltaa(j)*fn/3.
! write(*,4000) iter,j,a,deltaa,chisq2 ! write(*,4000) iter,j,a,deltaa,chisq2
!4000 format(2i2,2(2x,3f8.2),f12.5) !4000 format(2i2,2(2x,3f8.2),f12.5)
enddo enddo ! j=1,nterms
chisqr=fchisq_pol(y,npts,a) chisqr=fchisq_pol(y,npts,a)
! write(*,4000) 0,0,a,chisqr ! 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)) & 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 .and. deltaa(3).lt.1.0) exit
if(chisqr/chisqr0.gt.0.99) exit if(chisqr/chisqr0.gt.0.99) exit
a(3)=mod(a(3)+360.0,180.0)
chisqr0=chisqr chisqr0=chisqr
enddo enddo ! iter
a(3)=mod(a(3)+360.0,180.0)
return return
end subroutine polfit end subroutine polfit

View File

@ -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) complex cx(0:MAXFFT2-1),cy(0:MAXFFT2-1),cz(0:MAXFFT2)
logical xpol logical xpol
integer ipk1(1) integer ipk1(1)
real*8 fcenter,freq0 real*8 fcenter,freq0,freq1
character*12 mycall0,hiscall0 character*12 mycall0,hiscall0
character*12 mycall,hiscall character*12 mycall,hiscall
character*6 mygrid,hisgrid 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) newdat,nagain,max_drift,mycall,hiscall,hisgrid)
MHz=fcenter MHz=fcenter
freq0=MHz + 0.001*ikhz freq0=MHz + 0.001d0*ikhz
if(nsnr0.gt.-99) then if(nsnr0.gt.-99) then
nq65df=nint(1000*(0.001*k0*df+nkhz_center-48.0+1.000-1.27046-ikhz))-nfcal 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 if(npol.lt.0) npol=npol+180
endif endif
call txpol(xpol,msg0(1:22),mygrid,npol,nxant,ntxpol,cp) 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 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 ntxpol,cp
1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3,i4,1x,a1) 1020 format('!',i3.3,i5,i4,i6.4,f5.1,i5,' : ',a27,a3,i4,1x,a1)
write(*,1100) trim(line) write(*,1100) trim(line)
@ -161,12 +166,13 @@ subroutine q65b(nutc,nqd,nxant,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, &
cmode=': ' cmode=': '
cmode(2:2)=char(ichar('A') + mode_q65-1) cmode(2:2)=char(ichar('A') + mode_q65-1)
write(26,1014) freq0,nq65df,0,0,0,xdt0,npol,0, & freq1=freq0 + 0.001d0*(ikhz1-ikhz)
nsnr0,nutc,msg0(1:22),':',cp,cmode 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) 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 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) 1110 format(f8.3,i5,f5.1,2i4,i5.4,2x,a28,': A',2x,a3)
endif endif

View File

@ -19,7 +19,7 @@ int main(int argc, char *argv[])
QApplication a {argc, argv}; QApplication a {argc, argv};
// Override programs executable basename as application name. // Override programs executable basename as application name.
a.setApplicationName ("MAP65"); 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 // switch off as we share an Info.plist file with WSJT-X
a.setAttribute (Qt::AA_DontUseNativeMenuBar); a.setAttribute (Qt::AA_DontUseNativeMenuBar);
MainWindow w; MainWindow w;

View File

@ -952,8 +952,8 @@ void MainWindow::closeEvent (QCloseEvent * e)
proc_m65.setReadChannel (QProcess::StandardError); proc_m65.setReadChannel (QProcess::StandardError);
proc_m65.readAll (); proc_m65.readAll ();
// allow time for any decode cycle to finish proc_m65.disconnect ();
if (!proc_m65.waitForFinished ()) proc_m65.kill(); if (!proc_m65.waitForFinished (1000)) proc_m65.kill();
quitFile.remove(); quitFile.remove();
mem_m65.detach(); mem_m65.detach();
if (m_astro_window) m_astro_window->close (); if (m_astro_window) m_astro_window->close ();
@ -981,6 +981,13 @@ void MainWindow::stub() //stub()
msgBox("Not yet implemented."); 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 void MainWindow::on_actionOnline_Users_Guide_triggered() //Display manual
{ {
QDesktopServices::openUrl(QUrl( QDesktopServices::openUrl(QUrl(

View File

@ -76,6 +76,7 @@ private slots:
void on_tolSpinBox_valueChanged(int arg1); void on_tolSpinBox_valueChanged(int arg1);
void on_actionAstro_Data_triggered(); void on_actionAstro_Data_triggered();
void on_stopButton_clicked(); void on_stopButton_clicked();
void on_actionRelease_Notes_triggered();
void on_actionOnline_Users_Guide_triggered(); void on_actionOnline_Users_Guide_triggered();
void on_actionQSG_Q65_triggered(); void on_actionQSG_Q65_triggered();
void on_actionQSG_MAP65_v3_triggered(); void on_actionQSG_MAP65_v3_triggered();

View File

@ -1233,6 +1233,7 @@ p, li { white-space: pre-wrap; }
<property name="title"> <property name="title">
<string>Help</string> <string>Help</string>
</property> </property>
<addaction name="actionRelease_Notes"/>
<addaction name="actionOnline_Users_Guide"/> <addaction name="actionOnline_Users_Guide"/>
<addaction name="actionQSG_Q65"/> <addaction name="actionQSG_Q65"/>
<addaction name="actionQSG_MAP65_v3"/> <addaction name="actionQSG_MAP65_v3"/>
@ -1698,6 +1699,11 @@ p, li { white-space: pre-wrap; }
<string>Q65 Sensitivity in MAP65 3.0</string> <string>Q65 Sensitivity in MAP65 3.0</string>
</property> </property>
</action> </action>
<action name="actionRelease_Notes">
<property name="text">
<string>Release Notes</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<customwidgets> <customwidgets>