Merge branch 'feat-map65-integration' of bitbucket.org:k1jt/wsjtx into feat-map65-integration

This commit is contained in:
Bill Somerville 2021-05-30 20:28:43 +01:00
commit 98d0319134
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
18 changed files with 143 additions and 85 deletions

View File

@ -26,10 +26,9 @@ typedef struct dec_data {
int nutc; //UTC as integer, HHMM int nutc; //UTC as integer, HHMM
bool ndiskdat; //true ==> data read from *.wav file bool ndiskdat; //true ==> data read from *.wav file
int ntrperiod; //TR period (seconds) 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 nfqso; //User-selected QSO freq (kHz)
int nftx; /* Transmit audio offset where int nftx; //TX audio offset where replies might be expected
replies might be expected */
bool newdat; //true ==> new data, must do long FFT bool newdat; //true ==> new data, must do long FFT
int npts8; //npts for c0() array int npts8; //npts for c0() array
int nfa; //Low decode limit (Hz) int nfa; //Low decode limit (Hz)
@ -59,6 +58,7 @@ typedef struct dec_data {
int naggressive; int naggressive;
bool nrobust; bool nrobust;
int nexp_decode; int nexp_decode;
int max_drift;
char datetime[20]; char datetime[20];
char mycall[12]; char mycall[12];
char mygrid[6]; char mygrid[6];

View File

@ -1,34 +1,34 @@
Here are the "displayWidgets()" strings for WSJT-X modes Here are the "displayWidgets()" strings for WSJT-X modes
1 2 3 1 2 3
0123456789012345678901234567890123456 01234567890123456789012345678901234567
------------------------------------------------ -------------------------------------------------
JT4 1110100000001100001100000000000000000 JT4 11101000000011000011000000000000000000
JT4/VHF 1111100100101101101111000000000000000 JT4/VHF 11111001001011011011110000000000000000
JT9 1110100000001110000100000000000010000 JT9 11101000000011100001000000000000100000
JT9/VHF 1111101010001111100100000000000000000 JT9/VHF 11111010100011111001000000000000000000
JT9+JT65 1110100000011110000100000000000010000 JT9+JT65 11101000000111100001000000000000100000
JT65 1110100000001110000100000000000010000 JT65 11101000000011100001000000000000100000
JT65/VHF 1111100100001101101011000100000000000 JT65/VHF 11111001000011011010110001000000000000
Q65 1111110101101101001110000001000000001 Q65 11111101011011010011100000010000000011
ISCAT 1001110000000001100000000000000000000 ISCAT 10011100000000011000000000000000000000
MSK144 1011111101000000000100010000000000000 MSK144 10111111010000000001000100000000000000
WSPR 0000000000000000010100000000000000000 WSPR 00000000000000000101000000000000000000
FST4 1111110001001110000100000001000000110 FST4 11111100010011100001000000010000001100
FST4W 0000000000000000010100000000000001000 FST4W 00000000000000000101000000000000010000
Echo 0000000000000000000000100000000000000 Echo 00000000000000000000001000000000000000
FCal 0011010000000000000000000000010000000 FCal 00110100000000000000000000000100000000
FT8 1110100001001110000100001001100010000 FT8 11101000010011100001000010011000100000
FT8/VHF 1110100001001110000100001001100010000 FT8/VHF 11101000010011100001000010011000100000
FT8/Fox 1110100001001110000100000000001000000 FT8/Fox 11101000010011100001000000000010000000
FT8/Hound 1110100001001110000100000000001100000 FT8/Hound 11101000010011100001000000000011000000
---------------------------------------------- -------------------------------------------------
1 2 3 1 2 3
012345678901234567890123456789012 01234567890123456789012345678901234567
---------------------------------------------- -------------------------------------------------
Mapping of column numbers to widgets Mapping of column numbers to widgets
---------------------------------------------- -------------------------------------------------
0. txFirstCheckbox 0. txFirstCheckbox
1. TxFreqSpinBox 1. TxFreqSpinBox
2. RxFreqSpinBox 2. RxFreqSpinBox
@ -66,3 +66,4 @@ Mapping of column numbers to widgets
34. sbF_Low 34. sbF_Low
35. sbF_High 35. sbF_High
36. AutoClrAvg 36. AutoClrAvg
37. sbMaxDrift

View File

@ -1,15 +1,27 @@
[[NEW_FEATURES]] [[NEW_FEATURES]]
=== New in Version {VERSION} === New in Version {VERSION}
_WSJT-X 2.4.0_ introduces *Q65*, a new digital protocol designed for _WSJT-X 2.5.0_ introduces an enhanced Q65 decoder that measures and
minimal two-way QSOs over especially difficult propagation paths. On compensates for linear frequency drifts of Q65 signals. Activate this
paths with Doppler spread more than a few Hz, the weak-signal feature by setting a spinner control *Max Drift* on the _WSJT-X_ main
performance of Q65 is the best among all WSJT-X modes. 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 On the Windows platform only, _WSJT-X 2.5.0_ installations now include
FST4, FT4, FT8, and MSK144. Submodes are provided with a wide variety an early version of _MAP65 3.0_. This program works together with
of tone spacings and T/R sequence lengths 15, 30, 60, 120, and 300 s. suitable hardware that converts RF to baseband. The hardware/software
A new, highly reliable list-decoding technique is used for messages combination implements a wideband, highly optimized receiver for the
that contain previously copied message fragments. Message averaging Q65 and JT65 protocols, with matching transmitting features that
is provided for situations where single transmissions are too weak or require a standard SSB transceiver. _MAP65_ is effective in both
signal enhancements too sparse for a signal to be decoded. 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.

View File

@ -209,7 +209,7 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, & call my_q65%decode(q65_decoded,id2,nqd,params%nutc,params%ntr, &
params%nsubmode,params%nfqso,params%ntol,params%ndepth, & params%nsubmode,params%nfqso,params%ntol,params%ndepth, &
params%nfa,params%nfb,logical(params%nclearave), & 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, & logical(params%newdat),params%emedelay,mycall,hiscall,hisgrid, &
params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0) params%nQSOProgress,ncontest,logical(params%lapcqonly),navg0)
call timer('dec_q65 ',1) call timer('dec_q65 ',1)

View File

@ -41,6 +41,7 @@
integer(c_int) :: naggressive integer(c_int) :: naggressive
logical(c_bool) :: nrobust logical(c_bool) :: nrobust
integer(c_int) :: nexp_decode integer(c_int) :: nexp_decode
integer(c_int) :: max_drift
character(kind=c_char) :: datetime(20) character(kind=c_char) :: datetime(20)
character(kind=c_char) :: mycall(12) character(kind=c_char) :: mycall(12)
character(kind=c_char) :: mygrid(6) character(kind=c_char) :: mygrid(6)

View File

@ -1,5 +1,5 @@
subroutine map65_mmdec(nutc,id2,nqd,nsubmode,nfa,nfb,nfqso,ntol,newdat, & 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 prog_args
use timer_module, only: timer 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 timer('dec_q65 ',0)
call my_q65%decode(q65_decoded,id2,nqd,nutc,ntrperiod,nsubmode,nfqso, & 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) emedelay,mycall,hiscall,hisgrid,nQSOProgress,ncontest,lapcqonly,navg0)
call timer('dec_q65 ',1) call timer('dec_q65 ',1)

View File

@ -31,8 +31,9 @@ module q65_decode
contains contains
subroutine decode(this,callback,iwave,nqd0,nutc,ntrperiod,nsubmode,nfqso, & subroutine decode(this,callback,iwave,nqd0,nutc,ntrperiod,nsubmode,nfqso, &
ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,lnewdat0, & ntol,ndepth,nfa0,nfb0,lclearave,single_decode,lagain,max_drift0, &
emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest,lapcqonly,navg0) lnewdat0,emedelay,mycall,hiscall,hisgrid,nQSOprogress,ncontest, &
lapcqonly,navg0)
! Top-level routine that organizes the decoding of Q65 signals ! Top-level routine that organizes the decoding of Q65 signals
! Input: iwave Raw data, i*2 ! Input: iwave Raw data, i*2
@ -81,6 +82,7 @@ contains
nfb=nfb0 nfb=nfb0
nqd=nqd0 nqd=nqd0
lnewdat=lnewdat0 lnewdat=lnewdat0
max_drift=max_drift0
idec=-1 idec=-1
idf=0 idf=0
idt=0 idt=0

View File

@ -11,7 +11,7 @@ module q65
38,46,50,55,60,62,66,69,74,76,85/) 38,46,50,55,60,62,66,69,74,76,85/)
integer codewords(63,206) integer codewords(63,206)
integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd 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 istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc
integer i0,j0 integer i0,j0
integer navg(0:1) 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 ia=max(nfa,100)/df
ib=min(nfb,4900)/df ib=min(nfb,4900)/df
max_drift=0 !Drift units: bins/TxT if(nqd.ne.1 .or. iavg.ne.0 .or. ntol.ge.200) max_drift=0
! 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(max_drift.ne.0) then if(max_drift.ne.0) then
ia=nint((nfqso-ntol)/df) ia=nint((nfqso-ntol)/df)
ib=nint((nfqso+ntol)/df) ib=nint((nfqso+ntol)/df)

