Remove FT2; implement basic functionality in FT4.

This commit is contained in:
Joe Taylor 2019-01-28 10:19:46 -05:00
parent d3b1f7e560
commit 6e4f0f32ee
8 changed files with 81 additions and 91 deletions

View File

@ -462,7 +462,6 @@ set (wsjt_FSRCS
lib/ft8/genft8.f90 lib/ft8/genft8.f90
lib/genmsk_128_90.f90 lib/genmsk_128_90.f90
lib/genmsk40.f90 lib/genmsk40.f90
lib/fsk4hf/genft2.f90
lib/ft4/genft4.f90 lib/ft4/genft4.f90
lib/genqra64.f90 lib/genqra64.f90
lib/ft8/genft8refsig.f90 lib/ft8/genft8refsig.f90
@ -509,13 +508,9 @@ set (wsjt_FSRCS
lib/msk144signalquality.f90 lib/msk144signalquality.f90
lib/msk144sim.f90 lib/msk144sim.f90
lib/mskrtd.f90 lib/mskrtd.f90
lib/fsk4hf/ft2sim.f90
lib/fsk4hf/ft2d.f90
lib/ft4/ft4sim.f90 lib/ft4/ft4sim.f90
lib/ft4/ft4d.f90 lib/ft4/ft4d.f90
lib/ft4/ft4_decode.f90 lib/ft4/ft4_decode.f90
lib/ft2/cdatetime.f90
lib/ft2/ft2_decode.f90
lib/77bit/my_hash.f90 lib/77bit/my_hash.f90
lib/wsprd/osdwspr.f90 lib/wsprd/osdwspr.f90
lib/ft8/osd174_91.f90 lib/ft8/osd174_91.f90
@ -558,7 +553,6 @@ set (wsjt_FSRCS
lib/sync65.f90 lib/sync65.f90
lib/ft4/getcandidates4.f90 lib/ft4/getcandidates4.f90
lib/fsk4hf/getcandidates2.f90 lib/fsk4hf/getcandidates2.f90
lib/ft2/getcandidates2a.f90
lib/ft4/syncft4.f90 lib/ft4/syncft4.f90
lib/ft8/sync8.f90 lib/ft8/sync8.f90
lib/ft8/sync8d.f90 lib/ft8/sync8d.f90
@ -1271,12 +1265,6 @@ target_link_libraries (ft8sim wsjt_fort wsjt_cxx)
add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc) add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc)
target_link_libraries (msk144sim wsjt_fort wsjt_cxx) target_link_libraries (msk144sim wsjt_fort wsjt_cxx)
add_executable (ft2sim lib/fsk4hf/ft2sim.f90 wsjtx.rc)
target_link_libraries (ft2sim wsjt_fort wsjt_cxx)
add_executable (ft2d lib/fsk4hf/ft2d.f90 wsjtx.rc)
target_link_libraries (ft2d wsjt_fort wsjt_cxx)
add_executable (ft4sim lib/ft4/ft4sim.f90 wsjtx.rc) add_executable (ft4sim lib/ft4/ft4sim.f90 wsjtx.rc)
target_link_libraries (ft4sim wsjt_fort wsjt_cxx) target_link_libraries (ft4sim wsjt_fort wsjt_cxx)

View File

@ -89,13 +89,15 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol,
if (synchronize && !m_tuning && !m_bFastMode) { if (synchronize && !m_tuning && !m_bFastMode) {
m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000)); m_silentFrames = m_ic + m_frameRate / (1000 / delay_ms) - (mstr * (m_frameRate / 1000));
} }
if(symbolsLength==144 and framesPerSymbol==160 and toneSpacing==60) { if((symbolsLength==103 or symbolsLength==105) and framesPerSymbol==512
//### FT2 params and toneSpacing==12000.0/512.0) {
//### FT4 parameters
delay_ms=100; delay_ms=100;
mstr=1947; mstr=5000;
m_ic=0; m_ic=0;
m_silentFrames=0; m_silentFrames=0;
} }
// qDebug() << "Mod AA" << symbolsLength << framesPerSymbol << toneSpacing;
// qDebug() << "Mod AB" << delay_ms << mstr << m_ic << m_silentFrames; // qDebug() << "Mod AB" << delay_ms << mstr << m_ic << m_silentFrames;
initialize (QIODevice::ReadOnly, channel); initialize (QIODevice::ReadOnly, channel);

