From 2e53a8a47d73ab0526bd59d0a0046775ef2a679c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 30 May 2021 12:07:48 -0400 Subject: [PATCH 1/2] Add GUI controls to set max_drift in both WSJT-X and MAP65. --- commons.h | 6 ++-- displayWidgets.txt | 51 +++++++++++++++++----------------- lib/decoder.f90 | 2 +- lib/jt9com.f90 | 1 + lib/map65_mmdec.f90 | 4 +-- lib/q65_decode.f90 | 6 ++-- lib/qra/q65/q65.f90 | 10 ++----- map65/commons.h | 1 + map65/libm65/decode0.f90 | 4 +-- map65/libm65/m65.f90 | 4 +-- map65/libm65/m65a.f90 | 2 +- map65/libm65/map65a.f90 | 8 +++--- map65/libm65/q65b.f90 | 4 +-- map65/mainwindow.cpp | 3 ++ map65/mainwindow.ui | 16 +++++++++++ widgets/mainwindow.cpp | 59 +++++++++++++++++++++++++--------------- widgets/mainwindow.ui | 13 +++++++++ 17 files changed, 120 insertions(+), 74 deletions(-) diff --git a/commons.h b/commons.h index 0a3872048..9bd097b6d 100644 --- a/commons.h +++ b/commons.h @@ -26,10 +26,9 @@ typedef struct dec_data { int nutc; //UTC as integer, HHMM bool ndiskdat; //true ==> data read from *.wav file int ntrperiod; //TR period (seconds) - int nQSOProgress; /* QSO state machine state */ + int nQSOProgress; //QSO state machine state int nfqso; //User-selected QSO freq (kHz) - int nftx; /* Transmit audio offset where - replies might be expected */ + int nftx; //TX audio offset where replies might be expected bool newdat; //true ==> new data, must do long FFT int npts8; //npts for c0() array int nfa; //Low decode limit (Hz) @@ -59,6 +58,7 @@ typedef struct dec_data { int naggressive; bool nrobust; int nexp_decode; + int max_drift; char datetime[20]; char mycall[12]; char mygrid[6]; diff --git a/displayWidgets.txt b/displayWidgets.txt index 7a58347ef..eb74a9d91 100644 --- a/displayWidgets.txt +++ b/displayWidgets.txt @@ -1,34 +1,34 @@ Here are the "displayWidgets()" strings for WSJT-X modes 1 2 3 - 0123456789012345678901234567890123456 ------------------------------------------------- -JT4 1110100000001100001100000000000000000 -JT4/VHF 1111100100101101101111000000000000000 -JT9 1110100000001110000100000000000010000 -JT9/VHF 1111101010001111100100000000000000000 -JT9+JT65 1110100000011110000100000000000010000 -JT65 1110100000001110000100000000000010000 -JT65/VHF 1111100100001101101011000100000000000 -Q65 1111110101101101001110000001000000001 -ISCAT 1001110000000001100000000000000000000 -MSK144 1011111101000000000100010000000000000 -WSPR 0000000000000000010100000000000000000 -FST4 1111110001001110000100000001000000110 -FST4W 0000000000000000010100000000000001000 -Echo 0000000000000000000000100000000000000 -FCal 0011010000000000000000000000010000000 -FT8 1110100001001110000100001001100010000 -FT8/VHF 1110100001001110000100001001100010000 -FT8/Fox 1110100001001110000100000000001000000 -FT8/Hound 1110100001001110000100000000001100000 ----------------------------------------------- + 01234567890123456789012345678901234567 +------------------------------------------------- +JT4 11101000000011000011000000000000000000 +JT4/VHF 11111001001011011011110000000000000000 +JT9 11101000000011100001000000000000100000 +JT9/VHF 11111010100011111001000000000000000000 +JT9+JT65 11101000000111100001000000000000100000 +JT65 11101000000011100001000000000000100000 +JT65/VHF 11111001000011011010110001000000000000 +Q65 11111101011011010011100000010000000011 +ISCAT 10011100000000011000000000000000000000 +MSK144 10111111010000000001000100000000000000 +WSPR 00000000000000000101000000000000000000 +FST4 11111100010011100001000000010000001100 +FST4W 00000000000000000101000000000000010000 +Echo 00000000000000000000001000000000000000 +FCal 00110100000000000000000000000100000000 +FT8 11101000010011100001000010011000100000 +FT8/VHF 11101000010011100001000010011000100000 +FT8/Fox 11101000010011100001000000000010000000 +FT8/Hound 11101000010011100001000000000011000000 +------------------------------------------------- 1 2 3 - 012345678901234567890123456789012 + 01234567890123456789012345678901234567 ----------------------------------------------- +------------------------------------------------- Mapping of column numbers to widgets ----------------------------------------------- +------------------------------------------------- 0. txFirstCheckbox 1. TxFreqSpinBox 2. RxFreqSpinBox @@ -66,3 +66,4 @@ Mapping of column numbers to widgets 34. sbF_Low 35. sbF_High 36. AutoClrAvg +37. sbMaxDrift diff --git a/lib/decoder.f90 b/lib/decoder.f90 index eb517b71e..1e2eba9c2 100644 --- a/lib/decoder.f90 +++ b/lib/decoder.f90 @@ -209,7 +209,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample) call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & params%nsubmode,params%nfqso,params%ntol,params%ndepth, & params%nfa,params%nfb,logical(params%nclearave), & - single_decode,logical(params%nagain), & + single_decode,logical(params%nagain),params%max_drift, & logical(params%newdat),params%emedelay,mycall,hiscall,hisgrid, & params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0) call timer('dec_q65 ',1) diff --git a/lib/jt9com.f90 b/lib/jt9com.f90 index 3a6b8759c..5b2970c05 100644 --- a/lib/jt9com.f90 +++ b/lib/jt9com.f90 @@ -41,6 +41,7 @@ integer(c_int) :: naggressive logical(c_bool) :: nrobust integer(c_int) :: nexp_decode + integer(c_int) :: max_drift character(kind=c_char) :: datetime(20) character(kind=c_char) :: mycall(12) character(kind=c_char) :: mygrid(6) diff --git a/lib/map65_mmdec.f90 b/lib/map65_mmdec.f90 index 144b99480..ca9f959ed 100644 --- a/lib/map65_mmdec.f90 +++ b/lib/map65_mmdec.f90 @@ -1,5 +1,5 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & - nagain,mycall,hiscall,hisgrid) + nagain,max_drift,mycall,hiscall,hisgrid) use prog_args use timer_module, only: timer @@ -48,7 +48,7 @@ subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & call timer('dec_q65 ',0) call my_q65%decode(q65_decoded,id2,nqd,nutc,ntrperiod,nsubmode,nfqso, & - ntol,ndepth,nfa,nfb,lclearave,single_decode,lagain,lnewdat, & + ntol,ndepth,nfa,nfb,lclearave,single_decode,lagain,max_drift,lnewdat, & emedelay,mycall,hiscall,hisgrid,nQSOProgress,ncontest,lapcqonly,navg0) call timer('dec_q65 ',1) diff --git a/lib/q65_decode.f90 b/lib/q65_decode.f90 index 9ab0730e3..f917d5b7d 100644 --- a/lib/q65_decode.f90 +++ b/lib/q65_decode.f90 @@ -31,8 +31,9 @@ module q65_decode contains subroutine decode(this,callback,iwave,nqd0,nutc,ntrperiod,nsubmode,nfqso, & - ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,lnewdat0, & - emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest,lapcqonly,navg0) + ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,max_drift0, & + lnewdat0,emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest, & + lapcqonly,navg0) ! Top-level routine that organizes the decoding of Q65 signals ! Input: iwave Raw data, i*2 @@ -81,6 +82,7 @@ contains nfb=nfb0 nqd=nqd0 lnewdat=lnewdat0 + max_drift=max_drift0 idec=-1 idf=0 idt=0 diff --git a/lib/qra/q65/q65.f90 b/lib/qra/q65/q65.f90 index 9f89fa2e7..58c64e5cd 100644 --- a/lib/qra/q65/q65.f90 +++ b/lib/qra/q65/q65.f90 @@ -11,7 +11,7 @@ module q65 38,46,50,55,60,62,66,69,74,76,85/) integer codewords(63,206) integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd - integer idfbest,idtbest,ibw,ndistbest,maxiters + integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc integer i0,j0 integer navg(0:1) @@ -437,13 +437,7 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, & ia=max(nfa,100)/df ib=min(nfb,4900)/df - max_drift=0 !Drift units: bins/TxT -! Do we need a GUI control to set max_drift ? -! For now, turn on drift compensation only for submodes 15B amd 60A. - if(nqd.eq.1 .and. iavg.eq.0 .and. ntol.le.100 .and. ntrperiod.eq.60 .and. & - mode_q65.eq.1) max_drift=10 !Q65-60A - if(nqd.eq.1 .and. iavg.eq.0 .and. ntol.le.100 .and. ntrperiod.eq.15 .and. & - mode_q65.eq.4) max_drift=40 !Q65-15C + if(nqd.ne.1 .or. iavg.ne.0 .or. ntol.ge.200) max_drift=0 if(max_drift.ne.0) then ia=nint((nfqso-ntol)/df) ib=nint((nfqso+ntol)/df) diff --git a/map65/commons.h b/map65/commons.h index c94050d55..257c2ac2e 100644 --- a/map65/commons.h +++ b/map65/commons.h @@ -33,6 +33,7 @@ extern struct { //This is "common/datcom/..." in Fortran int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 int nfast; //No longer used int nsave; //Number of s3(64,63) spectra saved + int max_drift; //Maximum Q65 drift: units symbol_rate/TxT char mycall[12]; char mygrid[6]; char hiscall[12]; diff --git a/map65/libm65/decode0.f90 b/map65/libm65/decode0.f90 index 7a9c3d903..23a46d9eb 100644 --- a/map65/libm65/decode0.f90 +++ b/map65/libm65/decode0.f90 @@ -11,7 +11,7 @@ subroutine decode0(dd,ss,savg,nstandalone) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,mycall,mygrid,hiscall,hisgrid,datetime + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime data neme0/-99/,mcall3b/1/ save @@ -50,7 +50,7 @@ subroutine decode0(dd,ss,savg,nstandalone) call timer('map65a ',0) call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) call timer('map65a ',1) diff --git a/map65/libm65/m65.f90 b/map65/libm65/m65.f90 index 9b5a8f3cc..d79ecdcd7 100644 --- a/map65/libm65/m65.f90 +++ b/map65/libm65/m65.f90 @@ -36,11 +36,11 @@ program m65 real*8 fc0,fcenter character*80 arg,infile character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 - common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fc0,nutc0,junk(36) + common/datcom/dd(4,5760000),ss(4,322,NFFT),savg(4,NFFT),fc0,nutc0,junk(37) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,mycall,mygrid,hiscall,hisgrid,datetime + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime nargs=iargc() if(nargs.ne.1 .and. nargs.lt.5) then diff --git a/map65/libm65/m65a.f90 b/map65/libm65/m65a.f90 index e84685591..385254442 100644 --- a/map65/libm65/m65a.f90 +++ b/map65/libm65/m65a.f90 @@ -79,7 +79,7 @@ subroutine m65c(dd,ss,savg,nparams0) common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & - nfast,nsave,mycall,mygrid,hiscall,hisgrid,datetime + nfast,nsave,max_drift,mycall,mygrid,hiscall,hisgrid,datetime equivalence (nparams,fcenter) nparams=nparams0 !Copy parameters into common/npar/ diff --git a/map65/libm65/map65a.f90 b/map65/libm65/map65a.f90 index b68e98b53..091d270d4 100644 --- a/map65/libm65/map65a.f90 +++ b/map65/libm65/map65a.f90 @@ -1,5 +1,5 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & - mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi, & + mousedf,mousefqso,nagain,ndecdone,nfshift,ndphi,max_drift, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, & neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) @@ -370,7 +370,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,idec) + nagain,max_drift,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo @@ -381,7 +381,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,idec) + nagain,max_drift,idec) call timer('q65b ',1) endif endif @@ -418,7 +418,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & call timer('q65b ',0) call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & - nagain,idec) + nagain,max_drift,idec) call timer('q65b ',1) if(idec.ge.0) candec(icand)=.true. enddo ! icand diff --git a/map65/libm65/q65b.f90 b/map65/libm65/q65b.f90 index 9d7537e11..c85e3be3d 100644 --- a/map65/libm65/q65b.f90 +++ b/map65/libm65/q65b.f90 @@ -1,5 +1,5 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & - mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain,idec) + mycall0,hiscall0,hisgrid,mode_q65,f0,fqso,newdat,nagain,max_drift,idec) ! This routine provides an interface between MAP65 and the Q65 decoder ! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. @@ -128,7 +128,7 @@ subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & ! NB: Frequency of ipk is now shifted to 1000 Hz. call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & - newdat,nagain,mycall,hiscall,hisgrid) + newdat,nagain,max_drift,mycall,hiscall,hisgrid) MHz=fcenter freq0=MHz + 0.001*ikhz diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index a1478f91d..e2bb6a8a1 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -398,6 +398,7 @@ void MainWindow::writeSettings() settings.setValue("Cal570",m_cal570); settings.setValue("TxOffset",m_TxOffset); settings.setValue("Colors",m_colors); + settings.setValue("MaxDrift",ui->sbMaxDrift->value()); } //---------------------------------------------------------- readSettings() @@ -483,6 +484,7 @@ void MainWindow::readSettings() ui->actionF4_sets_Tx6->setChecked(m_kb8rq); m_NB=settings.value("NB",false).toBool(); ui->NBcheckBox->setChecked(m_NB); + ui->sbMaxDrift->setValue(settings.value("MaxDrift",0).toInt()); m_NBslider=settings.value("NBslider",40).toInt(); ui->NBslider->setValue(m_NBslider); m_gainx=settings.value("GainX",1.0).toFloat(); @@ -1281,6 +1283,7 @@ void MainWindow::decode() //decode() datcom_.nmode=10*m_modeQ65 + m_modeJT65; datcom_.nfast=1; //No longer used datcom_.nsave=m_nsave; + datcom_.max_drift=ui->sbMaxDrift->value(); QString mcall=(m_myCall+" ").mid(0,12); QString mgrid=(m_myGrid+" ").mid(0,6); diff --git a/map65/mainwindow.ui b/map65/mainwindow.ui index 37b7697a6..b74712bcd 100644 --- a/map65/mainwindow.ui +++ b/map65/mainwindow.ui @@ -574,6 +574,22 @@ p, li { white-space: pre-wrap; } + + + + Qt::AlignCenter + + + Max Drift + + + 50 + + + 5 + + + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 34e9ade5a..33fc871f4 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -212,7 +212,7 @@ namespace // grid exact match excluding RR73 QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"}; auto quint32_max = std::numeric_limits::max (); - constexpr int N_WIDGETS {37}; + constexpr int N_WIDGETS {38}; constexpr int default_rx_audio_buffer_frames {-1}; // lets Qt decide constexpr int default_tx_audio_buffer_frames {-1}; // lets Qt decide @@ -1174,6 +1174,7 @@ void MainWindow::writeSettings() m_settings->setValue("NoOwnCall",ui->cbNoOwnCall->isChecked()); m_settings->setValue ("BandHopping", ui->band_hopping_group_box->isChecked ()); m_settings->setValue ("TRPeriod", ui->sbTR->value ()); + m_settings->setValue ("MaxDrift", ui->sbMaxDrift->value()); m_settings->setValue ("TRPeriod_FST4W", ui->sbTR_FST4W->value ()); m_settings->setValue("FastMode",m_bFastMode); m_settings->setValue("Fast9",m_bFast9); @@ -1260,6 +1261,7 @@ void MainWindow::readSettings() m_bFast9=m_settings->value("Fast9",false).toBool(); m_bFastMode=m_settings->value("FastMode",false).toBool(); ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); + ui->sbMaxDrift->setValue (m_settings->value ("MaxDrift",0).toInt()); ui->sbTR_FST4W->setValue (m_settings->value ("TRPeriod_FST4W", 15).toInt()); m_lastMonitoredFrequency = m_settings->value ("DialFreq", QVariant::fromValue (default_frequency)).value (); @@ -3172,6 +3174,7 @@ void MainWindow::decode() //decode() if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); + dec_data.params.max_drift=ui->sbMaxDrift->value(); ::memcpy(dec_data.params.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime); ::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall); @@ -6058,6 +6061,7 @@ void MainWindow::displayWidgets(qint64 n) } if(i==35) ui->sbF_High->setVisible(b); if(i==36) ui->actionAuto_Clear_Avg->setVisible (b); + if(i==37) ui->sbMaxDrift->setVisible(b); j=j>>1; } ui->pbBestSP->setVisible(m_mode=="FT4"); @@ -6091,11 +6095,11 @@ void MainWindow::on_actionFST4_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); WSPR_config(false); if(m_config.single_decode()) { -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("1111110001001110000100000001000000000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111100010011100001000000010000000000")); m_wideGraph->setSingleDecode(true); } else { - displayWidgets(nWidgets("1110110001001110000100000001000000110")); + displayWidgets(nWidgets("11101100010011100001000000010000001100")); m_wideGraph->setSingleDecode(false); ui->sbFtol->setValue(20); } @@ -6131,8 +6135,8 @@ void MainWindow::on_actionFST4W_triggered() m_FFTSize = m_nsps / 2; Q_EMIT FFTSize(m_FFTSize); WSPR_config(true); -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("0000000000000000010100000000000001000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000101000000000000010000")); setup_status_bar(false); ui->band_hopping_group_box->setChecked(false); ui->band_hopping_group_box->setVisible(false); @@ -6180,7 +6184,8 @@ void MainWindow::on_actionFT4_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); - displayWidgets(nWidgets("1110100001001110000100000001100010000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000000011000100000")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); ui->txrb5->setEnabled(true); @@ -6229,7 +6234,8 @@ void MainWindow::on_actionFT8_triggered() ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); } - displayWidgets(nWidgets("1110100001001110000100001001100010000")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000010011000100000")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); ui->txrb5->setEnabled(true); @@ -6247,7 +6253,8 @@ void MainWindow::on_actionFT8_triggered() ui->cbAutoSeq->setEnabled(false); ui->tabWidget->setCurrentIndex(1); ui->TxFreqSpinBox->setValue(300); - displayWidgets(nWidgets("1110100001001110000100000000001000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011100001000000000010000000")); ui->labDXped->setText(tr ("Fox")); on_fox_log_action_triggered(); } @@ -6257,7 +6264,8 @@ void MainWindow::on_actionFT8_triggered() ui->cbAutoSeq->setEnabled(false); ui->tabWidget->setCurrentIndex(0); ui->cbHoldTxFreq->setChecked(true); - displayWidgets(nWidgets("1110100001001100000100000000001100000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11101000010011000001000000000011000000")); ui->labDXped->setText(tr ("Hound")); ui->txrb1->setChecked(true); ui->txrb2->setEnabled(false); @@ -6332,9 +6340,10 @@ void MainWindow::on_actionJT4_triggered() ui->sbSubmode->setValue(0); } if(bVHF) { - displayWidgets(nWidgets("1111100100101101101111000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111001001011011011110000000000000000")); } else { - displayWidgets(nWidgets("1110100000001100001100000000000000000")); + displayWidgets(nWidgets("11101000000011000011000000000000000000")); } fast_config(false); statusChanged(); @@ -6391,9 +6400,10 @@ void MainWindow::on_actionJT9_triggered() ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); if(bVHF) { - displayWidgets(nWidgets("1111101010001111100100000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111010100011111001000000000000000000")); } else { - displayWidgets(nWidgets("1110100000001110000100000000000010000")); + displayWidgets(nWidgets("11101000000011100001000000000000100000")); } fast_config(m_bFastMode); ui->cbAutoSeq->setVisible(m_bFast9); @@ -6439,9 +6449,10 @@ void MainWindow::on_actionJT65_triggered() ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); } if(bVHF) { - displayWidgets(nWidgets("1111100100001101101011000100000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111001000011011010110001000000000000")); } else { - displayWidgets(nWidgets("1110100000001110000100000000000010000")); + displayWidgets(nWidgets("11101000000011100001000000000000100000")); } fast_config(false); if(ui->cbShMsgs->isChecked()) { @@ -6476,8 +6487,8 @@ void MainWindow::on_actionQ65_triggered() m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value()); m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value()); switch_mode (Modes::Q65); -// 0123456789012345678901234567890123456 - displayWidgets(nWidgets("1111110101101101001110000001000000001")); +// 01234567890123456789012345678901234567 + displayWidgets(nWidgets("11111101011011010011100000010000000011")); ui->labDXped->setText(""); ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); ui->rh_decodes_title_label->setText(tr ("Average Decodes")); @@ -6548,7 +6559,8 @@ void MainWindow::on_actionMSK144_triggered() ui->rptSpinBox->setValue(0); ui->rptSpinBox->setSingleStep(1); ui->sbFtol->values ({20, 50, 100, 200}); - displayWidgets(nWidgets("1011111101000000000100010000100000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("10111111010000000001000100001000000000")); fast_config(m_bFastMode); statusChanged(); @@ -6589,7 +6601,8 @@ void MainWindow::on_actionWSPR_triggered() m_bFastMode=false; m_bFast9=false; ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value()); - displayWidgets(nWidgets("0000000000000000010100000000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000101000000000000000000")); fast_config(false); statusChanged(); } @@ -6622,7 +6635,8 @@ void MainWindow::on_actionEcho_triggered() m_bFast9=false; WSPR_config(true); ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q"); - displayWidgets(nWidgets("0000000000000000000000100000000000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00000000000000000000001000000000000000")); fast_config(false); statusChanged(); } @@ -6648,7 +6662,8 @@ void MainWindow::on_actionFreqCal_triggered() // 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2 ui->lh_decodes_headings_label->setText(" UTC Freq CAL Offset fMeas DF Level S/N"); ui->measure_check_box->setChecked (false); - displayWidgets(nWidgets("0011010000000000000000000000010000000")); + // 01234567890123456789012345678901234567 + displayWidgets(nWidgets("00110100000000000000000000000100000000")); statusChanged(); } diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index 35f64d91b..dd85fbc84 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1677,6 +1677,19 @@ When not checked you can view the calibration results. + + + + Max Drift + + + 50 + + + 5 + + + From 5756031491c523b86a48ac1017d94813d5a0e556 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sun, 30 May 2021 14:40:57 -0400 Subject: [PATCH 2/2] "New in Version 2.5.0" added to the User Guide. --- doc/user_guide/en/new_features.adoc | 34 +++++++++++++++++++---------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index 93a104092..d5fa56193 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -1,15 +1,27 @@ [[NEW_FEATURES]] === New in Version {VERSION} -_WSJT-X 2.4.0_ introduces *Q65*, a new digital protocol designed for -minimal two-way QSOs over especially difficult propagation paths. On -paths with Doppler spread more than a few Hz, the weak-signal -performance of Q65 is the best among all WSJT-X modes. +_WSJT-X 2.5.0_ introduces an enhanced Q65 decoder that measures and +compensates for linear frequency drifts of Q65 signals. Activate this +feature by setting a spinner control *Max Drift* on the _WSJT-X_ main +window to a number greater than 0. We suggest a setting of 10 for +submode Q65-60A, the recommended submode for EME on 50 and 144 MHz, +which will accommodate drift rates up to 20 Hz/minute. Similarly, we +suggest *Max Drift* = 40 for submode Q65-15C, used for for 10 GHz QSOs +(up to 900 km) via aircraft scatter and drift rates up to about 20 +Hz/s. -Q65 uses message formats and sequencing identical to those used in -FST4, FT4, FT8, and MSK144. Submodes are provided with a wide variety -of tone spacings and T/R sequence lengths 15, 30, 60, 120, and 300 s. -A new, highly reliable list-decoding technique is used for messages -that contain previously copied message fragments. Message averaging -is provided for situations where single transmissions are too weak or -signal enhancements too sparse for a signal to be decoded. +On the Windows platform only, _WSJT-X 2.5.0_ installations now include +an early version of _MAP65 3.0_. This program works together with +suitable hardware that converts RF to baseband. The hardware/software +combination implements a wideband, highly optimized receiver for the +Q65 and JT65 protocols, with matching transmitting features that +require a standard SSB transceiver. _MAP65_ is effective in both +single-polarization and dual-polarization systems. If two +polarization channels are available, _MAP65_ determines and matches +the linear polarization angle of each decodable signal. This +capability provides a major advantage for efficient EME communication +on bands up to 432 MHz. A single-channel _MAP65_ system works +extremely well for EME on 1296 MHz and higher bands, displaying all +signals in a 90 kHz sub-band and decoding all the Q65 and JT65 +signals.