View File

@ -33,6 +33,7 @@ extern struct { //This is "common/datcom/..." in Fortran
int nmode; //nmode = 10*m_modeQ65 + m_modeJT65 int nmode; //nmode = 10*m_modeQ65 + m_modeJT65
int nfast; //No longer used int nfast; //No longer used
int nsave; //Number of s3(64,63) spectra saved int nsave; //Number of s3(64,63) spectra saved
int max_drift; //Maximum Q65 drift: units symbol_rate/TxT
char mycall[12]; char mycall[12];
char mygrid[6]; char mygrid[6];
char hiscall[12]; char hiscall[12];

View File

@ -11,7 +11,7 @@ subroutine decode0(dd,ss,savg,nstandalone)
common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, &
ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, &
mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & 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/ data neme0/-99/,mcall3b/1/
save save
@ -50,7 +50,7 @@ subroutine decode0(dd,ss,savg,nstandalone)
call timer('map65a ',0) call timer('map65a ',0)
call map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & 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, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, &
neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode)
call timer('map65a ',1) call timer('map65a ',1)

View File

@ -36,11 +36,11 @@ program m65
real*8 fc0,fcenter real*8 fc0,fcenter
character*80 arg,infile character*80 arg,infile
character mycall*12,hiscall*12,mygrid*6,hisgrid*6,datetime*20 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, & common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, &
ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, &
mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & 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() nargs=iargc()
if(nargs.ne.1 .and. nargs.lt.5) then if(nargs.ne.1 .and. nargs.lt.5) then