View File

@ -24,7 +24,7 @@ namespace
"QRA64", "QRA64",
"FreqCal", "FreqCal",
"FT8", "FT8",
"FT2" "FT4"
}; };
std::size_t constexpr mode_names_size = sizeof (mode_names) / sizeof (mode_names[0]); std::size_t constexpr mode_names_size = sizeof (mode_names) / sizeof (mode_names[0]);
} }

View File

@ -49,7 +49,7 @@ public:
QRA64, QRA64,
FreqCal, FreqCal,
FT8, FT8,
FT2, FT4,
MODES_END_SENTINAL_AND_COUNT // this must be last MODES_END_SENTINAL_AND_COUNT // this must be last
}; };
Q_ENUM (Mode) Q_ENUM (Mode)

View File

@ -455,7 +455,7 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq,bool bFastMode) void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq,bool bFastMode)
{ {
QString t1=" @ "; QString t1=" @ ";
if(modeTx=="FT2") t1=" + "; if(modeTx=="FT4") t1=" + ";
if(modeTx=="FT8") t1=" ~ "; if(modeTx=="FT8") t1=" ~ ";
if(modeTx=="JT4") t1=" $ "; if(modeTx=="JT4") t1=" $ ";
if(modeTx=="JT65") t1=" # "; if(modeTx=="JT65") t1=" # ";
@ -463,7 +463,7 @@ void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 tx
QString t2; QString t2;
t2.sprintf("%4d",txFreq); t2.sprintf("%4d",txFreq);
QString t; QString t;
if(bFastMode or modeTx=="FT8" or modeTx=="FT2") { if(bFastMode or modeTx=="FT8" or modeTx=="FT4") {
t = QDateTime::currentDateTimeUtc().toString("hhmmss") + \ t = QDateTime::currentDateTimeUtc().toString("hhmmss") + \
" Tx " + t2 + t1 + text; " Tx " + t2 + t1 + text;
} else if(modeTx.mid(0,6)=="FT8fox") { } else if(modeTx.mid(0,6)=="FT8fox") {

View File

@ -99,7 +99,7 @@ extern "C" {
void genft8_(char* msg, int* i3, int* n3, char* msgsent, char ft8msgbits[], void genft8_(char* msg, int* i3, int* n3, char* msgsent, char ft8msgbits[],
int itone[], fortran_charlen_t, fortran_charlen_t); int itone[], fortran_charlen_t, fortran_charlen_t);
void genft2_(char* msg, int* ichk, char* msgsent, int itone[], int* itype, void genft4_(char* msg, int* ichk, char* msgsent, int itone[], int* itype,
fortran_charlen_t, fortran_charlen_t); fortran_charlen_t, fortran_charlen_t);
void gen4_(char* msg, int* ichk, char* msgsent, int itone[], void gen4_(char* msg, int* ichk, char* msgsent, int itone[],
@ -163,7 +163,7 @@ extern "C" {
void chkcall_(char* w, char* basc_call, bool cok, int len1, int len2); void chkcall_(char* w, char* basc_call, bool cok, int len1, int len2);
void ft2_decode_(char* cdatetime, int* nfqso, short int id[], int* ndecodes, void ft4_decode_(char* cdatetime, int* nfqso, short int id[], int* ndecodes,
char* mycall6, char* hiscall6, int* nrx, char* line, char* mycall6, char* hiscall6, int* nrx, char* line,
int len1, int len2, int len3, int len4); int len1, int len2, int len3, int len4);
} }
@ -551,7 +551,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
on_EraseButton_clicked (); on_EraseButton_clicked ();
QActionGroup* modeGroup = new QActionGroup(this); QActionGroup* modeGroup = new QActionGroup(this);
ui->actionFT2->setActionGroup(modeGroup); ui->actionFT4->setActionGroup(modeGroup);
ui->actionFT8->setActionGroup(modeGroup); ui->actionFT8->setActionGroup(modeGroup);
ui->actionJT9->setActionGroup(modeGroup); ui->actionJT9->setActionGroup(modeGroup);
ui->actionJT65->setActionGroup(modeGroup); ui->actionJT65->setActionGroup(modeGroup);
@ -728,11 +728,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_guiTimer.start(100); //### Don't change the 100 ms! ### m_guiTimer.start(100); //### Don't change the 100 ms! ###
FT2_TxTimer.setSingleShot(true); FT4_TxTimer.setSingleShot(true);
connect(&FT2_TxTimer, &QTimer::timeout, this, &MainWindow::stopTx); connect(&FT4_TxTimer, &QTimer::timeout, this, &MainWindow::stopTx);
FT2_WriteTxTimer.setSingleShot(true); FT4_WriteTxTimer.setSingleShot(true);
connect(&FT2_WriteTxTimer, &QTimer::timeout, this, &MainWindow::FT2_writeTx); connect(&FT4_WriteTxTimer, &QTimer::timeout, this, &MainWindow::FT4_writeTx);
ptt0Timer.setSingleShot(true); ptt0Timer.setSingleShot(true);
connect(&ptt0Timer, &QTimer::timeout, this, &MainWindow::stopTx2); connect(&ptt0Timer, &QTimer::timeout, this, &MainWindow::stopTx2);
@ -889,7 +889,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
if(m_bFast9) m_bFastMode=true; if(m_bFast9) m_bFastMode=true;
ui->cbFast9->setChecked(m_bFast9 or m_bFastMode); ui->cbFast9->setChecked(m_bFast9 or m_bFastMode);
if(m_mode=="FT2") on_actionFT2_triggered(); if(m_mode=="FT4") on_actionFT4_triggered();
if(m_mode=="FT8") on_actionFT8_triggered(); if(m_mode=="FT8") on_actionFT8_triggered();
if(m_mode=="JT4") on_actionJT4_triggered(); if(m_mode=="JT4") on_actionJT4_triggered();
if(m_mode=="JT9") on_actionJT9_triggered(); if(m_mode=="JT9") on_actionJT9_triggered();
@ -1361,8 +1361,8 @@ void MainWindow::dataSink(qint64 frames)
if(m_monitoring || m_diskData) { if(m_monitoring || m_diskData) {
m_wideGraph->dataSink2(s,m_df3,m_ihsym,m_diskData); m_wideGraph->dataSink2(s,m_df3,m_ihsym,m_diskData);
} }
if(m_mode=="FT2") ft2Data(k); if(m_mode=="FT4") ft4Data(k);
if(m_mode=="MSK144" or m_mode=="FT2") return; if(m_mode=="MSK144" or m_mode=="FT4") return;
fixStop(); fixStop();
if (m_mode == "FreqCal" if (m_mode == "FreqCal"
@ -1893,8 +1893,8 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
break; break;
case Qt::Key_F1: case Qt::Key_F1:
if(bAltF1F5) { if(bAltF1F5) {
if(m_mode=="FT2") { if(m_mode=="FT4") {
ft2_tx(6); ft4_tx(6);
return; return;
} }
auto_tx_mode(true); auto_tx_mode(true);
@ -1906,8 +1906,8 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
case Qt::Key_F2: case Qt::Key_F2:
if(bAltF1F5) { if(bAltF1F5) {
if(m_mode=="FT2") { if(m_mode=="FT4") {
ft2_tx(2); ft4_tx(2);
return; return;
} }
auto_tx_mode(true); auto_tx_mode(true);
@ -1919,8 +1919,8 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
case Qt::Key_F3: case Qt::Key_F3:
if(bAltF1F5) { if(bAltF1F5) {
if(m_mode=="FT2") { if(m_mode=="FT4") {
ft2_tx(3); ft4_tx(3);
return; return;
} }
auto_tx_mode(true); auto_tx_mode(true);
@ -1932,8 +1932,8 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
case Qt::Key_F4: case Qt::Key_F4:
if(bAltF1F5) { if(bAltF1F5) {
if(m_mode=="FT2") { if(m_mode=="FT4") {
ft2_tx(4); ft4_tx(4);
return; return;
} }
auto_tx_mode(true); auto_tx_mode(true);
@ -1946,8 +1946,8 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
case Qt::Key_F5: case Qt::Key_F5:
if(bAltF1F5) { if(bAltF1F5) {
if(m_mode=="FT2") { if(m_mode=="FT4") {
ft2_tx(5); ft4_tx(5);
return; return;
} }
auto_tx_mode(true); auto_tx_mode(true);
@ -3401,7 +3401,7 @@ void MainWindow::guiUpdate()
double tx1=0.0; double tx1=0.0;
double tx2=txDuration; double tx2=txDuration;
if(m_mode=="FT8" or m_mode=="FT2") icw[0]=0; //No CW ID in FT2 or FT8 mode if(m_mode=="FT8" or m_mode=="FT4") icw[0]=0; //No CW ID in FT4 or FT8 mode
if((icw[0]>0) and (!m_bFast9)) tx2 += icw[0]*2560.0/48000.0; //Full length including CW ID if((icw[0]>0) and (!m_bFast9)) tx2 += icw[0]*2560.0/48000.0; //Full length including CW ID
if(tx2>m_TRperiod) tx2=m_TRperiod; if(tx2>m_TRperiod) tx2=m_TRperiod;
@ -3559,7 +3559,7 @@ void MainWindow::guiUpdate()
Q_EMIT m_config.transceiver_ptt (true); //Assert the PTT Q_EMIT m_config.transceiver_ptt (true); //Assert the PTT
m_tx_when_ready = true; m_tx_when_ready = true;
} }
if(!m_bTxTime and !m_tune and m_mode!="FT2") m_btxok=false; //Time to stop transmitting if(!m_bTxTime and !m_tune and m_mode!="FT4") m_btxok=false; //Time to stop transmitting
} }
if(m_mode.startsWith ("WSPR") and if(m_mode.startsWith ("WSPR") and
@ -3701,10 +3701,10 @@ void MainWindow::guiUpdate()
} }
} }
if(m_mode!="FT2") m_currentMessage = QString::fromLatin1(msgsent); if(m_mode!="FT4") m_currentMessage = QString::fromLatin1(msgsent);
m_bCallingCQ = CALLING == m_QSOProgress m_bCallingCQ = CALLING == m_QSOProgress
|| m_currentMessage.contains (QRegularExpression {"^(CQ|QRZ) "}); || m_currentMessage.contains (QRegularExpression {"^(CQ|QRZ) "});
if(m_mode=="FT8" or m_mode=="FT2") { if(m_mode=="FT8" or m_mode=="FT4") {
if(m_bCallingCQ && ui->cbFirst->isVisible () && ui->cbFirst->isChecked ()) { if(m_bCallingCQ && ui->cbFirst->isVisible () && ui->cbFirst->isChecked ()) {
ui->cbFirst->setStyleSheet("QCheckBox{color:red}"); ui->cbFirst->setStyleSheet("QCheckBox{color:red}");
} else { } else {
@ -3819,7 +3819,7 @@ void MainWindow::guiUpdate()
m_msgSent0 = current_message; m_msgSent0 = current_message;
} }
if(m_mode!="FT2") { if(m_mode!="FT4") {
if(!m_tune) write_all("Tx",m_currentMessage); if(!m_tune) write_all("Tx",m_currentMessage);
if (m_config.TX_messages () && !m_tune && SpecOp::FOX!=m_config.special_op_id()) { if (m_config.TX_messages () && !m_tune && SpecOp::FOX!=m_config.special_op_id()) {
@ -3856,7 +3856,7 @@ void MainWindow::guiUpdate()
} }
} }
if(m_mode=="FT8" or m_mode=="MSK144" or m_mode=="FT2") { if(m_mode=="FT8" or m_mode=="MSK144" or m_mode=="FT4") {
if(ui->txrb1->isEnabled() and if(ui->txrb1->isEnabled() and
(SpecOp::NA_VHF==m_config.special_op_id() or (SpecOp::NA_VHF==m_config.special_op_id() or
SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::FIELD_DAY==m_config.special_op_id() or
@ -3888,12 +3888,12 @@ void MainWindow::guiUpdate()
if(tHound >= 120 and m_ntx==1) auto_tx_mode(false); if(tHound >= 120 and m_ntx==1) auto_tx_mode(false);
} }
progressBar.setVisible(!(m_mode=="FT2")); progressBar.setVisible(!(m_mode=="FT4"));
if(m_auto and m_mode=="Echo" and m_bEchoTxOK) { if(m_auto and m_mode=="Echo" and m_bEchoTxOK) {
progressBar.setMaximum(6); progressBar.setMaximum(6);
progressBar.setValue(int(m_s6)); progressBar.setValue(int(m_s6));
} }
if(m_mode!="Echo" and m_mode!="FT2") { if(m_mode!="Echo" and m_mode!="FT4") {
if(m_monitoring or m_transmitting) { if(m_monitoring or m_transmitting) {
progressBar.setMaximum(m_TRperiod); progressBar.setMaximum(m_TRperiod);
int isec=int(fmod(tsec,m_TRperiod)); int isec=int(fmod(tsec,m_TRperiod));
@ -3932,7 +3932,7 @@ void MainWindow::guiUpdate()
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==2 and foxcom_.nslots==1) { if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==2 and foxcom_.nslots==1) {
t=m_fm1.trimmed(); t=m_fm1.trimmed();
} }
if(m_mode=="FT2") t="Tx: "+ m_currentMessage; if(m_mode=="FT4") t="Tx: "+ m_currentMessage;
tx_status_label.setText(t.trimmed()); tx_status_label.setText(t.trimmed());
} }
} }
@ -4303,7 +4303,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|| ("JT9" == m_mode && mode != "@") || ("JT9" == m_mode && mode != "@")
|| ("MSK144" == m_mode && !("&" == mode || "^" == mode)) || ("MSK144" == m_mode && !("&" == mode || "^" == mode))
|| ("QRA64" == m_mode && mode.left (1) != ":")) { || ("QRA64" == m_mode && mode.left (1) != ":")) {
return; //Currently we do auto-sequencing only in FT2, FT8, and MSK144 return; //Currently we do auto-sequencing only in FT4, FT8, and MSK144
} }
//Skip the rest if no decoded text extracted //Skip the rest if no decoded text extracted
@ -4392,7 +4392,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
ui->TxFreqSpinBox->setValue(frequency); ui->TxFreqSpinBox->setValue(frequency);
} }
if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") && if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
m_mode != "QRA64" && m_mode!="FT8" && m_mode!="FT2") { m_mode != "QRA64" && m_mode!="FT8" && m_mode!="FT4") {
return; return;
} }
} }
@ -4534,7 +4534,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
m_QSOProgress = SIGNOFF; m_QSOProgress = SIGNOFF;
} else if((m_QSOProgress >= REPORT } else if((m_QSOProgress >= REPORT
|| (m_QSOProgress >= REPLYING && || (m_QSOProgress >= REPLYING &&
(m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT2"))) (m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT4")))
&& r.mid(0,1)=="R") { && r.mid(0,1)=="R") {
m_ntx=4; m_ntx=4;
m_QSOProgress = ROGERS; m_QSOProgress = ROGERS;
@ -4759,13 +4759,13 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
if(m_transmitting) m_restart=true; if(m_transmitting) m_restart=true;
if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked () if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked ()
&& !m_bDoubleClicked && m_mode!="FT2") { && !m_bDoubleClicked && m_mode!="FT4") {
return; return;
} }
if(m_mode=="FT2" and ui->cbAutoSeq->isChecked()) { if(m_mode=="FT4" and ui->cbAutoSeq->isChecked()) {
if(m_ntx==4 or m_ntx==5) logQSOTimer.start(0); // Log the QSO if(m_ntx==4 or m_ntx==5) logQSOTimer.start(0); // Log the QSO
if((m_ntx==3 and ui->cbFirst->isChecked()) or m_ntx==4 or m_bDoubleClicked) { if((m_ntx==3 and ui->cbFirst->isChecked()) or m_ntx==4 or m_bDoubleClicked) {
ft2_tx(m_ntx); ft4_tx(m_ntx);
} }
} }
if(m_config.quick_call()) auto_tx_mode(true); if(m_config.quick_call()) auto_tx_mode(true);
@ -4908,7 +4908,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
int n=rpt.toInt(); int n=rpt.toInt();
rpt.sprintf("%+2.2d",n); rpt.sprintf("%+2.2d",n);
if(m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT2") { if(m_mode=="MSK144" or m_mode=="FT8" or m_mode=="FT4") {
QString t2,t3; QString t2,t3;
QString sent=rpt; QString sent=rpt;
QString rs,rst; QString rs,rst;
@ -4962,7 +4962,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
} }
} }
if((m_mode!="MSK144" and m_mode!="FT8" and m_mode!="FT2")) { if((m_mode!="MSK144" and m_mode!="FT8" and m_mode!="FT4")) {
t=t00 + rpt; t=t00 + rpt;
msgtype(t, ui->tx2); msgtype(t, ui->tx2);
t=t0 + "R" + rpt; t=t0 + "R" + rpt;
@ -5541,23 +5541,23 @@ void MainWindow::displayWidgets(qint64 n)
genStdMsgs (m_rpt, true); genStdMsgs (m_rpt, true);
} }
void MainWindow::on_actionFT2_triggered() void MainWindow::on_actionFT4_triggered()
{ {
m_mode="FT2"; m_mode="FT4";
m_modeTx="FT2"; m_modeTx="FT4";
m_TRperiod=2147483647; m_TRperiod=2147483647;
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
m_bFast9=false; m_bFast9=false;
m_bFastMode=false; m_bFastMode=false;
WSPR_config(false); WSPR_config(false);
switch_mode (Modes::FT2); switch_mode (Modes::FT4);
m_nsps=6912; m_nsps=6912; //???
m_FFTSize = m_nsps/2; m_FFTSize = m_nsps/2;
Q_EMIT FFTSize (m_FFTSize); Q_EMIT FFTSize (m_FFTSize);
m_hsymStop=50; m_hsymStop=50; //???
setup_status_bar (bVHF); setup_status_bar (bVHF);
m_toneSpacing=0.8*75.0; //??? m_toneSpacing=12000.0/512.0;
ui->actionFT2->setChecked(true); //??? ui->actionFT4->setChecked(true); //???
m_wideGraph->setMode(m_mode); m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx); m_wideGraph->setModeTx(m_modeTx);
VHF_features_enabled(bVHF); VHF_features_enabled(bVHF);
@ -6859,11 +6859,11 @@ void MainWindow::transmit (double snr)
true, false, snr, m_TRperiod); true, false, snr, m_TRperiod);
} }
if (m_modeTx == "FT2") { if (m_modeTx == "FT4") {
toneSpacing=0.8*12000.0/160.0; toneSpacing=12000.0/512.0;
// if(SpecOp::FOX==m_config.special_op_id() and !m_tune) toneSpacing=-1; // if(SpecOp::FOX==m_config.special_op_id() and !m_tune) toneSpacing=-1;
Q_EMIT sendMessage (NUM_FT2_SYMBOLS, Q_EMIT sendMessage (NUM_FT4_SYMBOLS,
160.0, ui->TxFreqSpinBox->value() - m_XIT, 512.0, ui->TxFreqSpinBox->value() - m_XIT,
toneSpacing, m_soundOutput, m_config.audio_output_channel (), toneSpacing, m_soundOutput, m_config.audio_output_channel (),
true, false, snr, 2); true, false, snr, 2);
} }
@ -7920,7 +7920,7 @@ void MainWindow::on_cbFirst_toggled(bool b)
void MainWindow::on_cbAutoSeq_toggled(bool b) void MainWindow::on_cbAutoSeq_toggled(bool b)
{ {
if(!b) ui->cbFirst->setChecked(false); if(!b) ui->cbFirst->setChecked(false);
ui->cbFirst->setVisible((m_mode=="FT8" or m_mode=="FT2") and b); ui->cbFirst->setVisible((m_mode=="FT8" or m_mode=="FT4") and b);
} }
void MainWindow::on_measure_check_box_stateChanged (int state) void MainWindow::on_measure_check_box_stateChanged (int state)
@ -8582,7 +8582,7 @@ void MainWindow::write_all(QString txRx, QString message)
t.sprintf("%5d",ui->TxFreqSpinBox->value()); t.sprintf("%5d",ui->TxFreqSpinBox->value());
if(txRx=="Tx") msg=" 0 0.0" + t + " " + message; if(txRx=="Tx") msg=" 0 0.0" + t + " " + message;
auto time = QDateTime::currentDateTimeUtc (); auto time = QDateTime::currentDateTimeUtc ();
if(m_mode!="FT2") time = time.addSecs(-(time.time().second() % m_TRperiod)); if(m_mode!="FT4") time = time.addSecs(-(time.time().second() % m_TRperiod));
t.sprintf("%10.3f ",m_freqNominal/1.e6); t.sprintf("%10.3f ",m_freqNominal/1.e6);
if(m_diskData) { if(m_diskData) {
line=m_fileDateTime + t + txRx + " " + m_mode.leftJustified(6,' ') + msg; line=m_fileDateTime + t + txRx + " " + m_mode.leftJustified(6,' ') + msg;
@ -8605,19 +8605,19 @@ void MainWindow::write_all(QString txRx, QString message)
} }
} }
void MainWindow::ft2Data(int k) void MainWindow::ft4Data(int k)
{ {
static int nhsec0=-1; static int nhsec0=-1;
short id[30000]; short id[60000];
int nhsec=k/6000; int nhsec=k/6000;
if(nhsec==nhsec0) return; if(nhsec==nhsec0) return;
//Process FT2 data at 0.5 s intervals //Process FT4 data at 0.5 s intervals
int j=k/6000; int j=k/6000;
j=6000*j-30000; j=6000*j-60000;
if(j<0) j+=NRING; if(j<0) j+=NRING;
for(int i=0; i<30000; i++) { for(int i=0; i<60000; i++) {
id[i]=dec_data.d2[j]; id[i]=dec_data.d2[j];
j++; j++;
if(j>=NRING) j=j-NRING; if(j>=NRING) j=j-NRING;
@ -8639,7 +8639,7 @@ void MainWindow::ft2Data(int k)
int nfqso=1500; int nfqso=1500;
int ndecodes=0; int ndecodes=0;
int nrx=-1; int nrx=-1;
ft2_decode_(cdatetime,&nfqso,id,&ndecodes,mycall6,hiscall6,&nrx,&line[0], ft4_decode_(cdatetime,&nfqso,id,&ndecodes,mycall6,hiscall6,&nrx,&line[0],
17,6,6,61); 17,6,6,61);
line[60]=0; line[60]=0;
if(ndecodes>0) { if(ndecodes>0) {
@ -8676,7 +8676,7 @@ void MainWindow::ft2Data(int k)
nhsec0=nhsec; nhsec0=nhsec;
} }
void MainWindow::ft2_tx(int ntx) void MainWindow::ft4_tx(int ntx)
{ {
if(g_iptt!=0) return; //Alreadt transmitting? if(g_iptt!=0) return; //Alreadt transmitting?
static char message[38]; static char message[38];
@ -8695,7 +8695,7 @@ void MainWindow::ft2_tx(int ntx)
ba2msg(ba,message); ba2msg(ba,message);
int ichk=0; int ichk=0;
int itype=-1; int itype=-1;
genft2_(message, &ichk, msgsent, const_cast<int *>(itone), &itype, 37, 37); genft4_(message, &ichk, msgsent, const_cast<int *>(itone), &itype, 37, 37);
msgsent[37]=0; msgsent[37]=0;
m_currentMessage = QString::fromLatin1(msgsent).trimmed(); m_currentMessage = QString::fromLatin1(msgsent).trimmed();
tx_status_label.setStyleSheet("QLabel{background-color: #ffff33}"); tx_status_label.setStyleSheet("QLabel{background-color: #ffff33}");
@ -8715,11 +8715,11 @@ void MainWindow::ft2_tx(int ntx)
m_tx_when_ready = true; m_tx_when_ready = true;
qint64 ms=QDateTime::currentMSecsSinceEpoch(); qint64 ms=QDateTime::currentMSecsSinceEpoch();
m_modulator->set_ms0(ms); m_modulator->set_ms0(ms);
FT2_TxTimer.start(2500); //Slightly more than FT2 transmission length FT4_TxTimer.start(5000); //Slightly more than FT4 transmission length
if (g_iptt == 1 && m_iptt0 == 0) { if (g_iptt == 1 && m_iptt0 == 0) {
auto const& current_message = QString::fromLatin1 (msgsent); auto const& current_message = QString::fromLatin1 (msgsent);
FT2_WriteTxTimer.start(100); //Why is a delay necessary to ensure Tx after Rx in all.txt? FT4_WriteTxTimer.start(100); //Why is a delay necessary to ensure Tx after Rx in all.txt?
if (m_config.TX_messages () && !m_tune && SpecOp::FOX!=m_config.special_op_id()) { if (m_config.TX_messages () && !m_tune && SpecOp::FOX!=m_config.special_op_id()) {
ui->decodedTextBrowser2->displayTransmittedText(current_message, m_modeTx, ui->decodedTextBrowser2->displayTransmittedText(current_message, m_modeTx,
ui->TxFreqSpinBox->value(),m_bFastMode); ui->TxFreqSpinBox->value(),m_bFastMode);
@ -8743,7 +8743,7 @@ void MainWindow::ft2_tx(int ntx)
if(!m_btxok && m_btxok0 && g_iptt==1) stopTx(); if(!m_btxok && m_btxok0 && g_iptt==1) stopTx();
} }
void MainWindow::FT2_writeTx() void MainWindow::FT4_writeTx()
{ {
write_all("Tx",m_currentMessage); write_all("Tx",m_currentMessage);
} }

View File

@ -46,7 +46,7 @@
#define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80 #define NUM_MSK144_SYMBOLS 144 //s8 + d48 + s8 + d80
#define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync #define NUM_QRA64_SYMBOLS 84 //63 data + 21 sync
#define NUM_FT8_SYMBOLS 79 #define NUM_FT8_SYMBOLS 79
#define NUM_FT2_SYMBOLS 144 #define NUM_FT4_SYMBOLS 103
#define NUM_CW_SYMBOLS 250 #define NUM_CW_SYMBOLS 250
#define TX_SAMPLE_RATE 48000 #define TX_SAMPLE_RATE 48000
#define N_WIDGETS 33 #define N_WIDGETS 33
@ -202,7 +202,7 @@ private slots:
void on_actionJT65_triggered(); void on_actionJT65_triggered();
void on_actionJT9_JT65_triggered(); void on_actionJT9_JT65_triggered();
void on_actionJT4_triggered(); void on_actionJT4_triggered();
void on_actionFT2_triggered(); void on_actionFT4_triggered();
void on_actionFT8_triggered(); void on_actionFT8_triggered();
void on_TxFreqSpinBox_valueChanged(int arg1); void on_TxFreqSpinBox_valueChanged(int arg1);
void on_actionSave_decoded_triggered(); void on_actionSave_decoded_triggered();
@ -312,8 +312,8 @@ private slots:
void on_comboBoxHoundSort_activated (int index); void on_comboBoxHoundSort_activated (int index);
void not_GA_warning_message (); void not_GA_warning_message ();
void checkMSK144ContestType(); void checkMSK144ContestType();
void ft2Data(int k); void ft4Data(int k);
void ft2_tx(int ntx); void ft4_tx(int ntx);
int setTxMsg(int n); int setTxMsg(int n);
bool stdCall(QString const& w); bool stdCall(QString const& w);
@ -581,8 +581,8 @@ private:
QTimer minuteTimer; QTimer minuteTimer;
QTimer splashTimer; QTimer splashTimer;
QTimer p1Timer; QTimer p1Timer;
QTimer FT2_TxTimer; QTimer FT4_TxTimer;
QTimer FT2_WriteTxTimer; QTimer FT4_WriteTxTimer;
QString m_path; QString m_path;
QString m_baseCall; QString m_baseCall;
@ -750,7 +750,7 @@ private:
void foxTxSequencer(); void foxTxSequencer();
void foxGenWaveform(int i,QString fm); void foxGenWaveform(int i,QString fm);
void writeFoxQSO (QString const& msg); void writeFoxQSO (QString const& msg);
void FT2_writeTx(); void FT4_writeTx();
}; };
extern int killbyname(const char* progName); extern int killbyname(const char* progName);

View File

@ -2705,7 +2705,7 @@ list. The list can be maintained in Settings (F2).</string>
<property name="title"> <property name="title">
<string>Mode</string> <string>Mode</string>
</property> </property>
<addaction name="actionFT2"/> <addaction name="actionFT4"/>
<addaction name="actionFT8"/> <addaction name="actionFT8"/>
<addaction name="actionJT4"/> <addaction name="actionJT4"/>
<addaction name="actionJT9"/> <addaction name="actionJT9"/>
@ -3339,12 +3339,12 @@ list. The list can be maintained in Settings (F2).</string>
<string>Erase WSPR hashtable</string> <string>Erase WSPR hashtable</string>
</property> </property>
</action> </action>
<action name="actionFT2"> <action name="actionFT4">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="text"> <property name="text">
<string>FT2</string> <string>FT4</string>
</property> </property>
</action> </action>
</widget> </widget>