Merge branch 'develop'

This commit is contained in:
Joe Taylor 2022-07-15 13:01:34 -04:00
commit fadda93f2f
18 changed files with 274 additions and 57 deletions

View File

@ -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}")
#

35
NEWS
View File

@ -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
----------------------

View File

@ -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
----------------------

View File

@ -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);
}

View File

@ -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 &#160; &#160; ?
|a7|(Call_1 or CQ) Call_2 &#160; &#160; ?
|===
If a codeword is found that is judged to have high (but not

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 ();

View File

@ -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.";
}

View File

@ -10,6 +10,7 @@
#include <QSqlTableModel>
#include <QItemSelectionModel>
#include <QItemSelection>
#include <QTimer>
#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)

View File

@ -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);
}

View File

@ -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;

View File

@ -27,6 +27,22 @@
</attribute>
</widget>
</item>
<item>
<widget class="QLineEdit" name="nQSO_lineEdit">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>0 QSOs</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@ -5,6 +5,7 @@
#include <QSettings>
#include <QStandardPaths>
#include <QDir>
#include <QPushButton>
#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 ();

View File

@ -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()
<tr><td><b>Alt+H </b></td><td>Halt Tx</td></tr>
<tr><td><b>Ctrl+L </b></td><td>Lookup callsign in database, generate standard messages</td></tr>
<tr><td><b>Alt+M </b></td><td>Monitor</td></tr>
<tr><td><b>Alt+N </b></td><td>Enable Tx</td></tr>
<tr><td><b>Alt+N </b></td><td>Toggle "Enable Tx"</td></tr>
<tr><td><b>Ctrl+O </b></td><td>Open a .wav file</td></tr>
<tr><td><b>Alt+O </b></td><td>Change operator</td></tr>
<tr><td><b>Alt+Q </b></td><td>Log QSO</td></tr>
<tr><td><b>Alt+Q </b></td><td>Open "Log QSO" window</td></tr>
<tr><td><b>Ctrl+R </b></td><td>Set Tx4 message to RRR (not in FT4)</td></tr>
<tr><td><b>Alt+R </b></td><td>Set Tx4 message to RR73</td></tr>
<tr><td><b>Alt+S </b></td><td>Stop monitoring</td></tr>
@ -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 ();
}

View File

@ -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;