View File

@ -79,7 +79,7 @@ subroutine m65c(dd,ss,savg,nparams0)
common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, & common/npar/fcenter,nutc,idphi,mousedf,mousefqso,nagain, &
ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, & ndepth,ndiskdat,neme,newdat,nfa,nfb,nfcal,nfshift, &
mcall3,nkeep,ntol,nxant,nrxlog,nfsample,nxpol,nmode, & 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) equivalence (nparams,fcenter)
nparams=nparams0 !Copy parameters into common/npar/ nparams=nparams0 !Copy parameters into common/npar/

View File

@ -1,5 +1,5 @@
subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, & 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, & nfcal,nkeep,mcall3b,nsum,nsave,nxant,mycall,mygrid, &
neme,ndepth,nstandalone,hiscall,hisgrid,nhsym,nfsample,nxpol,nmode) 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 timer('q65b ',0)
call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, &
xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, &
nagain,idec) nagain,max_drift,idec)
call timer('q65b ',1) call timer('q65b ',1)
if(idec.ge.0) candec(icand)=.true. if(idec.ge.0) candec(icand)=.true.
enddo enddo
@ -381,7 +381,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, &
call timer('q65b ',0) call timer('q65b ',0)
call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, &
xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, &
nagain,idec) nagain,max_drift,idec)
call timer('q65b ',1) call timer('q65b ',1)
endif endif
endif endif
@ -418,7 +418,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, &
call timer('q65b ',0) call timer('q65b ',0)
call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, & call q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol, &
xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, & xpol,mycall,hiscall,hisgrid,mode_q65,f0,fqso,newdat, &
nagain,idec) nagain,max_drift,idec)
call timer('q65b ',1) call timer('q65b ',1)
if(idec.ge.0) candec(icand)=.true. if(idec.ge.0) candec(icand)=.true.
enddo ! icand enddo ! icand

View File

