diff --git a/CMakeLists.txt b/CMakeLists.txt index 658820145..ffe482eb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ message (STATUS "******************************************************") include (set_build_type) # RC 0 or omitted is a development build, GA is a General Availability release build -set_build_type (RC 1) +set_build_type (RC 2) set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") # diff --git a/NEWS b/NEWS index 6f97a2980..58611d99f 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,41 @@ Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team + Release: WSJT-X 2.6.0-rc2 + July 25, 2022 + ---------------------- + +WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as +well as some bug fixes. + +In program WSJT-X : + + - Echo-mode now lets the "Measure" function use the computed fspread + for DX grid + + - Fix VFOB not getting set on some rigs (e.g. IC7610 & IC7100) + + - Show contacts by ID in the contest log, scroll to insertion when + sorted by the column up or down + + - Remember the settings for T/R period and Submode by mode; you can now + switch directly e.g. between MSK144-15, Q65-60A, JT65-C, FST4-120 + + - Restore Tx & Rx offset when coming from a mode which sets AF to + 1500 Hz (MSK144, FST4W, Echo, WSPR, FreqCal) and switch back to + FT4, FT8, Q65, JT65, or FST4 + + - Set 4m FT8 default frequency for Region 1 to 70.154 MHz + + - Optimize mode button layout for 4K screens + + - Minor edits to display of Keyboard Shortcuts + + - Make OK button the default on the LogQSO dialog window + + - Fix some bugs + + Release: WSJT-X 2.6.0-rc1 June 20, 2022 ---------------------- diff --git a/Release_Notes.txt b/Release_Notes.txt index b5f84f98a..7f83387f7 100644 --- a/Release_Notes.txt +++ b/Release_Notes.txt @@ -11,6 +11,41 @@ Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team + Release: WSJT-X 2.6.0-rc2 + July 25, 2022 + ---------------------- + +WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as +well as some bug fixes. + +In program WSJT-X : + + - Echo-mode now lets the "Measure" function use the computed fspread + for DX grid + + - Fix VFOB not getting set on some rigs (e.g. IC7610 & IC7100) + + - Show contacts by ID in the contest log, scroll to insertion when + sorted by the column up or down + + - Remember the settings for T/R period and Submode by mode; you can now + switch directly e.g. between MSK144-15, Q65-60A, JT65-C, FST4-120 + + - Restore Tx & Rx offset when coming from a mode which sets AF to + 1500 Hz (MSK144, FST4W, Echo, WSPR, FreqCal) and switch back to + FT4, FT8, Q65, JT65, or FST4 + + - Set 4m FT8 default frequency for Region 1 to 70.154 MHz + + - Optimize mode button layout for 4K screens + + - Minor edits to display of Keyboard Shortcuts + + - Make OK button the default on the LogQSO dialog window + + - Fix some bugs + + Release: WSJT-X 2.6.0-rc1 June 20, 2022 ---------------------- @@ -85,6 +120,7 @@ In program MAP65 (Windows only): - Suppress a bounds error caused by too-wide setting of display bandwidth + Release: WSJT-X 2.5.4 Dec 28, 2021 ---------------------- diff --git a/Transceiver/HamlibTransceiver.cpp b/Transceiver/HamlibTransceiver.cpp index a0670c0f2..eb69bbae8 100644 --- a/Transceiver/HamlibTransceiver.cpp +++ b/Transceiver/HamlibTransceiver.cpp @@ -911,6 +911,7 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore) // to frequency such as the TS-2000 auto mode setting CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode)); m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode")); + rig_set_mode (m_->rig_.data (), RIG_VFO_B, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting VFOB mode"); } update_mode (m); } diff --git a/doc/user_guide/en/decoder_notes.adoc b/doc/user_guide/en/decoder_notes.adoc index cbdf89fab..4bcedd490 100644 --- a/doc/user_guide/en/decoder_notes.adoc +++ b/doc/user_guide/en/decoder_notes.adoc @@ -38,7 +38,7 @@ uses information from the previous Rx sequence. |a4|MyCall DxCall RRR |a5|MyCall DxCall 73 |a6|MyCall DxCall RR73 -|a7|Call_1 Call_2     ? +|a7|(Call_1 or CQ) Call_2     ? |=== If a codeword is found that is judged to have high (but not diff --git a/lib/astro0.f90 b/lib/astro0.f90 index 0ffe4d611..e59b7effc 100644 --- a/lib/astro0.f90 +++ b/lib/astro0.f90 @@ -11,7 +11,7 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, & real*8 uth8,techo8,freq8 real*8 xl,b common/librcom/xl(2),b(2) - common/echocom2/echo_spread + common/echocom2/fspread_self,fspread_dx data uth8z/0.d0/ save @@ -43,9 +43,11 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, & dbdt2=DEGS*(b2a-b2) rate1=2.0*sqrt(dldt1**2 + dbdt1**2) width1=0.5*6741*fghz*rate1 - echo_spread=width1 !Save echo_spread for avecho() rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2) width2=0.5*6741*fghz*rate2 + if(hisgrid(1:4).eq.' ') width2=width1 !No hisgrid, use self width + fspread_self=width1 !Save for avecho() + fspread_dx=width2 !Save for avecho() AzSun8=AzSun ElSun8=ElSun diff --git a/lib/avecho.f90 b/lib/avecho.f90 index aa56e66d9..04b80df65 100644 --- a/lib/avecho.f90 +++ b/lib/avecho.f90 @@ -1,4 +1,5 @@ -subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,snrdb,db_err,dfreq,width) +subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, & + dfreq,width) integer TXLENGTH parameter (TXLENGTH=27648) !27*1024 @@ -17,18 +18,19 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,snrdb,db_err,dfreq,width) complex c(0:NH) equivalence (x,c),(ipk,ipkv) common/echocom/nclearave,nsum,blue(NZ),red(NZ) - common/echocom2/echo_spread + common/echocom2/fspread_self,fspread_dx save dop0,sa,sb - fspread=echo_spread !### Use the predicted Doppler spread ### + fspread=fspread_dx !### Use the predicted Doppler spread ### + if(nauto.eq.1) fspread=fspread_self inquire(file='fspread.txt',exist=ex) if(ex) then open(39,file='fspread.txt',status='old') read(39,*) fspread close(39) endif + fspread=min(max(0.1,fspread),700.0) width=fspread - dop=ndop sq=0. do i=1,TXLENGTH diff --git a/lib/grid2deg.f90 b/lib/grid2deg.f90 index 843fc8480..a7ec1c89c 100644 --- a/lib/grid2deg.f90 +++ b/lib/grid2deg.f90 @@ -3,7 +3,8 @@ subroutine grid2deg(grid0,dlong,dlat) ! Converts Maidenhead grid locator to degrees of West longitude ! and North latitude. - character*6 grid0,grid + character*(*) grid0 + character*6 grid character*1 g1,g2,g3,g4,g5,g6 grid=grid0 diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index b0459e190..b0f467f33 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -234,8 +234,10 @@ bool CabrilloLog::add_QSO (Frequency frequency, QString const& mode, QDateTime c m_->adding_row_ = true; auto ok = m_->insertRecord (-1, record); transaction.submit (); + m_->adding_row_ = false; m_->setEditStrategy (QSqlTableModel::OnFieldChange); + return ok; } @@ -256,6 +258,11 @@ bool CabrilloLog::dupe (Frequency frequency, QString const& call) const return false; } +int CabrilloLog::n_qso() +{ + return m_->rowCount(); +} + void CabrilloLog::reset () { // synchronize model diff --git a/models/CabrilloLog.hpp b/models/CabrilloLog.hpp index 97d8f0d88..40c27380d 100644 --- a/models/CabrilloLog.hpp +++ b/models/CabrilloLog.hpp @@ -31,6 +31,7 @@ public: bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call , QString const& report_sent, QString const& report_received); bool dupe (Frequency, QString const& call) const; + int n_qso(); QSqlTableModel * model (); void reset (); diff --git a/revision_utils.cpp b/revision_utils.cpp index 6b6ac1c82..d78e09fc9 100644 --- a/revision_utils.cpp +++ b/revision_utils.cpp @@ -80,6 +80,5 @@ QString version (bool include_patch) QString program_title (QString const& revision) { QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()}; -// return id + " " + revision + " by K1JT, G4WJS, K9AN, and IV3NWV"; - return id + " " + revision; + return id + " " + revision + " by K1JT et al."; } diff --git a/widgets/AbstractLogWindow.cpp b/widgets/AbstractLogWindow.cpp index b8e2d7e7a..656eff7f1 100644 --- a/widgets/AbstractLogWindow.cpp +++ b/widgets/AbstractLogWindow.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "Configuration.hpp" #include "SettingsGroup.hpp" #include "MessageBox.hpp" @@ -88,29 +89,37 @@ void AbstractLogWindow::impl::delete_QSOs () } } + AbstractLogWindow::AbstractLogWindow (QString const& settings_key, QSettings * settings , Configuration const * configuration , QWidget * parent) : QWidget {parent} - , m_ {this, settings_key, settings, configuration} -{ - // this attempt to scroll to the last new record doesn't work, some - // sort of issue with model indexes and optimized DB fetches. For - // now sorting by the same column and direction as the underlying DB - // select and that DB select being in descending order so new rows - // at the end appear at view row 0 gets the job done + , m_ {this, settings_key, settings, configuration} { + // when we're viewing the log by contact ID (visually, up/down chevron in the column heading), + // when we add a contact, scroll the list to the top or bottom, depending on the sort order. + // If the table is sorted by some other criteria, don't change anything. - // // ensure view scrolls to latest new row - // connect (&m_->model_, &QAbstractItemModel::rowsInserted, this, [this] (QModelIndex const& parent, int first, int last) { - // // note col 0 is hidden so use col 1 - // // queued connection required otherwise row may not be available - // // in time - // auto index = m_->model_.index (last, 1, parent); - // if (m_->log_view_) - // { - // m_->log_view_->scrollTo (index); - // } - // }, Qt::QueuedConnection); + connect(&m_->model_, &QAbstractItemModel::rowsInserted, this, + [this](QModelIndex const &parent, int first, int last) { + (void) (parent); // UNUSED + (void) (first); // UNUSED + (void) (last); // UNUSED + QTimer::singleShot(0, [=] { + // if we're sorting by the date, then show the most-recently logged contact. + // Otherwise, leave the scroll alone + auto horizontal_header = m_->log_view_->horizontalHeader (); + if (horizontal_header->sortIndicatorSection() == 3) { // sorting on date? + if (horizontal_header->sortIndicatorOrder() == Qt::AscendingOrder) { + // we're sorting oldes->newest, so go to bottom + m_->log_view_->scrollToBottom(); + } else { + m_->log_view_->scrollToTop(); + } + } + + }); + } + ); } AbstractLogWindow::~AbstractLogWindow () @@ -134,11 +143,14 @@ void AbstractLogWindow::set_log_view (QTableView * log_view) log_view->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel); m_->model_.setSourceModel (log_view->model ()); log_view->setModel (&m_->model_); - log_view->setColumnHidden (0, true); + log_view->setColumnHidden (0, true); // hide the ID column auto horizontal_header = log_view->horizontalHeader (); + horizontal_header->setResizeContentsPrecision (0); // visible region only horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents); horizontal_header->setSectionsMovable (true); + horizontal_header->setSortIndicator(3, Qt::AscendingOrder); // sort by the contact datetime oldest->newest + auto vertical_header = log_view->horizontalHeader (); vertical_header->setResizeContentsPrecision (0); // visible region only vertical_header->setSectionResizeMode (QHeaderView::ResizeToContents); @@ -149,6 +161,9 @@ void AbstractLogWindow::set_log_view (QTableView * log_view) connect (delete_action, &QAction::triggered, [this] (bool /*checked*/) { m_->delete_QSOs (); }); + + // scroll to bottom, since we're showing 1-N + log_view->scrollToBottom(); } void AbstractLogWindow::set_log_view_font (QFont const& font) diff --git a/widgets/CabrilloLogWindow.cpp b/widgets/CabrilloLogWindow.cpp index 5c219fcd7..3315181a0 100644 --- a/widgets/CabrilloLogWindow.cpp +++ b/widgets/CabrilloLogWindow.cpp @@ -70,6 +70,7 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const m_->ui_.log_table_view->setItemDelegateForColumn (3, new SQLiteDateTimeDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this}); auto h_header = m_->ui_.log_table_view->horizontalHeader (); + m_->ui_.log_table_view->verticalHeader()->setVisible(false); // turn off line numbers for the table view h_header->moveSection (7, 1); // band to first column } @@ -88,3 +89,10 @@ void CabrilloLogWindow::log_model_changed (int row) m_->log_model_->select (); } } + +void CabrilloLogWindow::set_nQSO(int n) +{ + QString t; + t=t.asprintf("%d QSOs",n); + m_->ui_.nQSO_lineEdit->setText(t); +} diff --git a/widgets/CabrilloLogWindow.hpp b/widgets/CabrilloLogWindow.hpp index e2aa1627a..044986620 100644 --- a/widgets/CabrilloLogWindow.hpp +++ b/widgets/CabrilloLogWindow.hpp @@ -16,6 +16,7 @@ public: explicit CabrilloLogWindow (QSettings *, Configuration const *, QSqlTableModel * cabrillo_log_model , QWidget * parent = nullptr); ~CabrilloLogWindow (); + void set_nQSO(int n); private: void log_model_changed (int row) override; diff --git a/widgets/CabrilloLogWindow.ui b/widgets/CabrilloLogWindow.ui index 35b4d597d..1b44d0652 100644 --- a/widgets/CabrilloLogWindow.ui +++ b/widgets/CabrilloLogWindow.ui @@ -27,6 +27,22 @@ + + + + + 100 + 16777215 + + + + 0 QSOs + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index f49274494..e87a88520 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "logbook/logbook.h" #include "MessageBox.hpp" @@ -109,6 +110,15 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd) { if(!isHidden()) return; + + QPushButton* okBtn = ui->buttonBox->button(QDialogButtonBox::Ok); + okBtn->setAutoDefault(true); + okBtn->setDefault(true); + okBtn->setFocus(); + QPushButton* caBtn = ui->buttonBox->button(QDialogButtonBox::Cancel); + caBtn->setAutoDefault(false); + caBtn->setDefault(false); + ui->call->setText (hisCall); ui->grid->setText (hisGrid); ui->name->clear (); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index b52ac578a..8d0aecf42 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -153,7 +153,7 @@ extern "C" { int savec2_(char const * fname, int* TR_seconds, double* dial_freq, fortran_charlen_t); - void avecho_( short id2[], int* dop, int* nfrit, int* nqual, float* f1, + void avecho_( short id2[], int* dop, int* nfrit, int* nauto, int* nqual, float* f1, float* level, float* sigdb, float* snr, float* dfreq, float* width); @@ -294,6 +294,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_secID {0}, m_idleMinutes {0}, m_nSubMode {0}, + m_nSubMode_Q65 {0}, + m_nSubMode_JT65 {0}, + m_nSubMode_JT4 {0}, m_nclearave {1}, m_nWSPRdecodes {0}, m_k0 {9999999}, @@ -750,7 +753,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, // ensure a balanced layout of the mode buttons qreal pointSize = m_config.text_font().pointSizeF(); - if (pointSize < 12) { + if (pointSize < 11) { ui->houndButton->setMaximumWidth(40); ui->ft8Button->setMaximumWidth(40); ui->ft4Button->setMaximumWidth(40); @@ -758,12 +761,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->q65Button->setMaximumWidth(40); ui->jt65Button->setMaximumWidth(40); } else { - ui->houndButton->setMinimumWidth(0); - ui->ft8Button->setMinimumWidth(0); - ui->ft4Button->setMinimumWidth(0); - ui->msk144Button->setMinimumWidth(0); - ui->q65Button->setMinimumWidth(0); - ui->jt65Button->setMinimumWidth(0); + ui->houndButton->setMinimumWidth(50); + ui->ft8Button->setMinimumWidth(50); + ui->ft4Button->setMinimumWidth(50); + ui->msk144Button->setMinimumWidth(50); + ui->q65Button->setMinimumWidth(50); + ui->jt65Button->setMinimumWidth(50); } // hook up save WAV file exit handling @@ -1171,7 +1174,7 @@ 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("SubMode",ui->sbSubmode->value()); m_settings->setValue("DTtol",m_DTtol); m_settings->setValue("Ftol", ui->sbFtol->value ()); m_settings->setValue("MinSync",m_minSync); @@ -1193,7 +1196,7 @@ 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 ("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); @@ -1277,8 +1280,14 @@ 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(); - ui->sbSubmode->setValue(m_nSubMode); +// 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(); @@ -1289,7 +1298,10 @@ void MainWindow::readSettings() 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()); +// 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", @@ -1411,6 +1423,7 @@ void MainWindow::setDecodedTextFont (QFont const& font) } if (m_contestLogWindow) { m_contestLogWindow->set_log_view_font (font); + m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso()); } if(m_ActiveStationsWidget != NULL) { m_ActiveStationsWidget->changeFont(font); @@ -1576,6 +1589,8 @@ void MainWindow::dataSink(qint64 frames) if(m_mode=="Echo") { float dBerr=0.0; int nfrit=0; + int nauto=0; + if(m_auto) nauto=1; int nqual=0; float f1=1500.0; float xlevel=0.0; @@ -1584,7 +1599,7 @@ void MainWindow::dataSink(qint64 frames) float width=0.0; echocom_.nclearave=m_nclearave; int nDop=0; - avecho_(dec_data.d2,&nDop,&nfrit,&nqual,&f1,&xlevel,&sigdb, + avecho_(dec_data.d2,&nDop,&nfrit,&nauto,&nqual,&f1,&xlevel,&sigdb, &dBerr,&dfreq,&width); QString t; t = t.asprintf("%3d %7.1f %7.1f %7.1f %7.1f %7.1f %3d",echocom_.nsum,xlevel,sigdb, @@ -2764,6 +2779,7 @@ void MainWindow::on_contest_log_action_triggered() m_contestLogWindow->showNormal (); m_contestLogWindow->raise (); m_contestLogWindow->activateWindow (); + m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso()); } void MainWindow::on_actionColors_triggered() @@ -3019,10 +3035,10 @@ void MainWindow::on_actionKeyboard_shortcuts_triggered() Alt+H Halt Tx Ctrl+L Lookup callsign in database, generate standard messages Alt+M Monitor - Alt+N Enable Tx + Alt+N Toggle "Enable Tx" Ctrl+O Open a .wav file Alt+O Change operator - Alt+Q Log QSO + Alt+Q Open "Log QSO" window Ctrl+R Set Tx4 message to RRR (not in FT4) Alt+R Set Tx4 message to RR73 Alt+S Stop monitoring @@ -4662,6 +4678,7 @@ void MainWindow::guiUpdate() //Once per second (onesec) if(nsec != m_sec0) { // qDebug() << "AAA" << nsec; + if(m_contestLogWindow) m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso()); if(m_mode=="FST4") chk_FST4_freq_range(); m_currentBand=m_config.bands()->find(m_freqNominal); @@ -6360,6 +6377,9 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, m_xSent.clear (); m_xRcvd.clear (); + if(m_contestLogWindow) { + m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso()); + } } void MainWindow::updateRate() @@ -6466,7 +6486,11 @@ void MainWindow::displayWidgets(qint64 n) void MainWindow::on_actionFST4_triggered() { - m_mode="FST4"; + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + on_sbSubmode_valueChanged(ui->sbSubmode->value()); + }); m_mode="FST4"; ui->actionFST4->setChecked(true); m_bFast9=false; @@ -6500,7 +6524,8 @@ void MainWindow::on_actionFST4_triggered() switch_mode (Modes::FST4); m_wideGraph->setMode(m_mode); ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800}); - on_sbTR_valueChanged (ui->sbTR->value()); + ui->sbTR->setValue (m_settings->value ("TRPeriod_FST4", 60).toInt()); // remember sbTR settings by mode + QTimer::singleShot (50, [=] {on_sbTR_valueChanged (ui->sbTR->value());}); statusChanged(); m_bOK_to_chk=true; chk_FST4_freq_range(); @@ -6538,6 +6563,11 @@ void MainWindow::on_actionFST4W_triggered() void MainWindow::on_actionFT4_triggered() { + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + on_sbSubmode_valueChanged(ui->sbSubmode->value()); + }); m_mode="FT4"; m_TRperiod=7.5; bool bVHF=m_config.enable_VHF_features(); @@ -6581,6 +6611,11 @@ void MainWindow::on_actionFT4_triggered() void MainWindow::on_actionFT8_triggered() { + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + on_sbSubmode_valueChanged(ui->sbSubmode->value()); + }); m_mode="FT8"; bool bVHF=m_config.enable_VHF_features(); m_bFast9=false; @@ -6694,6 +6729,10 @@ void MainWindow::on_actionFT8_triggered() void MainWindow::on_actionJT4_triggered() { + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + }); m_mode="JT4"; bool bVHF=m_config.enable_VHF_features(); WSPR_config(false); @@ -6720,7 +6759,10 @@ 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); +// 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);}); } else { ui->sbSubmode->setValue(0); } @@ -6736,6 +6778,7 @@ void MainWindow::on_actionJT4_triggered() void MainWindow::on_actionJT9_triggered() { + QTimer::singleShot (50, [=] {on_sbSubmode_valueChanged(ui->sbSubmode->value());}); m_mode="JT9"; bool bVHF=m_config.enable_VHF_features(); m_bFast9=ui->cbFast9->isChecked(); @@ -6795,6 +6838,10 @@ void MainWindow::on_actionJT9_triggered() void MainWindow::on_actionJT65_triggered() { + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + }); on_actionJT9_triggered(); m_mode="JT65"; bool bVHF=m_config.enable_VHF_features(); @@ -6821,8 +6868,11 @@ void MainWindow::on_actionJT65_triggered() m_bFast9=false; ui->sbSubmode->setMaximum(2); if(bVHF) { - ui->sbSubmode->setValue(m_nSubMode); - ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); +// 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);}); + ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); ui->rh_decodes_title_label->setText(tr ("Average Decodes")); } else { ui->sbSubmode->setValue(0); @@ -6845,6 +6895,10 @@ void MainWindow::on_actionJT65_triggered() void MainWindow::on_actionQ65_triggered() { + QTimer::singleShot (50, [=] { + ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq_old",1500).toInt()); + ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq_old",1500).toInt()); + }); m_mode="Q65"; ui->actionQ65->setChecked(true); switch_mode(Modes::Q65); @@ -6857,8 +6911,12 @@ void MainWindow::on_actionQ65_triggered() Q_EMIT FFTSize(m_FFTSize); m_hsymStop=49; ui->sbTR->values ({15, 30, 60, 120, 300}); - on_sbTR_valueChanged (ui->sbTR->value()); - ui->sbSubmode->setValue(m_nSubMode); + 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);}); QString fname {QDir::toNativeSeparators(m_config.temp_dir().absoluteFilePath ("red.dat"))}; m_wideGraph->setRedFile(fname); m_wideGraph->setMode(m_mode); @@ -6928,7 +6986,11 @@ void MainWindow::on_actionMSK144_triggered() m_bFastMode=true; m_bFast9=false; ui->sbTR->values ({5, 10, 15, 30}); - on_sbTR_valueChanged (ui->sbTR->value()); + 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()); + }); m_wideGraph->hide(); m_fastGraph->showNormal(); ui->TxFreqSpinBox->setValue(1500); @@ -7090,7 +7152,7 @@ void MainWindow::WSPR_config(bool b) ui->rh_decodes_widget->setVisible(!b); ui->controls_stack_widget->setCurrentIndex (b && m_mode != "Echo" ? 1 : 0); ui->QSO_controls_widget->setVisible (!b); - ui->DX_controls_widget->setVisible (!b); + ui->DX_controls_widget->setVisible (!b or (m_mode=="Echo")); ui->WSPR_controls_widget->setVisible (b); ui->lh_decodes_title_label->setVisible(!b and ui->cbMenus->isChecked()); ui->logQSOButton->setVisible(!b); @@ -7148,7 +7210,9 @@ void MainWindow::on_TxFreqSpinBox_valueChanged(int n) ui->TxFreqSpinBox->setStyleSheet(""); } } - + if (m_mode != "MSK144" && m_mode != "FST4W" && m_mode != "WSPR" && m_mode != "Echo" && m_mode != "FreqCal") { + QTimer::singleShot (200, [=] {m_settings->setValue("TxFreq_old",ui->TxFreqSpinBox->value());}); + } statusUpdate (); } @@ -7158,6 +7222,9 @@ void MainWindow::on_RxFreqSpinBox_valueChanged(int n) if (m_mode == "FreqCal") { setRig (); } + if (m_mode != "MSK144" && m_mode != "FST4W" && m_mode != "WSPR" && m_mode != "Echo" && m_mode != "FreqCal") { + QTimer::singleShot (200, [=] {m_settings->setValue("RxFreq_old",ui->RxFreqSpinBox->value());}); + } statusUpdate (); } @@ -8046,7 +8113,16 @@ void MainWindow::on_sbTR_valueChanged(int value) m_wideGraph->setPeriod (value, m_nsps); progressBar.setMaximum (value); } - if(m_mode=="FST4") chk_FST4_freq_range(); + 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? ### on_sbSubmode_valueChanged(ui->sbSubmode->value()); statusUpdate (); @@ -8102,6 +8178,10 @@ void MainWindow::on_sbSubmode_valueChanged(int n) 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 (); } diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 9784cc621..01c142e88 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -461,6 +461,9 @@ private: qint32 m_secID; qint32 m_idleMinutes; qint32 m_nSubMode; + qint32 m_nSubMode_Q65; + qint32 m_nSubMode_JT65; + qint32 m_nSubMode_JT4; qint32 m_nclearave; qint32 m_minSync; qint32 m_dBm;