Several enhancements to DXpedition mode:

1. Insert dummy report when Hound is called by complex-callsign Fox.
2. Allow Fox to transmit anywhere between 300 and 900 Hz.
3. Restrict randomized Hound freq to the range 1000 - 3000 Hz.
4. Suppress Fox signals that would be duplicates.


git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8376 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2017-12-27 21:06:57 +00:00
parent 6ebf71e4e0
commit d1be2506a9
6 changed files with 22 additions and 13 deletions

View File

@ -83,6 +83,7 @@ extern struct {
extern struct { extern struct {
float wave[606720]; float wave[606720];
int nslots; int nslots;
int nfreq;
int i3bit[5]; int i3bit[5];
char cmsg[5][40]; char cmsg[5][40];
char mycall[12]; char mycall[12];

View File

@ -1,4 +1,4 @@
subroutine foxfilt(nslots,width,wave) subroutine foxfilt(nslots,nfreq,width,wave)
parameter (NN=79,ND=58,KK=87,NSPS=4*1920) parameter (NN=79,ND=58,KK=87,NSPS=4*1920)
parameter (NWAVE=NN*NSPS,NFFT=614400,NH=NFFT/2) parameter (NWAVE=NN*NSPS,NFFT=614400,NH=NFFT/2)
@ -11,8 +11,8 @@ subroutine foxfilt(nslots,width,wave)
x(NWAVE+1:)=0. x(NWAVE+1:)=0.
call four2a(x,NFFT,1,-1,0) !r2c call four2a(x,NFFT,1,-1,0) !r2c
df=48000.0/NFFT df=48000.0/NFFT
fa=1800.0 - 0.5*6.25 fa=nfreq - 0.5*6.25
fb=1800.0 + 7.5*6.25 + (nslots-1)*60.0 fb=nfreq + 7.5*6.25 + (nslots-1)*60.0
ia2=nint(fa/df) ia2=nint(fa/df)
ib1=nint(fb/df) ib1=nint(fb/df)
ia1=nint(ia2-width/df) ia1=nint(ia2-width/df)

View File

@ -31,7 +31,7 @@ subroutine foxgen()
real x(NFFT) real x(NFFT)
real*8 dt,twopi,f0,fstep,dfreq,phi,dphi real*8 dt,twopi,f0,fstep,dfreq,phi,dphi
complex cx(0:NH) complex cx(0:NH)
common/foxcom/wave(NWAVE),nslots,i3bit(5),cmsg(5),mycall(12) common/foxcom/wave(NWAVE),nslots,nfreq,i3bit(5),cmsg(5),mycall(12)
common/foxcom2/itone2(NN),msgbits2(KK) common/foxcom2/itone2(NN),msgbits2(KK)
equivalence (x,cx),(y,cy) equivalence (x,cx),(y,cy)
data icos7/2,5,6,0,4,1,3/ !Costas 7x7 tone pattern data icos7/2,5,6,0,4,1,3/ !Costas 7x7 tone pattern
@ -95,8 +95,7 @@ subroutine foxgen()
! Make copies of itone() and msgbits() for ft8sim ! Make copies of itone() and msgbits() for ft8sim
itone2=itone itone2=itone
msgbits2=msgbits msgbits2=msgbits
f0=nfreq + fstep*(n-1)
f0=1800.d0 + fstep*(n-1)
phi=0.d0 phi=0.d0
k=0 k=0
do j=1,NN do j=1,NN
@ -128,7 +127,7 @@ subroutine foxgen()
! call plotspec(2,wave) !Plot the spectrum ! call plotspec(2,wave) !Plot the spectrum
width=50.0 width=50.0
call foxfilt(nslots,width,wave) call foxfilt(nslots,nfreq,width,wave)
peak3=maxval(abs(wave)) peak3=maxval(abs(wave))
wave=wave/peak3 wave=wave/peak3

View File

@ -7,10 +7,11 @@ subroutine foxgen_wrap(msg40,msgbits,itone)
character*12 mycall12 character*12 mycall12
integer*1 msgbits(KK),msgbits2 integer*1 msgbits(KK),msgbits2
integer itone(NN) integer itone(NN)
common/foxcom/wave(NWAVE),nslots,i3bit(5),cmsg(5),mycall12 common/foxcom/wave(NWAVE),nslots,nfreq,i3bit(5),cmsg(5),mycall12
common/foxcom2/itone2(NN),msgbits2(KK) common/foxcom2/itone2(NN),msgbits2(KK)
nslots=1 nslots=1
nfreq=300
i1=index(msg40,'<') i1=index(msg40,'<')
i2=index(msg40,'>') i2=index(msg40,'>')
mycall12=msg40(i1+1:i2-1)//' ' mycall12=msg40(i1+1:i2-1)//' '

View File

@ -2941,6 +2941,7 @@ void MainWindow::readFromStdout() //readFromStdout
} }
} else { } else {
QStringList w=decodedtext.string().mid(24).split(" ",QString::SkipEmptyParts); QStringList w=decodedtext.string().mid(24).split(" ",QString::SkipEmptyParts);
if(decodedtext.string().contains("/")) w.append(" +00"); //Add a dummy report
if(w.size()==3) { if(w.size()==3) {
QString foxCall=w.at(1); QString foxCall=w.at(1);
if(w.at(0)==m_config.my_callsign()) { if(w.at(0)==m_config.my_callsign()) {
@ -3243,12 +3244,12 @@ void MainWindow::guiUpdate()
icw[0]=m_ncw; icw[0]=m_ncw;
g_iptt = 1; g_iptt = 1;
setRig (); setRig ();
if(m_mode=="FT8" and m_config.bFox() and ui->TxFreqSpinBox->value() > 999) { if(m_mode=="FT8" and m_config.bFox() and ui->TxFreqSpinBox->value() > 900) {
ui->TxFreqSpinBox->setValue(300); ui->TxFreqSpinBox->setValue(300);
} }
if(m_mode=="FT8" and m_config.bHound() and (ui->TxFreqSpinBox->value() < 999) and if(m_mode=="FT8" and m_config.bHound() and (ui->TxFreqSpinBox->value() < 999) and
m_ntx != 3) { m_ntx != 3) {
int nf = (qrand() % 3000) + 1000; int nf = (qrand() % 2000) + 1000; // Hound randomized range: 1000-3000 Hz
ui->TxFreqSpinBox->setValue(nf); ui->TxFreqSpinBox->setValue(nf);
} }
setXIT (ui->TxFreqSpinBox->value ()); setXIT (ui->TxFreqSpinBox->value ());
@ -3303,6 +3304,10 @@ void MainWindow::guiUpdate()
} }
ba=msg2.toLatin1(); ba=msg2.toLatin1();
} else { } else {
if(m_config.bHound() and m_ntx!=3) { //Hound transmits only Tx1 or Tx3
m_ntx=1;
ui->txrb1->setChecked(true);
}
if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit(); if(m_ntx == 1) ba=ui->tx1->text().toLocal8Bit();
if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit(); if(m_ntx == 2) ba=ui->tx2->text().toLocal8Bit();
if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit(); if(m_ntx == 3) ba=ui->tx3->text().toLocal8Bit();
@ -7427,9 +7432,11 @@ void MainWindow::foxTxSequencer()
fm = hc1 + " " + m_config.my_callsign(); //Tx msg fm = hc1 + " " + m_config.my_callsign(); //Tx msg
m_fullFoxCallTime=now; m_fullFoxCallTime=now;
} }
if(islot>0 and fm==m_fm0) break; //Suppress duplicate Fox signals
islot++; islot++;
//Generate tx waveform //Generate tx waveform
foxGenWaveform(islot-1,fm); foxGenWaveform(islot-1,fm);
m_fm0=fm;
if(islot >= m_Nslots) goto Transmit; if(islot >= m_Nslots) goto Transmit;
} }
@ -7467,6 +7474,8 @@ void MainWindow::foxTxSequencer()
Transmit: Transmit:
foxcom_.nslots=islot; foxcom_.nslots=islot;
foxcom_.nfreq=ui->TxFreqSpinBox->value();
if(m_config.split_mode()) foxcom_.nfreq = foxcom_.nfreq + 1500; //Fox Tx freq
QString foxCall=m_config.my_callsign() + " "; QString foxCall=m_config.my_callsign() + " ";
strncpy(&foxcom_.mycall[0], foxCall.toLatin1(),12); //Copy Fox callsign into foxcom_ strncpy(&foxcom_.mycall[0], foxCall.toLatin1(),12); //Copy Fox callsign into foxcom_
foxgen_(); foxgen_();
@ -7531,12 +7540,10 @@ void MainWindow::foxGenWaveform(int i,QString fm)
QString txModeArg; QString txModeArg;
txModeArg.sprintf("FT8fox %d",i+1); txModeArg.sprintf("FT8fox %d",i+1);
ui->decodedTextBrowser2->displayTransmittedText(fm.trimmed(), txModeArg, ui->decodedTextBrowser2->displayTransmittedText(fm.trimmed(), txModeArg,
300+60*i,m_config.color_TxMsg(),m_bFastMode); ui->TxFreqSpinBox->value()+60*i,m_config.color_TxMsg(),m_bFastMode);
foxcom_.i3bit[i]=0; foxcom_.i3bit[i]=0;
if(fm.indexOf("<")>0) foxcom_.i3bit[i]=1; if(fm.indexOf("<")>0) foxcom_.i3bit[i]=1;
strncpy(&foxcom_.cmsg[i][0],fm.toLatin1(),40); //Copy this message into cmsg[i] strncpy(&foxcom_.cmsg[i][0],fm.toLatin1(),40); //Copy this message into cmsg[i]
// qDebug() << "Fox Transmitting:" << i << fm.trimmed();
writeFoxQSO(" Tx: " + fm.trimmed()); writeFoxQSO(" Tx: " + fm.trimmed());
} }

View File

@ -565,6 +565,7 @@ private:
QString m_CQtype; QString m_CQtype;
QString m_opCall; QString m_opCall;
QString m_houndCallers; //Sorted list of Hound callers QString m_houndCallers; //Sorted list of Hound callers
QString m_fm0;
QSet<QString> m_pfx; QSet<QString> m_pfx;
QSet<QString> m_sfx; QSet<QString> m_sfx;