@ -1,5 +1,5 @@
subroutine q65b(nutc,nqd,fcenter,nfcal,nfsample,ikhz,mousedf,ntol,xpol, & 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 ! This routine provides an interface between MAP65 and the Q65 decoder
! in WSJT-X. All arguments are input data obtained from the MAP65 GUI. ! 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. ! NB: Frequency of ipk is now shifted to 1000 Hz.
call map65_mmdec(nutc,iwave,nqd,nsubmode,nfa,nfb,1000,ntol, & 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 MHz=fcenter
freq0=MHz + 0.001*ikhz freq0=MHz + 0.001*ikhz

View File

@ -399,6 +399,7 @@ void MainWindow::writeSettings()
settings.setValue("Cal570",m_cal570); settings.setValue("Cal570",m_cal570);
settings.setValue("TxOffset",m_TxOffset); settings.setValue("TxOffset",m_TxOffset);
settings.setValue("Colors",m_colors); settings.setValue("Colors",m_colors);
settings.setValue("MaxDrift",ui->sbMaxDrift->value());
} }
//---------------------------------------------------------- readSettings() //---------------------------------------------------------- readSettings()
@ -484,6 +485,7 @@ void MainWindow::readSettings()
ui->actionF4_sets_Tx6->setChecked(m_kb8rq); ui->actionF4_sets_Tx6->setChecked(m_kb8rq);
m_NB=settings.value("NB",false).toBool(); m_NB=settings.value("NB",false).toBool();
ui->NBcheckBox->setChecked(m_NB); ui->NBcheckBox->setChecked(m_NB);
ui->sbMaxDrift->setValue(settings.value("MaxDrift",0).toInt());
m_NBslider=settings.value("NBslider",40).toInt(); m_NBslider=settings.value("NBslider",40).toInt();
ui->NBslider->setValue(m_NBslider); ui->NBslider->setValue(m_NBslider);
m_gainx=settings.value("GainX",1.0).toFloat(); m_gainx=settings.value("GainX",1.0).toFloat();
@ -1282,6 +1284,7 @@ void MainWindow::decode() //decode()
datcom_.nmode=10*m_modeQ65 + m_modeJT65; datcom_.nmode=10*m_modeQ65 + m_modeJT65;
datcom_.nfast=1; //No longer used datcom_.nfast=1; //No longer used
datcom_.nsave=m_nsave; datcom_.nsave=m_nsave;
datcom_.max_drift=ui->sbMaxDrift->value();
QString mcall=(m_myCall+" ").mid(0,12); QString mcall=(m_myCall+" ").mid(0,12);
QString mgrid=(m_myGrid+" ").mid(0,6); QString mgrid=(m_myGrid+" ").mid(0,6);

View File

@ -574,6 +574,22 @@ p, li { white-space: pre-wrap; }
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QSpinBox" name="sbMaxDrift">
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="prefix">
<string>Max Drift </string>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">

View File

