This commit is contained in:
Brian Moran 2024-08-18 19:56:45 -07:00
commit 764c64a829
13 changed files with 80 additions and 20 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 6) set_build_type (RC 7)
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}")
# #

View File

@ -21,6 +21,7 @@ FT8 11101000010011100001000010011000100000
FT8/VHF 11101000010011100001000010011000100000 FT8/VHF 11101000010011100001000010011000100000
FT8/Fox 11101000010011100001000000000010000000 FT8/Fox 11101000010011100001000000000010000000
FT8/Hound 11101000010011100001000000000011000000 FT8/Hound 11101000010011100001000000000011000000
FT8/SupHou 11111000010011100001000000000011000000
------------------------------------------------- -------------------------------------------------
1 2 3 1 2 3
01234567890123456789012345678901234567 01234567890123456789012345678901234567

View File

@ -53,6 +53,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
character(len=12) :: mycall, hiscall character(len=12) :: mycall, hiscall
character(len=6) :: mygrid, hisgrid character(len=6) :: mygrid, hisgrid
character*60 line character*60 line
character*256 cmnd,cmndmsg
character*6 crxfreq,cftol
data ndec8/0/,ntr0/-1/ data ndec8/0/,ntr0/-1/
save save
type(counting_jt4_decoder) :: my_jt4 type(counting_jt4_decoder) :: my_jt4
@ -146,7 +148,12 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
access='stream') access='stream')
write(47) params%yymmdd,params%nutc,id2(1:20),id2(1:180000) write(47) params%yymmdd,params%nutc,id2(1:20),id2(1:180000)
close(47) close(47)
call execute_command_line(trim(exe_dir)//'/sfrx OTP '//'"'//trim(temp_dir)//'/fort.47"') write(crxfreq,'(i6)') params%nfqso
write(cftol,'(i5)') params%ntol
cmnd=trim(exe_dir)//'/sfrx'//crxfreq//cftol// 'OTP "' // &
trim(temp_dir)//'/fort.47"'
call execute_command_line(trim(cmnd),exitstat=nexitstat, &
cmdstat=ncmdstat,cmdmsg=cmndmsg)
else else
call timer('decft8 ',0) call timer('decft8 ',0)
newdat=params%newdat newdat=params%newdat

View File

@ -26,8 +26,8 @@ program ft4code
'LDPC(174,91) encoding,' 'LDPC(174,91) encoding,'
print*,'bit and symbol ordering, and other details of the FT4 protocol.' print*,'bit and symbol ordering, and other details of the FT4 protocol.'
print* print*
print*,'Usage: ft4code [-c grid] "message" # Results for specified message' print*,'Usage: ft4code "message" # Results for specified message'
print*,' ft4code -t # Examples of all message types' print*,' ft4code -t # Examples of all message types'
go to 999 go to 999
endif endif

View File

@ -23,9 +23,9 @@ program ft8code
'LDPC(174,91) encoding,' 'LDPC(174,91) encoding,'
print*,'bit and symbol ordering, and other details of the FT8 protocol.' print*,'bit and symbol ordering, and other details of the FT8 protocol.'
print* print*
print*,'Usage: ft8code [-c grid] "message" # Results for specified message' print*,'Usage: ft8code "message" # Results for specified message'
print*,' ft8code -T # Examples of all message types' print*,' ft8code -T # Examples of all message types'
print*,' ft8code -t # Short format examples' print*,' ft8code -t # Short format examples'
go to 999 go to 999
endif endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1372,6 +1372,9 @@ void MainWindow::readSettings()
ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt());
QTimer::singleShot (50, [=] {blocked = false;}); QTimer::singleShot (50, [=] {blocked = false;});
} }
if (m_mode=="FT8") {
ui->sbFtol->setValue (m_settings->value("Ftol_SF", 50).toInt());
}
if (m_mode=="Q65") { if (m_mode=="Q65") {
m_nSubMode=m_settings->value("SubMode_Q65",0).toInt(); m_nSubMode=m_settings->value("SubMode_Q65",0).toInt();
ui->sbSubmode->setValue(m_nSubMode_Q65); ui->sbSubmode->setValue(m_nSubMode_Q65);
@ -2162,6 +2165,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
set_mode(m_mode); set_mode(m_mode);
configActiveStations(); configActiveStations();
} }
if(m_mode=="FT8") on_actionFT8_triggered(); //in case we need to reset some things for Fox/Hound
} }
void MainWindow::on_monitorButton_clicked (bool checked) void MainWindow::on_monitorButton_clicked (bool checked)
@ -7373,6 +7377,7 @@ void MainWindow::on_actionFT8_triggered()
VHF_features_enabled(bVHF); VHF_features_enabled(bVHF);
ui->cbAutoSeq->setChecked(true); ui->cbAutoSeq->setChecked(true);
m_TRperiod=15.0; m_TRperiod=15.0;
ui->sbFtol->setValue (m_settings->value ("Ftol_SF", 50).toInt()); // restore last used Ftol parameter
m_fastGraph->hide(); m_fastGraph->hide();
m_wideGraph->show(); m_wideGraph->show();
ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message")); ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message"));
@ -7405,8 +7410,10 @@ void MainWindow::on_actionFT8_triggered()
ui->cbHoldTxFreq->setChecked(true); ui->cbHoldTxFreq->setChecked(true);
ui->cbAutoSeq->setEnabled(false); ui->cbAutoSeq->setEnabled(false);
ui->tabWidget->setCurrentIndex(1); ui->tabWidget->setCurrentIndex(1);
m_wideGraph->setSuperFox(false);
if(m_config.superFox()) { if(m_config.superFox()) {
ui->TxFreqSpinBox->setValue(750); //SuperFox transmits at 750 Hz ui->TxFreqSpinBox->setValue(750); //SuperFox transmits at 750 Hz
m_wideGraph->setSuperFox(true);
} else { } else {
ui->TxFreqSpinBox->setValue(500); ui->TxFreqSpinBox->setValue(500);
} }
@ -7428,15 +7435,21 @@ 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);
// 01234567890123456789012345678901234567 m_wideGraph->setSuperHound(false);
displayWidgets(nWidgets("11101000010011000001000000000011000000"));
ui->cbRxAll->setText(tr("Rx All Freqs"));
if(m_config.superFox()) { if(m_config.superFox()) {
// 01234567890123456789012345678901234567
displayWidgets(nWidgets("11111000010011000001000000000011000000"));
ui->labDXped->setText(tr ("Super Hound")); ui->labDXped->setText(tr ("Super Hound"));
ui->cbRxAll->setEnabled(false); ui->cbRxAll->setEnabled(false);
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTol(ui->sbFtol->value());
m_wideGraph->setSuperHound(true);
} else { } else {
// 01234567890123456789012345678901234567
displayWidgets(nWidgets("11101000010011000001000000000011000000"));
ui->labDXped->setText(tr ("Hound")); ui->labDXped->setText(tr ("Hound"));
ui->cbRxAll->setEnabled(true); ui->cbRxAll->setEnabled(true);
m_wideGraph->setSuperHound(false);
} }
ui->txrb1->setChecked(true); ui->txrb1->setChecked(true);
ui->txrb2->setEnabled(false); ui->txrb2->setEnabled(false);
@ -7453,6 +7466,7 @@ void MainWindow::on_actionFT8_triggered()
} }
if(m_specOp != SpecOp::HOUND) { if(m_specOp != SpecOp::HOUND) {
ui->houndButton->setChecked(false); ui->houndButton->setChecked(false);
m_wideGraph->setSuperHound(false);
} }
m_specOp=m_config.special_op_id(); m_specOp=m_config.special_op_id();
@ -8925,6 +8939,7 @@ void MainWindow::on_sbFtol_valueChanged(int value)
statusUpdate (); statusUpdate ();
// save last used parameters // save last used parameters
QTimer::singleShot (200, [=] { QTimer::singleShot (200, [=] {
if (m_mode=="FT8") m_settings->setValue ("Ftol_SF", ui->sbFtol->value());
if (m_mode=="Q65") m_settings->setValue ("Ftol_Q65", ui->sbFtol->value()); if (m_mode=="Q65") m_settings->setValue ("Ftol_Q65", ui->sbFtol->value());
if (m_mode=="MSK144") m_settings->setValue ("Ftol_MSK144", ui->sbFtol->value()); if (m_mode=="MSK144") m_settings->setValue ("Ftol_MSK144", ui->sbFtol->value());
if (m_mode=="JT65") m_settings->setValue ("Ftol_JT65", ui->sbFtol->value ()); if (m_mode=="JT65") m_settings->setValue ("Ftol_JT65", ui->sbFtol->value ());
@ -10208,7 +10223,11 @@ QString MainWindow::sortHoundCalls(QString t, int isort, int max_dB)
else else
i=isort; // part of the line that we want i=isort; // part of the line that we want
t1=map[a].split(" ",SkipEmptyParts).at(i); t1=map[a].split(" ",SkipEmptyParts).at(i);
n=1000*(t1.toInt()+100) + j; // pack (snr or dist or age) and index j into n int isort_value = t1.toInt();
if (isort==5) { // sort by age ascending
isort_value = (100 < isort_value ? 100 : 100-isort_value);
}
n=1000*(isort_value+100) + j; // pack (snr or dist or age) and index j into n
list.insert(j,n); // add n to list at [j] list.insert(j,n); // add n to list at [j]
} }
if (isort == 6) { // sort by continent if (isort == 6) { // sort by continent
@ -10295,7 +10314,7 @@ void MainWindow::selectHound(QString line, bool bTopQueue)
* The line may be selected by double-clicking; alternatively, hitting * The line may be selected by double-clicking; alternatively, hitting
* <Enter> is equivalent to double-clicking on the top-most line. * <Enter> is equivalent to double-clicking on the top-most line.
*/ */
if(line.length()==0) return; if(line.simplified().isEmpty()) return;
if(line.length() < 6) return; if(line.length() < 6) return;
QString houndCall=line.split(" ",SkipEmptyParts).at(0); QString houndCall=line.split(" ",SkipEmptyParts).at(0);
@ -10479,7 +10498,7 @@ void MainWindow::foxTxSequencer()
QString t,rpt; QString t,rpt;
qint32 islot=0; qint32 islot=0;
qint32 n1,n2,n3; qint32 n1,n2,n3;
int nMaxRemainingSlots=0;
m_tFoxTx++; //Increment Fox Tx cycle counter m_tFoxTx++; //Increment Fox Tx cycle counter
//Is it time for a stand-alone CQ? //Is it time for a stand-alone CQ?
@ -10531,13 +10550,15 @@ void MainWindow::foxTxSequencer()
list1Done: list1Done:
//Compile list2: Up to Nslots Hound calls to be sent a report. //Compile list2: Up to Nslots Hound calls to be sent a report.
// For Superfox, up to 5 RR73, but only 4 callsigns with reports. m_NSlots should be 5 for SF.
nMaxRemainingSlots = (m_config.superFox()) ? m_Nslots - 1 : m_Nslots;
for(int i=0; i<m_foxQSOinProgress.count(); i++) { for(int i=0; i<m_foxQSOinProgress.count(); i++) {
//First do those for QSOs in progress //First do those for QSOs in progress
hc=m_foxQSOinProgress.at(i); hc=m_foxQSOinProgress.at(i);
if((m_foxQSO[hc].tFoxRrpt < 0) and (m_foxQSO[hc].ncall < m_maxStrikes)) { if((m_foxQSO[hc].tFoxRrpt < 0) and (m_foxQSO[hc].ncall < m_maxStrikes)) {
//Sent him a report and have not received R+rpt: call him again //Sent him a report and have not received R+rpt: call him again
list2 << hc; //Add to list2 list2 << hc; //Add to list2
if(list2.size()==m_Nslots) goto list2Done; if(list2.size()==nMaxRemainingSlots) goto list2Done;
} }
} }
@ -10558,7 +10579,7 @@ list1Done:
m_foxQSO[hc].tFoxTxRR73 = -1; //Have not sent RR73 m_foxQSO[hc].tFoxTxRR73 = -1; //Have not sent RR73
refreshHoundQueueDisplay(); refreshHoundQueueDisplay();
if(list2.size()==m_Nslots) { if(list2.size()==nMaxRemainingSlots) {
break; break;
} }
@ -10570,7 +10591,6 @@ list2Done:
n2=list2.size(); n2=list2.size();
n3=qMax(n1,n2); n3=qMax(n1,n2);
if(n3>m_Nslots) n3=m_Nslots; if(n3>m_Nslots) n3=m_Nslots;
for(int i=0; i<n3; i++) { for(int i=0; i<n3; i++) {
hc1=""; hc1="";
fm=""; fm="";

View File

@ -483,7 +483,9 @@ void CPlotter::DrawOverlay() //DrawOverlay()
float bw=9.0*12000.0/m_nsps; //JT9 float bw=9.0*12000.0/m_nsps; //JT9
if(m_mode=="FT4") bw=3*12000.0/576.0; //FT4 ### (3x, or 4x???) ### if(m_mode=="FT4") bw=3*12000.0/576.0; //FT4 ### (3x, or 4x???) ###
if(m_mode=="FT8") bw=7*12000.0/1920.0; //FT8 if(m_mode=="FT8") {
bw=7*12000.0/1920.0; //FT8
}
if(m_mode.startsWith("FST4")) { if(m_mode.startsWith("FST4")) {
int h=int(pow(2.0,m_nSubMode)); int h=int(pow(2.0,m_nSubMode));
int nsps=800; int nsps=800;
@ -585,7 +587,7 @@ void CPlotter::DrawOverlay() //DrawOverlay()
painter0.drawLine(x2,25,x2-5,20); painter0.drawLine(x2,25,x2-5,20);
} }
if(m_mode=="Q65" or (m_mode=="JT65" and m_bVHF)) { if(m_mode=="Q65" or (m_mode=="JT65" and m_bVHF) or (m_mode=="FT8" and m_bSuperHound) ) {
painter0.setPen(penGreen); painter0.setPen(penGreen);
x1=XfromFreq(m_rxFreq-m_tol); x1=XfromFreq(m_rxFreq-m_tol);
x2=XfromFreq(m_rxFreq+m_tol); x2=XfromFreq(m_rxFreq+m_tol);
@ -604,10 +606,11 @@ void CPlotter::DrawOverlay() //DrawOverlay()
} }
painter0.setPen(penGreen); painter0.setPen(penGreen);
x6=XfromFreq(m_rxFreq+bw); //Highest tone x6=XfromFreq(m_rxFreq+bw); //Highest tone
if(m_mode=="FT8" and m_bSuperHound) x6=XfromFreq(m_rxFreq+1500.0);
painter0.drawLine(x6,20,x6,26); painter0.drawLine(x6,20,x6,26);
} else { } else {
// Draw the green "goal post" // Draw the green goal post
painter0.setPen(penGreen); painter0.setPen(penGreen);
x1=XfromFreq(m_rxFreq); x1=XfromFreq(m_rxFreq);
x2=XfromFreq(m_rxFreq+bw); x2=XfromFreq(m_rxFreq+bw);
@ -627,12 +630,13 @@ void CPlotter::DrawOverlay() //DrawOverlay()
painter0.setPen(penRed); painter0.setPen(penRed);
x1=XfromFreq(m_txFreq); x1=XfromFreq(m_txFreq);
x2=XfromFreq(m_txFreq+bw); x2=XfromFreq(m_txFreq+bw);
if(m_bSuperFox) x2=XfromFreq(m_txFreq+1500.0);
if(m_mode=="WSPR") { if(m_mode=="WSPR") {
bw=4*12000.0/8192.0; //WSPR bw=4*12000.0/8192.0; //WSPR
x1=XfromFreq(m_txFreq-0.5*bw); x1=XfromFreq(m_txFreq-0.5*bw);
x2=XfromFreq(m_txFreq+0.5*bw); x2=XfromFreq(m_txFreq+0.5*bw);
} }
// Draw the red "goal post" // Draw the red goal post
painter0.drawLine(x1,yTxTop,x1,yTxTop+yh); painter0.drawLine(x1,yTxTop,x1,yTxTop+yh);
painter0.drawLine(x1,yTxTop,x2,yTxTop); painter0.drawLine(x1,yTxTop,x2,yTxTop);
painter0.drawLine(x2,yTxTop,x2,yTxTop+yh); painter0.drawLine(x2,yTxTop,x2,yTxTop+yh);
@ -885,6 +889,18 @@ void CPlotter::setFlatten(bool b1, bool b2)
if(b2) m_Flatten=2; if(b2) m_Flatten=2;
} }
void CPlotter::setSuperFox(bool b)
{
m_bSuperFox=b;
if(m_bSuperFox) m_bSuperHound=false;
}
void CPlotter::setSuperHound(bool b)
{
m_bSuperHound=b;
if(m_bSuperHound) m_bSuperFox=false;
}
void CPlotter::setTol(int n) //setTol() void CPlotter::setTol(int n) //setTol()
{ {
m_tol=n; m_tol=n;

View File

@ -77,6 +77,8 @@ public:
void setColours(QVector<QColor> const& cl); void setColours(QVector<QColor> const& cl);
void setFlatten(bool b1, bool b2); void setFlatten(bool b1, bool b2);
void setTol(int n); void setTol(int n);
void setSuperFox(bool b);
void setSuperHound(bool b);
void setRxBand(QString band); void setRxBand(QString band);
void setReference(bool b) {m_bReference = b;} void setReference(bool b) {m_bReference = b;}
bool Reference() const {return m_bReference;} bool Reference() const {return m_bReference;}
@ -125,6 +127,8 @@ private:
bool m_bSingleDecode; bool m_bSingleDecode;
bool m_bFirst=true; bool m_bFirst=true;
bool m_bResized; bool m_bResized;
bool m_bSuperFox=false;
bool m_bSuperHound=false;
float m_fSpan; float m_fSpan;
float m_pdB=0.0; float m_pdB=0.0;

View File

@ -498,6 +498,16 @@ void WideGraph::on_zero2dSlider_valueChanged(int value) //Zero2
} }
} }
void WideGraph::setSuperFox(bool b)
{
ui->widePlot->setSuperFox(b);
}
void WideGraph::setSuperHound(bool b)
{
ui->widePlot->setSuperHound(b);
}
void WideGraph::setTol(int n) //setTol void WideGraph::setTol(int n) //setTol
{ {
ui->widePlot->setTol(n); ui->widePlot->setTol(n);

View File

@ -42,6 +42,8 @@ public:
bool flatten(); bool flatten();
bool useRef(); bool useRef();
void setTol(int n); void setTol(int n);
void setSuperFox(bool b);
void setSuperHound(bool b);
int smoothYellow(); int smoothYellow();
void setRxBand (QString const& band); void setRxBand (QString const& band);
void setWSPRtransmitted(); void setWSPRtransmitted();