diff --git a/CMakeLists.txt b/CMakeLists.txt index 82ed6c865..d3c0f86d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -363,6 +363,7 @@ set (wsjt_FSRCS lib/bpdecode128_90.f90 lib/ft8/bpdecode174_91.f90 lib/baddata.f90 + lib/cablog.f90 lib/calibrate.f90 lib/ccf2.f90 lib/ccf65.f90 @@ -1143,6 +1144,9 @@ target_link_libraries (jt65sim wsjt_fort wsjt_cxx) add_executable (sumsim lib/sumsim.f90) target_link_libraries (sumsim wsjt_fort wsjt_cxx) +add_executable (cablog lib/cablog.f90) +target_link_libraries (cablog) + add_executable (test_snr lib/test_snr.f90) target_link_libraries (test_snr wsjt_fort) @@ -1599,7 +1603,7 @@ install (TARGETS jt9 wsprd fmtave fcal fmeasure if(WSJT_BUILD_UTILS) install (TARGETS ft8code jt65code jt9code jt4code msk144code - q65code fst4sim q65sim echosim hash22calc + q65code fst4sim q65sim echosim hash22calc cablog RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime ) diff --git a/Configuration.cpp b/Configuration.cpp index 8742be432..216d09b39 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -173,7 +173,6 @@ #include #include - #include "pimpl_impl.hpp" #include "Logger.hpp" #include "qt_helpers.hpp" @@ -331,9 +330,9 @@ public: connect (button_box, &QDialogButtonBox::accepted, this, &FrequencyDialog::accept); connect (button_box, &QDialogButtonBox::rejected, this, &FrequencyDialog::reject); - connect(start_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates); - connect(end_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates); - connect(enable_dates_checkbox_, &QCheckBox::stateChanged, this, &FrequencyDialog::toggleValidity); + connect (start_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates); + connect (end_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates); + connect (enable_dates_checkbox_, &QCheckBox::stateChanged, this, &FrequencyDialog::toggleValidity); toggleValidity(); } @@ -585,6 +584,7 @@ private: Q_SLOT void on_revert_update_button_clicked (bool); void error_during_hamlib_download (QString const& reason); void after_hamlib_downloaded(); + void display_file_information(); Q_SLOT void on_cbx2ToneSpacing_clicked(bool); Q_SLOT void on_cbx4ToneSpacing_clicked(bool); @@ -689,6 +689,7 @@ private: QString FD_exchange_; QString RTTY_exchange_; QString Contest_Name_; + QString hamlib_backed_up_; qint32 id_interval_; qint32 ntrials_; @@ -1575,6 +1576,7 @@ void Configuration::impl::read_settings () ui_->Field_Day_Exchange->setText(FD_exchange_); ui_->RTTY_Exchange->setText(RTTY_exchange_); ui_->Contest_Name->setText(Contest_Name_); + hamlib_backed_up_ = settings_->value ("HamlibBackedUp",QString {}).toString (); if (next_font_.fromString (settings_->value ("Font", QGuiApplication::font ().toString ()).toString ()) && next_font_ != font_) @@ -1751,6 +1753,18 @@ void Configuration::impl::read_settings () pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool (); highlight_DXcall_ = settings_->value("highlight_DXcall",false).toBool (); highlight_DXgrid_ = settings_->value("highlight_DXgrid",false).toBool (); +#ifdef WIN32 + QTimer::singleShot (2500, [=] {display_file_information ();}); +#else + ui_->hamlib_groupBox->setTitle("Hamlib Version"); + ui_->rbHamlib64->setVisible(false); + ui_->rbHamlib32->setVisible(false); + ui_->hamlib_download_button->setVisible(false); + ui_->revert_update_button->setVisible(false); + ui_->backed_up_text->setVisible(false); + ui_->backed_up->setVisible(false); + QTimer::singleShot (2500, [=] {display_file_information ();}); +#endif } void Configuration::impl::find_audio_devices () @@ -2492,6 +2506,11 @@ void Configuration::impl::on_decoded_text_font_push_button_clicked () void Configuration::impl::on_hamlib_download_button_clicked (bool /*clicked*/) { #ifdef WIN32 + extern char* hamlib_version2; + QString hamlib = QString(QLatin1String(hamlib_version2)); + SettingsGroup g {settings_, "Configuration"}; + settings_->setValue ("HamlibBackedUp", hamlib); + settings_->sync (); QDir dataPath = QCoreApplication::applicationDirPath(); QFile f1 {dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"}; QFile f2 {dataPath.absolutePath() + "/" + "libhamlib-4_new.dll"}; @@ -2501,14 +2520,14 @@ void Configuration::impl::on_hamlib_download_button_clicked (bool /*clicked*/) ui_->revert_update_button->setEnabled (false); if (ui_->rbHamlib32->isChecked()) { cty_download.configure(network_manager_, - "https://n0nb.users.sourceforge.net/dll32/libhamlib-4.dll", - dataPath.absoluteFilePath("libhamlib-4_new.dll"), - "Downloading latest libhamlib-4.dll"); + "https://n0nb.users.sourceforge.net/dll32/libhamlib-4.dll", + dataPath.absoluteFilePath("libhamlib-4_new.dll"), + "Downloading latest libhamlib-4.dll"); } else { cty_download.configure(network_manager_, - "https://n0nb.users.sourceforge.net/dll64/libhamlib-4.dll", - dataPath.absoluteFilePath("libhamlib-4_new.dll"), - "Downloading latest libhamlib-4.dll"); + "https://n0nb.users.sourceforge.net/dll64/libhamlib-4.dll", + dataPath.absoluteFilePath("libhamlib-4_new.dll"), + "Downloading latest libhamlib-4.dll"); } connect (&cty_download, &FileDownload::complete, this, &Configuration::impl::after_hamlib_downloaded, Qt::UniqueConnection); connect (&cty_download, &FileDownload::error, this, &Configuration::impl::error_during_hamlib_download, Qt::UniqueConnection); @@ -2550,7 +2569,7 @@ void Configuration::impl::on_revert_update_button_clicked (bool /*clicked*/) ui_->hamlib_download_button->setEnabled (false); QFile::rename(dataPath.absolutePath() + "/" + "libhamlib-4.dll", dataPath.absolutePath() + "/" + "libhamlib-4_new.dll"); QTimer::singleShot (1000, [=] { - QFile::rename(dataPath.absolutePath() + "/" + "libhamlib-4_old.dll", dataPath.absolutePath() + "/" + "libhamlib-4.dll"); + QFile::copy(dataPath.absolutePath() + "/" + "libhamlib-4_old.dll", dataPath.absolutePath() + "/" + "libhamlib-4.dll"); }); QTimer::singleShot (2000, [=] { MessageBox::information_message (this, tr ("Hamlib successfully reverted \n\nReverted Hamlib will be used after restart")); @@ -2565,6 +2584,31 @@ void Configuration::impl::on_revert_update_button_clicked (bool /*clicked*/) #endif } +void Configuration::impl::display_file_information () +{ +#ifdef WIN32 + QDir dataPath = QCoreApplication::applicationDirPath(); + extern char* hamlib_version2; + QString hamlib = QString(QLatin1String(hamlib_version2)); + ui_->in_use->setText(hamlib); + QFileInfo fi2(dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"); + QString birthTime2 = fi2.birthTime().toString("yyyy-MM-dd hh:mm"); + QFile f {dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"}; + if (f.exists()) { + if (hamlib_backed_up_=="") { + ui_->backed_up->setText(QString{"no hamlib data available, file saved %1"}.arg(birthTime2)); + } else { + ui_->backed_up->setText(hamlib_backed_up_); + } + } else { + ui_->backed_up->setText(""); + } +#else + extern char* hamlib_version2; + QString hamlib = QString(QLatin1String(hamlib_version2)); + ui_->in_use->setText(hamlib); +#endif +} void Configuration::impl::on_PTT_port_combo_box_activated (int /* index */) { diff --git a/Configuration.ui b/Configuration.ui index a77b21bd6..c29cc5722 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -6,8 +6,8 @@ 0 0 - 684 - 662 + 800 + 600 @@ -1371,7 +1371,7 @@ radio interface behave as expected. - Update Hamlib (Windows only) + Update Hamlib @@ -1391,6 +1391,16 @@ radio interface behave as expected. + + + + <html><head/><body><p>Revert the last Hamlib update. </p><p>Note: This function is only available on Windows.</p></body></html> + + + Revert Update + + + @@ -1401,15 +1411,37 @@ radio interface behave as expected. - - - - <html><head/><body><p>Revert the last Hamlib update. </p><p>Note: This function is only available on Windows.</p></body></html> - - - Revert Update - - + + + + + + In use: + + + + + + + Backed up: + + + + + + + + + + + + + + + + + + @@ -3466,13 +3498,13 @@ Right click for insert and delete options. - - - - - + + + + + diff --git a/lib/cablog.f90 b/lib/cablog.f90 new file mode 100644 index 000000000..ebc7295cf --- /dev/null +++ b/lib/cablog.f90 @@ -0,0 +1,105 @@ +program cablog + + character*100 line,infile,outfile + character cband*4,cmode*2,cdate*10,cutc*4,callsign*10,mycall*10 + character csent*3,crcvd*3,dsent*3,drcvd*3 + integer icomma(20) + + nargs=iargc() + if(nargs.ne.4) then + print*,"Program cablog converts the file 'wsjtx.log' to a bare-bones" + print*,"Cabrillo log for the ARRL International EME Contest. You will" + print*,"certainly need to edit the header information, and you may" + print*,"edit the log elsewhere as required." + print*,' ' + print*,'Usage: cablog ' + print*,'Example: cablog W2ZQ -15 -16 wsjtx.log' + go to 999 + endif + call getarg(1,mycall) + outfile=trim(mycall)//'.log' + call getarg(2,dsent) + call getarg(3,drcvd) + call getarg(4,infile) + open(10,file=trim(infile),status='old') + open(12,file=trim(outfile),status='unknown') + + write(12,1000) +1000 format('START-OF-LOG: 3.0'/ & + 'CONTEST: ARRL-EME'/ & + 'CALLSIGN: '/ & + 'CATEGORY-OPERATOR: '/ & + 'CATEGORY-BAND: '/ & + 'CATEGORY-MODE: '/ & + 'EMAIL: '/ & + 'OPERATORS: '/ & + 'CATEGORY-POWER: HIGH'/ & + 'CATEGORY-TRANSMITTER: ONE'/ & + 'CATEGORY-STATION: FIXED'/ & + 'CATEGORY-TIME: 24-HOURS'/ & + 'CATEGORY-ASSISTED: ASSISTED'/ & + 'LOCATION: SNJ'/ & + 'CLAIMED-SCORE: '/ & + 'CLUB: '/ & + 'NAME: '/ & + 'ADDRESS: '/ & + 'ADDRESS: '/ & + 'ADDRESS: '/ & + 'CREATED-BY: cablog (C) K1JT') + + n=0 + do nn=1,9999 + read(10,'(a100)',end=900) line + if(len(trim(line)).eq.0) cycle + n=n+1 + k=0 + do j=1,100 + if(line(j:j).eq.',') then + k=k+1 + icomma(k)=j + endif + enddo + cmode='DG' + if(index(line,',CW,').gt.10) cmode='CW' + cdate=line(1:10) + cutc=line(32:33)//line(35:36) + i0=index(line(41:),',') + callsign=line(41:39+i0) + read(line(icomma(6)+1:icomma(7)-1),*,err=10,end=10) freq + go to 20 +10 print*,'***Error at line ',n + print*,trim(line) +20 if(freq.ge.50.0 .and. freq.le.54.0) cband='50 ' + if(freq.ge.144.0 .and. freq.le.148.0) cband='144 ' + if(freq.ge.28.0 .and. freq.le.29.0) cband='144 ' + if(freq.ge.222.0 .and. freq.le.225.0) cband='222 ' + if(freq.ge.420.0 .and. freq.le.450.0) cband='432 ' + if(freq.ge.902.0 .and. freq.le.928.0) cband='902 ' + if(freq.ge.1240.0 .and. freq.le.1300.0) cband='1.2G' + if(freq.ge.2300.0 .and. freq.le.2450.0) cband='2.3G' + if(freq.ge.3300.0 .and. freq.le.3500.0) cband='3.4G' + if(freq.ge.5650.0 .and. freq.le.5925.0) cband='5.7G' + if(freq.ge.10000.0 .and. freq.le.10500.0) cband='10G ' + if(freq.ge.24000.0 .and. freq.le.24250.0) cband='24G ' + if(icomma(8).eq.icomma(9)-1) then + csent=dsent + else + csent=line(icomma(8)+1:icomma(9)-1) + endif + if(icomma(9).eq.icomma(10)-1) then + crcvd=drcvd + else + crcvd=line(icomma(9)+1:icomma(10)-1) + endif + write(12,1020) cband,cmode,cdate,cutc,mycall,csent,callsign,crcvd +1020 format('QSO: ',a4,1x,a2,1x,a10,1x,a4,1x,a6,1x,a3,5x,a10,1x,a3) + enddo + +900 write(12,1900) +1900 format('END-OF-LOG:') + write(*,1910) n,trim(outfile) +1910 format('Processed',i5,' QSOs.'/'Output file: ',a) + +999 end program cablog + +!2023-10-28,00:17:00,2023-10-28,00:21:00,G7TZZ,IO92,1296.083100,Q65,-17,-17,,,, diff --git a/lib/fst4_decode.f90 b/lib/fst4_decode.f90 index 18e9c5c07..0e7d8d670 100644 --- a/lib/fst4_decode.f90 +++ b/lib/fst4_decode.f90 @@ -996,7 +996,7 @@ contains do i=-ia,ia !Find freq range that has 50% of signal power sum2=sum2 + ss(i)-avg if(sum2.ge.0.25*sum1 .and. xi1.eq.-999.0) then - xi1=i - 1 + (sum2-0.25*sum1)/(sum2-sum2z) + xi1=i - 1 + (0.25*sum1-sum2)/(sum2-sum2z) endif if(sum2.ge.0.50*sum1 .and. xi2.eq.-999.0) then xi2=i - 1 + (sum2-0.50*sum1)/(sum2-sum2z) diff --git a/widgets/activeStations.cpp b/widgets/activeStations.cpp index 352c5ada9..0b6fb766b 100644 --- a/widgets/activeStations.cpp +++ b/widgets/activeStations.cpp @@ -64,9 +64,11 @@ void ActiveStations::displayRecentStations(QString mode, QString const& t) { if(mode!=m_mode) { m_mode=mode; + ui->cbReadyOnly->setText("Ready only"); if(m_mode=="Q65") { ui->header_label2->setText(" N Frx Fsked S/N Call Grid Tx Age"); ui->label->setText("QSOs:"); + ui->cbReadyOnly->setText("CQ only"); } else if(m_mode=="Q65-pileup") { ui->header_label2->setText(" N Freq Call Grid El Age(h)"); } else { diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f23092c75..9bbf05885 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -213,6 +213,7 @@ QVector g_ColorTbl; using SpecOp = Configuration::SpecialOperatingActivity; +bool blocked = false; bool m_displayBand = false; bool no_a7_decodes = false; bool keep_frequency = false; @@ -1088,7 +1089,16 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, // backup libhamlib-4.dll file, so it is still available after the next program update QDir dataPath = QCoreApplication::applicationDirPath(); QFile f {dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"}; - if (!f.exists()) QFile::copy(dataPath.absolutePath() + "/" + "libhamlib-4.dll", dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"); + if (!f.exists()) { + QFile::copy(dataPath.absolutePath() + "/" + "libhamlib-4.dll", dataPath.absolutePath() + "/" + "libhamlib-4_old.dll"); + QTimer::singleShot (5000, [=] { //wait until hamlib has been started + extern char* hamlib_version2; + QString hamlib = QString(QLatin1String(hamlib_version2)); + m_settings->beginGroup("Configuration"); + m_settings->setValue ("HamlibBackedUp", hamlib); + m_settings->endGroup(); + }); + } #endif // this must be the last statement of constructor @@ -1213,6 +1223,16 @@ void MainWindow::writeSettings() m_settings->setValue ("SerialNumber",ui->sbSerialNumber->value ()); m_settings->endGroup(); + // do this in the General group because we save the parameters from various places + if(m_mode=="JT9") { + m_settings->setValue("SubMode",ui->sbSubmode->value()); + m_settings->setValue("TRPeriod", ui->sbTR->value()); + } + if(m_mode=="MSK144") m_settings->setValue("ShMsgs_MSK144",m_bShMsgs); + if(m_mode=="Q65") m_settings->setValue("ShMsgs_Q65",m_bShMsgs); + if(m_mode=="JT65") m_settings->setValue("ShMsgs_JT65",m_bShMsgs); + if(m_mode=="JT4") m_settings->setValue("ShMsgs_JT4",m_bShMsgs); + m_settings->beginGroup("Common"); m_settings->setValue("Mode",m_mode); m_settings->setValue("SaveNone",ui->actionNone->isChecked()); @@ -1226,13 +1246,12 @@ void MainWindow::writeSettings() m_settings->setValue("FST4W_FTol",ui->sbFST4W_FTol->value()); m_settings->setValue("FST4_FLow",ui->sbF_Low->value()); m_settings->setValue("FST4_FHigh",ui->sbF_High->value()); -// m_settings->setValue("SubMode",ui->sbSubmode->value()); m_settings->setValue("DTtol",m_DTtol); m_settings->setValue("Ftol", ui->sbFtol->value ()); m_settings->setValue("MinSync",m_minSync); m_settings->setValue ("AutoSeq", ui->cbAutoSeq->isChecked ()); m_settings->setValue ("RxAll", ui->cbRxAll->isChecked ()); - m_settings->setValue("ShMsgs",m_bShMsgs); +// m_settings->setValue("ShMsgs",m_bShMsgs); m_settings->setValue("SWL",ui->cbSWL->isChecked()); m_settings->setValue ("DialFreq", QVariant::fromValue(m_lastMonitoredFrequency)); m_settings->setValue("OutAttenuation", ui->outAttenuation->value ()); @@ -1248,7 +1267,6 @@ void MainWindow::writeSettings() m_settings->setValue("UploadSpots",m_uploadWSPRSpots); 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); @@ -1316,16 +1334,58 @@ void MainWindow::readSettings() ui->sbSerialNumber->setValue (m_settings->value ("SerialNumber", 1).toInt ()); m_settings->endGroup(); + m_settings->beginGroup("Common"); + m_mode=m_settings->value("Mode","FT8").toString(); + m_settings->endGroup(); + + // do this outside of settings group because it uses groups internally ui->actionAstronomical_data->setChecked (displayAstro); + // do this in the General group because we save the parameters from various places + if(m_mode=="JT9") { + blocked=true; + m_nSubMode=m_settings->value("SubMode",0).toInt(); + ui->sbSubmode->setValue(m_nSubMode); + ui->sbFtol->setValue (m_settings->value("Ftol_JT9", 50).toInt()); + ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); + QTimer::singleShot (50, [=] {blocked = false;}); + } + if (m_mode=="Q65") { + m_nSubMode=m_settings->value("SubMode_Q65",0).toInt(); + ui->sbSubmode->setValue(m_nSubMode_Q65); + ui->sbFtol->setValue (m_settings->value("Ftol_Q65", 50).toInt()); + ui->sbTR->setValue (m_settings->value ("TRPeriod_Q65", 30).toInt()); + } + if (m_mode=="JT65") { + m_nSubMode=m_settings->value("SubMode_JT65",0).toInt(); + ui->sbSubmode->setValue(m_nSubMode_JT65); + ui->sbFtol->setValue (m_settings->value("Ftol_JT65", 50).toInt()); + } + if (m_mode=="JT4") { + m_nSubMode=m_settings->value("SubMode_JT4",0).toInt(); + ui->sbSubmode->setValue(m_nSubMode_JT4); + ui->sbFtol->setValue (m_settings->value("Ftol_JT4", 50).toInt()); + ui->sbTR->setValue (m_settings->value ("TRPeriod_FST4", 60).toInt()); + } + if (m_mode=="MSK144") { + ui->sbFtol->setValue (m_settings->value("Ftol_MSK144",50).toInt()); + if (!(m_currentBand=="6m" or m_currentBand=="4m" or m_currentBand=="2m")) ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144", 30).toInt()); + if (m_currentBand=="6m" or m_currentBand=="4m") ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144_6m", 15).toInt()); + if (m_currentBand=="2m") ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144_2m", 30).toInt()); + } + if (m_mode=="MSK144") m_bShMsgs=m_settings->value("ShMsgs_MSK144",false).toBool(); + if (m_mode=="Q65") m_bShMsgs=m_settings->value("ShMsgs_Q65",false).toBool(); + if (m_mode=="JT65") m_bShMsgs=m_settings->value("ShMsgs_JT65",false).toBool(); + if (m_mode=="JT4") m_bShMsgs=m_settings->value("ShMsgs_JT4",false).toBool(); + m_settings->beginGroup("Common"); ui->labDXped->setText(m_settings->value("labDXpedText",QString {}).toString ()); ui->actionDon_t_split_ALL_TXT->setChecked(m_settings->value("actionDontSplitALLTXT", true).toBool()); ui->actionSplit_ALL_TXT_yearly->setChecked(m_settings->value("splitAllTxtYearly", false).toBool()); ui->actionSplit_ALL_TXT_monthly->setChecked(m_settings->value("splitAllTxtMonthly", false).toBool()); ui->actionDisable_writing_of_ALL_TXT->setChecked(m_settings->value("disableWritingOfAllTxt", false).toBool()); - m_mode=m_settings->value("Mode","FT8").toString(); +// m_mode=m_settings->value("Mode","FT8").toString(); ui->actionNone->setChecked(m_settings->value("SaveNone",true).toBool()); ui->actionSave_decoded->setChecked(m_settings->value("SaveDecoded",false).toBool()); ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool()); @@ -1335,28 +1395,16 @@ void MainWindow::readSettings() ui->sbFST4W_RxFreq->setValue(m_settings->value("FST4W_RxFreq",1500).toInt()); ui->sbF_Low->setValue(m_settings->value("FST4_FLow",600).toInt()); ui->sbF_High->setValue(m_settings->value("FST4_FHigh",1400).toInt()); -// m_nSubMode=m_settings->value("SubMode",0).toInt(); - if (m_mode=="Q65") m_nSubMode=m_settings->value("SubMode_Q65",0).toInt(); - if (m_mode=="JT65") m_nSubMode=m_settings->value("SubMode_JT65",0).toInt(); - if (m_mode=="JT4") m_nSubMode=m_settings->value("SubMode_JT4",0).toInt(); -// ui->sbSubmode->setValue(m_nSubMode); - if (m_mode=="Q65") ui->sbSubmode->setValue(m_nSubMode_Q65); - if (m_mode=="JT65") ui->sbSubmode->setValue(m_nSubMode_JT65); - if (m_mode=="JT4") ui->sbSubmode->setValue(m_nSubMode_JT4); ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt()); ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt()); m_minSync=m_settings->value("MinSync",0).toInt(); ui->syncSpinBox->setValue(m_minSync); ui->cbAutoSeq->setChecked (m_settings->value ("AutoSeq", false).toBool()); ui->cbRxAll->setChecked (m_settings->value ("RxAll", false).toBool()); - m_bShMsgs=m_settings->value("ShMsgs",false).toBool(); +// m_bShMsgs=m_settings->value("ShMsgs",false).toBool(); m_bSWL=m_settings->value("SWL",false).toBool(); 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()); - if (m_mode=="Q65") ui->sbTR->setValue (m_settings->value ("TRPeriod_Q65", 30).toInt()); - if (m_mode=="MSK144") ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144", 15).toInt()); - if (m_mode=="FST4") ui->sbTR->setValue (m_settings->value ("TRPeriod_FST4", 60).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", @@ -6877,6 +6925,10 @@ void MainWindow::on_actionFST4_triggered() on_sbSubmode_valueChanged(ui->sbSubmode->value()); }); m_mode="FST4"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionFST4->setChecked(true); m_bFast9=false; m_bFastMode=false; @@ -6919,6 +6971,10 @@ void MainWindow::on_actionFST4_triggered() void MainWindow::on_actionFST4W_triggered() { m_mode="FST4W"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionFST4W->setChecked(true); m_bFast9=false; m_bFastMode=false; @@ -6954,6 +7010,10 @@ void MainWindow::on_actionFT4_triggered() on_sbSubmode_valueChanged(ui->sbSubmode->value()); }); m_mode="FT4"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } m_TRperiod=7.5; bool bVHF=m_config.enable_VHF_features(); m_bFast9=false; @@ -7120,6 +7180,10 @@ void MainWindow::on_actionJT4_triggered() ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); }); m_mode="JT4"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } bool bVHF=m_config.enable_VHF_features(); WSPR_config(false); switch_mode (Modes::JT4); @@ -7143,10 +7207,13 @@ void MainWindow::on_actionJT4_triggered() ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); if(bVHF) { -// ui->sbSubmode->setValue(m_nSubMode); - QTimer::singleShot (50, [=] {m_nSubMode=m_settings->value("SubMode_JT4",0).toInt();}); - QTimer::singleShot (75, [=] {ui->sbSubmode->setValue(m_settings->value("SubMode_JT4",0).toInt());}); - QTimer::singleShot (100, [=] {on_sbSubmode_valueChanged(m_nSubMode);}); + // restore last used parameters + ui->sbFtol->setValue (m_settings->value ("Ftol_JT4", 50).toInt()); + m_nSubMode=m_settings->value("SubMode_JT4",0).toInt(); + ui->sbSubmode->setValue(m_settings->value("SubMode_JT4",0).toInt()); + QTimer::singleShot (50, [=] {on_sbSubmode_valueChanged(ui->sbSubmode->value());}); + m_bShMsgs=m_settings->value("ShMsgs_JT4",false).toBool(); + ui->cbShMsgs->setChecked(m_bShMsgs); } else { ui->sbSubmode->setValue(0); } @@ -7163,8 +7230,25 @@ void MainWindow::on_actionJT4_triggered() void MainWindow::on_actionJT9_triggered() { m_mode="JT9"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } bool bVHF=m_config.enable_VHF_features(); - m_bFast9=ui->cbFast9->isChecked(); + // restore last used parameters + if(bVHF && m_mode!="JT65" && !blocked) { + ui->sbSubmode->setMaximum(7); + m_bFast9=m_settings->value("JT9_Fast",false).toBool(); + ui->cbFast9->setChecked(m_bFast9 or m_bFastMode); + ui->sbFtol->setValue (m_settings->value ("Ftol_JT9", 50).toInt()); + m_nSubMode=m_settings->value("SubMode",0).toInt(); + ui->sbSubmode->setValue(m_nSubMode); + QTimer::singleShot (50, [=] { + on_sbTR_valueChanged (ui->sbTR->value()); + on_sbSubmode_valueChanged(ui->sbSubmode->value()); + }); + } +// m_bFast9=ui->cbFast9->isChecked(); m_bFastMode=m_bFast9; WSPR_config(false); switch_mode (Modes::JT9); @@ -7187,6 +7271,7 @@ void MainWindow::on_actionJT9_triggered() ui->sbSubmode->setMaximum(7); if(m_bFast9) { ui->sbTR->values ({5, 10, 15, 30}); + if(bVHF && m_mode!="JT65" && !blocked) ui->sbTR->setValue (m_settings->value ("TRPeriod", 15).toInt()); // restore last used TRperiod on_sbTR_valueChanged (ui->sbTR->value()); m_wideGraph->hide(); m_fastGraph->showNormal(); @@ -7226,6 +7311,10 @@ void MainWindow::on_actionJT65_triggered() ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); }); on_actionJT9_triggered(); + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } m_mode="JT65"; bool bVHF=m_config.enable_VHF_features(); WSPR_config(false); @@ -7251,10 +7340,13 @@ void MainWindow::on_actionJT65_triggered() m_bFast9=false; ui->sbSubmode->setMaximum(2); if(bVHF) { -// ui->sbSubmode->setValue(m_nSubMode); - QTimer::singleShot (50, [=] {m_nSubMode=m_settings->value("SubMode_JT65",0).toInt();}); - QTimer::singleShot (75, [=] {ui->sbSubmode->setValue(m_settings->value("SubMode_JT65",0).toInt());}); - QTimer::singleShot (100, [=] {on_sbSubmode_valueChanged(m_nSubMode);}); + // restore last used parameters + ui->sbFtol->setValue (m_settings->value ("Ftol_JT65", 50).toInt()); + m_nSubMode=m_settings->value("SubMode_JT65",0).toInt(); + ui->sbSubmode->setValue(m_settings->value("SubMode_JT65",0).toInt()); + QTimer::singleShot (50, [=] {on_sbSubmode_valueChanged(ui->sbSubmode->value());}); + m_bShMsgs=m_settings->value("ShMsgs_JT65",false).toBool(); + ui->cbShMsgs->setChecked(m_bShMsgs); } else { ui->sbSubmode->setValue(0); ui->lh_decodes_title_label->setText(tr ("Band Activity")); @@ -7281,6 +7373,10 @@ void MainWindow::on_actionQ65_triggered() ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); }); m_mode="Q65"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionQ65->setChecked(true); switch_mode(Modes::Q65); ui->cbAutoSeq->setChecked(true); @@ -7294,12 +7390,17 @@ void MainWindow::on_actionQ65_triggered() Q_EMIT FFTSize(m_FFTSize); m_hsymStop=49; ui->sbTR->values ({15, 30, 60, 120, 300}); - ui->sbTR->setValue (m_settings->value ("TRPeriod_Q65", 30).toInt()); // remember sbTR settings by mode - QTimer::singleShot (50, [=] {on_sbTR_valueChanged (ui->sbTR->value());}); -// ui->sbSubmode->setValue(m_nSubMode); - QTimer::singleShot (50, [=] {m_nSubMode=m_settings->value("SubMode_Q65",0).toInt();}); - QTimer::singleShot (75, [=] {ui->sbSubmode->setValue(m_settings->value("SubMode_Q65",0).toInt());}); - QTimer::singleShot (100, [=] {on_sbSubmode_valueChanged(m_nSubMode);}); + // restore last used parameters + ui->sbTR->setValue (m_settings->value ("TRPeriod_Q65", 30).toInt()); + ui->sbFtol->setValue (m_settings->value ("Ftol_Q65", 50).toInt()); + m_nSubMode=m_settings->value("SubMode_Q65",0).toInt(); + ui->sbSubmode->setValue(m_settings->value("SubMode_Q65",0).toInt()); + QTimer::singleShot (50, [=] { + on_sbTR_valueChanged (ui->sbTR->value()); + on_sbSubmode_valueChanged(ui->sbSubmode->value()); + }); + m_bShMsgs=m_settings->value("ShMsgs_Q65",false).toBool(); + ui->cbShMsgs->setChecked(m_bShMsgs); QString fname {QDir::toNativeSeparators(m_config.temp_dir().absoluteFilePath ("red.dat"))}; m_wideGraph->setRedFile(fname); m_wideGraph->setMode(m_mode); @@ -7361,6 +7462,10 @@ void MainWindow::on_actionMSK144_triggered() return; } m_mode="MSK144"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionMSK144->setChecked(true); switch_mode (Modes::MSK144); m_nsps=6; @@ -7374,11 +7479,10 @@ void MainWindow::on_actionMSK144_triggered() m_bFastMode=true; m_bFast9=false; ui->sbTR->values ({5, 10, 15, 30}); - ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144", 15).toInt()); // remember sbTR settings by mode - QTimer::singleShot (50, [=] { - on_sbTR_valueChanged (ui->sbTR->value()); - on_sbSubmode_valueChanged(ui->sbSubmode->value()); - }); + ui->sbTR->setValue (m_settings->value ("TRPeriod_MSK144", 15).toInt()); // restore last used TRperiod + QTimer::singleShot (50, [=] {on_sbTR_valueChanged (ui->sbTR->value());}); + m_bShMsgs=m_settings->value("ShMsgs_MSK144",false).toBool(); + ui->cbShMsgs->setChecked(m_bShMsgs); m_wideGraph->hide(); m_fastGraph->showNormal(); ui->TxFreqSpinBox->setValue(1500); @@ -7419,6 +7523,10 @@ void MainWindow::on_actionMSK144_triggered() void MainWindow::on_actionWSPR_triggered() { m_mode="WSPR"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } WSPR_config(true); switch_mode (Modes::WSPR); m_TRperiod=120.0; @@ -7455,6 +7563,10 @@ void MainWindow::on_actionEcho_triggered() if(nd==3) ui->actionDeepestDecode->setChecked (true); m_mode="Echo"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionEcho->setChecked(true); m_TRperiod=3.0; m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe @@ -7489,6 +7601,10 @@ void MainWindow::on_actionFreqCal_triggered() { on_actionJT9_triggered(); m_mode="FreqCal"; + if(m_specOp==SpecOp::HOUND) { + m_config.setSpecial_None(); + m_specOp=m_config.special_op_id(); + } ui->actionFreqCal->setChecked(true); switch_mode(Modes::FreqCal); m_wideGraph->setMode(m_mode); @@ -8482,6 +8598,14 @@ void MainWindow::on_sbFtol_valueChanged(int value) { m_wideGraph->setTol (value); statusUpdate (); + // save last used parameters + QTimer::singleShot (200, [=] { + 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=="JT65") m_settings->setValue ("Ftol_JT65", ui->sbFtol->value ()); + if (m_mode=="JT4") m_settings->setValue ("Ftol_JT4", ui->sbFtol->value()); + if (m_mode=="JT9") m_settings->setValue ("Ftol_JT9", ui->sbFtol->value ()); + }); } void::MainWindow::VHF_features_enabled(bool b) @@ -8543,19 +8667,25 @@ void MainWindow::on_sbTR_valueChanged(int value) m_wideGraph->setPeriod (value, m_nsps); progressBar.setMaximum (value); } - if (m_mode=="Q65") { - QTimer::singleShot (200, [=] {m_settings->setValue ("TRPeriod_Q65", ui->sbTR->value ());}); - } - if (m_mode=="MSK144") { - QTimer::singleShot (200, [=] {m_settings->setValue ("TRPeriod_MSK144", ui->sbTR->value ());}); - } - if (m_mode=="FST4") { - chk_FST4_freq_range(); - QTimer::singleShot (200, [=] {m_settings->setValue ("TRPeriod_FST4", ui->sbTR->value ());}); - } // if(m_transmitting) on_stopTxButton_clicked(); //### Is this needed or desirable? ### + if (m_mode=="FST4") chk_FST4_freq_range(); on_sbSubmode_valueChanged(ui->sbSubmode->value()); statusUpdate (); + // save last used parameters + QTimer::singleShot (200, [=] { + if (m_mode=="Q65") m_settings->setValue ("TRPeriod_Q65", ui->sbTR->value ()); + if (m_mode=="MSK144" && (!(m_currentBand=="6m" or m_currentBand=="4m" or m_currentBand=="2m"))) { + m_settings->setValue ("TRPeriod_MSK144", ui->sbTR->value ()); + } + if (m_mode=="MSK144" && (m_currentBand=="6m" or m_currentBand=="4m")) { + m_settings->setValue ("TRPeriod_MSK144_6m", ui->sbTR->value ()); + } + if (m_mode=="MSK144" && m_currentBand=="2m") { + m_settings->setValue ("TRPeriod_MSK144_2m", ui->sbTR->value ()); + } + if (m_mode=="FST4") m_settings->setValue ("TRPeriod_FST4", ui->sbTR->value ()); + if (m_mode=="JT9") m_settings->setValue ("TRPeriod", ui->sbTR->value ()); + }); } void MainWindow::on_sbTR_FST4W_valueChanged(int value) @@ -8602,17 +8732,21 @@ void MainWindow::on_sbSubmode_valueChanged(int n) ui->sbTR->setVisible(false); m_TRperiod=60.0; } else { - ui->cbFast9->setEnabled(true); + if(!blocked) ui->cbFast9->setEnabled(true); } ui->sbTR->setVisible(m_bFast9); if(m_bFast9) ui->TxFreqSpinBox->setValue(700); } if(m_transmitting and m_bFast9 and m_nSubMode>=4) transmit (99.0); if (m_mode !="Q65") ui->TxFreqSpinBox->setStyleSheet(""); - if (m_mode=="Q65") {QTimer::singleShot (200, [=] {m_settings->setValue("SubMode_Q65",ui->sbSubmode->value());});} - if (m_mode=="JT65") {QTimer::singleShot (200, [=] {m_settings->setValue("SubMode_JT65",ui->sbSubmode->value());});} - if (m_mode=="JT4") {QTimer::singleShot (200, [=] {m_settings->setValue("SubMode_JT4",ui->sbSubmode->value());});} statusUpdate (); + // save last used parameters + QTimer::singleShot (200, [=] { + if (m_mode=="Q65") m_settings->setValue("SubMode_Q65",ui->sbSubmode->value()); + if (m_mode=="JT65") m_settings->setValue("SubMode_JT65",ui->sbSubmode->value()); + if (m_mode=="JT4") m_settings->setValue("SubMode_JT4",ui->sbSubmode->value()); + if (m_mode=="JT9") m_settings->setValue("SubMode",ui->sbSubmode->value()); + }); } void MainWindow::on_cbFast9_clicked(bool b) @@ -8620,7 +8754,12 @@ void MainWindow::on_cbFast9_clicked(bool b) if(m_mode=="JT9") { m_bFast9=b; // ui->cbAutoSeq->setVisible(b); + blocked=true; // needed to prevent a loop on_actionJT9_triggered(); + QTimer::singleShot (50, [=] {blocked = false;}); // needed to prevent a loop + QTimer::singleShot (200, [=] { + if(m_mode=="JT9") m_settings->setValue("JT9_Fast",m_bFast9); + }); } if(b) { @@ -8652,6 +8791,12 @@ void MainWindow::on_cbShMsgs_toggled(bool b) if(ntx==4) ui->txrb4->setChecked(true); if(ntx==5) ui->txrb5->setChecked(true); if(ntx==6) ui->txrb6->setChecked(true); + QTimer::singleShot (200, [=] { + if(m_mode=="MSK144") m_settings->setValue("ShMsgs_MSK144",m_bShMsgs); + if(m_mode=="Q65") m_settings->setValue("ShMsgs_Q65",m_bShMsgs); + if(m_mode=="JT65") m_settings->setValue("ShMsgs_JT65",m_bShMsgs); + if(m_mode=="JT4") m_settings->setValue("ShMsgs_JT4",m_bShMsgs); + }); } void MainWindow::on_cbSWL_toggled(bool b) @@ -9495,7 +9640,8 @@ void MainWindow::readWidebandDecodes() m_EMECall[dxcall].t=60*nhr + nmin; if(w3.contains(grid_regexp)) m_EMECall[dxcall].grid4=w3; bool bCQ=line.contains(" CQ "); - m_EMECall[dxcall].ready2call=(bCQ or line.contains(" 73") or line.contains(" RR73")); +// m_EMECall[dxcall].ready2call=(bCQ or line.contains(" 73") or line.contains(" RR73")); + m_EMECall[dxcall].ready2call=(bCQ); Frequency frequency = (m_freqNominal/1000000) * 1000000 + int(fsked*1000.0); bool bFromDisk=qmapcom.nQDecoderDone==2; if(!bFromDisk and (m_EMECall[dxcall].grid4.contains(grid_regexp) or bCQ)) { @@ -10630,45 +10776,25 @@ void MainWindow::on_houndButton_clicked (bool checked) void MainWindow::on_ft8Button_clicked() { - if(m_specOp==SpecOp::HOUND) { - m_config.setSpecial_None(); - m_specOp=m_config.special_op_id(); - } on_actionFT8_triggered(); } void MainWindow::on_ft4Button_clicked() { - if(m_specOp==SpecOp::HOUND) { - m_config.setSpecial_None(); - m_specOp=m_config.special_op_id(); - } on_actionFT4_triggered(); } void MainWindow::on_msk144Button_clicked() { - if(m_specOp==SpecOp::HOUND) { - m_config.setSpecial_None(); - m_specOp=m_config.special_op_id(); - } on_actionMSK144_triggered(); } void MainWindow::on_q65Button_clicked() { - if(m_specOp==SpecOp::HOUND) { - m_config.setSpecial_None(); - m_specOp=m_config.special_op_id(); - } on_actionQ65_triggered(); } void MainWindow::on_jt65Button_clicked() { - if(m_specOp==SpecOp::HOUND) { - m_config.setSpecial_None(); - m_specOp=m_config.special_op_id(); - } on_actionJT65_triggered(); }