@ -212,7 +212,7 @@ namespace
// grid exact match excluding RR73 // 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"}; 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<quint32>::max (); auto quint32_max = std::numeric_limits<quint32>::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_rx_audio_buffer_frames {-1}; // lets Qt decide
constexpr int default_tx_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("NoOwnCall",ui->cbNoOwnCall->isChecked());
m_settings->setValue ("BandHopping", ui->band_hopping_group_box->isChecked ()); m_settings->setValue ("BandHopping", ui->band_hopping_group_box->isChecked ());
m_settings->setValue ("TRPeriod", ui->sbTR->value ()); 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 ("TRPeriod_FST4W", ui->sbTR_FST4W->value ());
m_settings->setValue("FastMode",m_bFastMode); m_settings->setValue("FastMode",m_bFastMode);
m_settings->setValue("Fast9",m_bFast9); m_settings->setValue("Fast9",m_bFast9);
@ -1260,6 +1261,7 @@ void MainWindow::readSettings()
m_bFast9=m_settings->value("Fast9",false).toBool(); m_bFast9=m_settings->value("Fast9",false).toBool();
m_bFastMode=m_settings->value("FastMode",false).toBool(); m_bFastMode=m_settings->value("FastMode",false).toBool();
ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); 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()); ui->sbTR_FST4W->setValue (m_settings->value ("TRPeriod_FST4W", 15).toInt());
m_lastMonitoredFrequency = m_settings->value ("DialFreq", m_lastMonitoredFrequency = m_settings->value ("DialFreq",
QVariant::fromValue<Frequency> (default_frequency)).value<Frequency> (); QVariant::fromValue<Frequency> (default_frequency)).value<Frequency> ();
@ -3172,6 +3174,7 @@ void MainWindow::decode() //decode()
if(m_config.single_decode()) dec_data.params.nexp_decode += 32; 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_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); 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.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime);
::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall); ::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==35) ui->sbF_High->setVisible(b);
if(i==36) ui->actionAuto_Clear_Avg->setVisible (b); if(i==36) ui->actionAuto_Clear_Avg->setVisible (b);
if(i==37) ui->sbMaxDrift->setVisible(b);
j=j>>1; j=j>>1;
} }
ui->pbBestSP->setVisible(m_mode=="FT4"); ui->pbBestSP->setVisible(m_mode=="FT4");
@ -6091,11 +6095,11 @@ void MainWindow::on_actionFST4_triggered()
ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
WSPR_config(false); WSPR_config(false);
if(m_config.single_decode()) { if(m_config.single_decode()) {
// 0123456789012345678901234567890123456 // 01234567890123456789012345678901234567
displayWidgets(nWidgets("1111110001001110000100000001000000000")); displayWidgets(nWidgets("11111100010011100001000000010000000000"));
m_wideGraph->setSingleDecode(true); m_wideGraph->setSingleDecode(true);
} else { } else {
displayWidgets(nWidgets("1110110001001110000100000001000000110")); displayWidgets(nWidgets("11101100010011100001000000010000001100"));
m_wideGraph->setSingleDecode(false); m_wideGraph->setSingleDecode(false);
ui->sbFtol->setValue(20); ui->sbFtol->setValue(20);
} }
@ -6131,8 +6135,8 @@ void MainWindow::on_actionFST4W_triggered()
m_FFTSize = m_nsps / 2; m_FFTSize = m_nsps / 2;
Q_EMIT FFTSize(m_FFTSize); Q_EMIT FFTSize(m_FFTSize);
WSPR_config(true); WSPR_config(true);
// 0123456789012345678901234567890123456 // 01234567890123456789012345678901234567
displayWidgets(nWidgets("0000000000000000010100000000000001000")); displayWidgets(nWidgets("00000000000000000101000000000000010000"));
setup_status_bar(false); setup_status_bar(false);
ui->band_hopping_group_box->setChecked(false); ui->band_hopping_group_box->setChecked(false);
ui->band_hopping_group_box->setVisible(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->rh_decodes_title_label->setText(tr ("Rx Frequency"));
ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message"));
displayWidgets(nWidgets("1110100001001110000100000001100010000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11101000010011100001000000011000100000"));
ui->txrb2->setEnabled(true); ui->txrb2->setEnabled(true);
ui->txrb4->setEnabled(true); ui->txrb4->setEnabled(true);
ui->txrb5->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_title_label->setText(tr ("Band Activity"));
ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message"));
} }
displayWidgets(nWidgets("1110100001001110000100001001100010000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11101000010011100001000010011000100000"));
ui->txrb2->setEnabled(true); ui->txrb2->setEnabled(true);
ui->txrb4->setEnabled(true); ui->txrb4->setEnabled(true);
ui->txrb5->setEnabled(true); ui->txrb5->setEnabled(true);
@ -6247,7 +6253,8 @@ void MainWindow::on_actionFT8_triggered()
ui->cbAutoSeq->setEnabled(false); ui->cbAutoSeq->setEnabled(false);
ui->tabWidget->setCurrentIndex(1); ui->tabWidget->setCurrentIndex(1);
ui->TxFreqSpinBox->setValue(300); ui->TxFreqSpinBox->setValue(300);
displayWidgets(nWidgets("1110100001001110000100000000001000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11101000010011100001000000000010000000"));
ui->labDXped->setText(tr ("Fox")); ui->labDXped->setText(tr ("Fox"));
on_fox_log_action_triggered(); on_fox_log_action_triggered();
} }
@ -6257,7 +6264,8 @@ void MainWindow::on_actionFT8_triggered()
ui->cbAutoSeq->setEnabled(false); ui->cbAutoSeq->setEnabled(false);
ui->tabWidget->setCurrentIndex(0); ui->tabWidget->setCurrentIndex(0);
ui->cbHoldTxFreq->setChecked(true); ui->cbHoldTxFreq->setChecked(true);
displayWidgets(nWidgets("1110100001001100000100000000001100000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11101000010011000001000000000011000000"));
ui->labDXped->setText(tr ("Hound")); ui->labDXped->setText(tr ("Hound"));
ui->txrb1->setChecked(true); ui->txrb1->setChecked(true);
ui->txrb2->setEnabled(false); ui->txrb2->setEnabled(false);
@ -6332,9 +6340,10 @@ void MainWindow::on_actionJT4_triggered()
ui->sbSubmode->setValue(0); ui->sbSubmode->setValue(0);
} }
if(bVHF) { if(bVHF) {
displayWidgets(nWidgets("1111100100101101101111000000000000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11111001001011011011110000000000000000"));
} else { } else {
displayWidgets(nWidgets("1110100000001100001100000000000000000")); displayWidgets(nWidgets("11101000000011000011000000000000000000"));
} }
fast_config(false); fast_config(false);
statusChanged(); statusChanged();
@ -6391,9 +6400,10 @@ void MainWindow::on_actionJT9_triggered()
ui->lh_decodes_title_label->setText(tr ("Band Activity")); ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
if(bVHF) { if(bVHF) {
displayWidgets(nWidgets("1111101010001111100100000000000000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11111010100011111001000000000000000000"));
} else { } else {
displayWidgets(nWidgets("1110100000001110000100000000000010000")); displayWidgets(nWidgets("11101000000011100001000000000000100000"));
} }
fast_config(m_bFastMode); fast_config(m_bFastMode);
ui->cbAutoSeq->setVisible(m_bFast9); ui->cbAutoSeq->setVisible(m_bFast9);
@ -6439,9 +6449,10 @@ void MainWindow::on_actionJT65_triggered()
ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
} }
if(bVHF) { if(bVHF) {
displayWidgets(nWidgets("1111100100001101101011000100000000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("11111001000011011010110001000000000000"));
} else { } else {
displayWidgets(nWidgets("1110100000001110000100000000000010000")); displayWidgets(nWidgets("11101000000011100001000000000000100000"));
} }
fast_config(false); fast_config(false);
if(ui->cbShMsgs->isChecked()) { if(ui->cbShMsgs->isChecked()) {
@ -6476,8 +6487,8 @@ void MainWindow::on_actionQ65_triggered()
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value()); m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value()); m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value());
switch_mode (Modes::Q65); switch_mode (Modes::Q65);
// 0123456789012345678901234567890123456 // 01234567890123456789012345678901234567
displayWidgets(nWidgets("1111110101101101001110000001000000001")); displayWidgets(nWidgets("11111101011011010011100000010000000011"));
ui->labDXped->setText(""); ui->labDXped->setText("");
ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes"));
ui->rh_decodes_title_label->setText(tr ("Average 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->setValue(0);
ui->rptSpinBox->setSingleStep(1); ui->rptSpinBox->setSingleStep(1);
ui->sbFtol->values ({20, 50, 100, 200}); ui->sbFtol->values ({20, 50, 100, 200});
displayWidgets(nWidgets("1011111101000000000100010000100000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("10111111010000000001000100001000000000"));
fast_config(m_bFastMode); fast_config(m_bFastMode);
statusChanged(); statusChanged();
@ -6589,7 +6601,8 @@ void MainWindow::on_actionWSPR_triggered()
m_bFastMode=false; m_bFastMode=false;
m_bFast9=false; m_bFast9=false;
ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value()); ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value());
displayWidgets(nWidgets("0000000000000000010100000000000000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("00000000000000000101000000000000000000"));
fast_config(false); fast_config(false);
statusChanged(); statusChanged();
} }
@ -6622,7 +6635,8 @@ void MainWindow::on_actionEcho_triggered()
m_bFast9=false; m_bFast9=false;
WSPR_config(true); WSPR_config(true);
ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q"); ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q");
displayWidgets(nWidgets("0000000000000000000000100000000000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("00000000000000000000001000000000000000"));
fast_config(false); fast_config(false);
statusChanged(); statusChanged();
} }
@ -6648,7 +6662,8 @@ void MainWindow::on_actionFreqCal_triggered()
// 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2 // 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->lh_decodes_headings_label->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
ui->measure_check_box->setChecked (false); ui->measure_check_box->setChecked (false);
displayWidgets(nWidgets("0011010000000000000000000000010000000")); // 01234567890123456789012345678901234567
displayWidgets(nWidgets("00110100000000000000000000000100000000"));
statusChanged(); statusChanged();
} }

View File

@ -1677,6 +1677,19 @@ When not checked you can view the calibration results.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QSpinBox" name="sbMaxDrift">
<property name="prefix">
<string>Max Drift </string>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>5</number>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer_6"> <spacer name="verticalSpacer_6">
<property name="orientation"> <property name="orientation">