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) include (set_build_type)
# RC 0 or omitted is a development build, GA is a General Availability release build # RC 0 or omitted is a development build, GA is a General Availability release build
set_build_type (RC 1) set_build_type (RC 2)
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
# #

35
NEWS
View File

@ -11,6 +11,41 @@
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team 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 Release: WSJT-X 2.6.0-rc1
June 20, 2022 June 20, 2022
---------------------- ----------------------

View File

@ -11,6 +11,41 @@
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team 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 Release: WSJT-X 2.6.0-rc1
June 20, 2022 June 20, 2022
---------------------- ----------------------
@ -85,6 +120,7 @@ In program MAP65 (Windows only):
- Suppress a bounds error caused by too-wide setting of display - Suppress a bounds error caused by too-wide setting of display
bandwidth bandwidth
Release: WSJT-X 2.5.4 Release: WSJT-X 2.5.4
Dec 28, 2021 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 // to frequency such as the TS-2000 auto mode setting
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode)); 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")); 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); update_mode (m);
} }

View File

@ -38,7 +38,7 @@ uses information from the previous Rx sequence.
|a4|MyCall DxCall RRR |a4|MyCall DxCall RRR
|a5|MyCall DxCall 73 |a5|MyCall DxCall 73
|a6|MyCall DxCall RR73 |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 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 uth8,techo8,freq8
real*8 xl,b real*8 xl,b
common/librcom/xl(2),b(2) common/librcom/xl(2),b(2)
common/echocom2/echo_spread common/echocom2/fspread_self,fspread_dx
data uth8z/0.d0/ data uth8z/0.d0/
save save
@ -43,9 +43,11 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
dbdt2=DEGS*(b2a-b2) dbdt2=DEGS*(b2a-b2)
rate1=2.0*sqrt(dldt1**2 + dbdt1**2) rate1=2.0*sqrt(dldt1**2 + dbdt1**2)
width1=0.5*6741*fghz*rate1 width1=0.5*6741*fghz*rate1
echo_spread=width1 !Save echo_spread for avecho()
rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2) rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2)
width2=0.5*6741*fghz*rate2 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 AzSun8=AzSun
ElSun8=ElSun 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 integer TXLENGTH
parameter (TXLENGTH=27648) !27*1024 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) complex c(0:NH)
equivalence (x,c),(ipk,ipkv) equivalence (x,c),(ipk,ipkv)
common/echocom/nclearave,nsum,blue(NZ),red(NZ) common/echocom/nclearave,nsum,blue(NZ),red(NZ)
common/echocom2/echo_spread common/echocom2/fspread_self,fspread_dx
save dop0,sa,sb 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) inquire(file='fspread.txt',exist=ex)
if(ex) then if(ex) then
open(39,file='fspread.txt',status='old') open(39,file='fspread.txt',status='old')
read(39,*) fspread read(39,*) fspread
close(39) close(39)
endif endif
fspread=min(max(0.1,fspread),700.0)
width=fspread width=fspread
dop=ndop dop=ndop
sq=0. sq=0.
do i=1,TXLENGTH do i=1,TXLENGTH

View File

@ -3,7 +3,8 @@ subroutine grid2deg(grid0,dlong,dlat)
! Converts Maidenhead grid locator to degrees of West longitude ! Converts Maidenhead grid locator to degrees of West longitude
! and North latitude. ! and North latitude.
character*6 grid0,grid character*(*) grid0
character*6 grid
character*1 g1,g2,g3,g4,g5,g6 character*1 g1,g2,g3,g4,g5,g6
grid=grid0 grid=grid0

View File

@ -234,8 +234,10 @@ bool CabrilloLog::add_QSO (Frequency frequency, QString const& mode, QDateTime c
m_->adding_row_ = true; m_->adding_row_ = true;
auto ok = m_->insertRecord (-1, record); auto ok = m_->insertRecord (-1, record);
transaction.submit (); transaction.submit ();
m_->adding_row_ = false; m_->adding_row_ = false;
m_->setEditStrategy (QSqlTableModel::OnFieldChange); m_->setEditStrategy (QSqlTableModel::OnFieldChange);
return ok; return ok;
} }
@ -256,6 +258,11 @@ bool CabrilloLog::dupe (Frequency frequency, QString const& call) const
return false; return false;
} }
int CabrilloLog::n_qso()
{
return m_->rowCount();
}
void CabrilloLog::reset () void CabrilloLog::reset ()
{ {
// synchronize model // synchronize model

View File

@ -31,6 +31,7 @@ public:
bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call
, QString const& report_sent, QString const& report_received); , QString const& report_sent, QString const& report_received);
bool dupe (Frequency, QString const& call) const; bool dupe (Frequency, QString const& call) const;
int n_qso();
QSqlTableModel * model (); QSqlTableModel * model ();
void reset (); void reset ();

View File

@ -80,6 +80,5 @@ QString version (bool include_patch)
QString program_title (QString const& revision) QString program_title (QString const& revision)
{ {
QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()}; QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()};
// return id + " " + revision + " by K1JT, G4WJS, K9AN, and IV3NWV"; return id + " " + revision + " by K1JT et al.";
return id + " " + revision;
} }

View File

@ -10,6 +10,7 @@
#include <QSqlTableModel> #include <QSqlTableModel>
#include <QItemSelectionModel> #include <QItemSelectionModel>
#include <QItemSelection> #include <QItemSelection>
#include <QTimer>
#include "Configuration.hpp" #include "Configuration.hpp"
#include "SettingsGroup.hpp" #include "SettingsGroup.hpp"
#include "MessageBox.hpp" #include "MessageBox.hpp"
@ -88,29 +89,37 @@ void AbstractLogWindow::impl::delete_QSOs ()
} }
} }
AbstractLogWindow::AbstractLogWindow (QString const& settings_key, QSettings * settings AbstractLogWindow::AbstractLogWindow (QString const& settings_key, QSettings * settings
, Configuration const * configuration , Configuration const * configuration
, QWidget * parent) , QWidget * parent)
: QWidget {parent} : QWidget {parent}
, m_ {this, settings_key, settings, configuration} , m_ {this, settings_key, settings, configuration} {
{ // when we're viewing the log by contact ID (visually, up/down chevron in the column heading),
// this attempt to scroll to the last new record doesn't work, some // when we add a contact, scroll the list to the top or bottom, depending on the sort order.
// sort of issue with model indexes and optimized DB fetches. For // If the table is sorted by some other criteria, don't change anything.
// 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
// // ensure view scrolls to latest new row connect(&m_->model_, &QAbstractItemModel::rowsInserted, this,
// connect (&m_->model_, &QAbstractItemModel::rowsInserted, this, [this] (QModelIndex const& parent, int first, int last) { [this](QModelIndex const &parent, int first, int last) {
// // note col 0 is hidden so use col 1 (void) (parent); // UNUSED
// // queued connection required otherwise row may not be available (void) (first); // UNUSED
// // in time (void) (last); // UNUSED
// auto index = m_->model_.index (last, 1, parent); QTimer::singleShot(0, [=] {
// if (m_->log_view_) // if we're sorting by the date, then show the most-recently logged contact.
// { // Otherwise, leave the scroll alone
// m_->log_view_->scrollTo (index); auto horizontal_header = m_->log_view_->horizontalHeader ();
// } if (horizontal_header->sortIndicatorSection() == 3) { // sorting on date?
// }, Qt::QueuedConnection); 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 () AbstractLogWindow::~AbstractLogWindow ()
@ -134,11 +143,14 @@ void AbstractLogWindow::set_log_view (QTableView * log_view)
log_view->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel); log_view->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
m_->model_.setSourceModel (log_view->model ()); m_->model_.setSourceModel (log_view->model ());
log_view->setModel (&m_->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 (); auto horizontal_header = log_view->horizontalHeader ();
horizontal_header->setResizeContentsPrecision (0); // visible region only horizontal_header->setResizeContentsPrecision (0); // visible region only
horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents); horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents);
horizontal_header->setSectionsMovable (true); horizontal_header->setSectionsMovable (true);
horizontal_header->setSortIndicator(3, Qt::AscendingOrder); // sort by the contact datetime oldest->newest
auto vertical_header = log_view->horizontalHeader (); auto vertical_header = log_view->horizontalHeader ();
vertical_header->setResizeContentsPrecision (0); // visible region only vertical_header->setResizeContentsPrecision (0); // visible region only
vertical_header->setSectionResizeMode (QHeaderView::ResizeToContents); 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*/) { connect (delete_action, &QAction::triggered, [this] (bool /*checked*/) {
m_->delete_QSOs (); m_->delete_QSOs ();
}); });
// scroll to bottom, since we're showing 1-N
log_view->scrollToBottom();
} }
void AbstractLogWindow::set_log_view_font (QFont const& font) 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 (3, new SQLiteDateTimeDelegate {this});
m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this});
auto h_header = m_->ui_.log_table_view->horizontalHeader (); 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 h_header->moveSection (7, 1); // band to first column
} }
@ -88,3 +89,10 @@ void CabrilloLogWindow::log_model_changed (int row)
m_->log_model_->select (); 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 explicit CabrilloLogWindow (QSettings *, Configuration const *, QSqlTableModel * cabrillo_log_model
, QWidget * parent = nullptr); , QWidget * parent = nullptr);
~CabrilloLogWindow (); ~CabrilloLogWindow ();
void set_nQSO(int n);
private: private:
void log_model_changed (int row) override; void log_model_changed (int row) override;

View File

@ -27,6 +27,22 @@
</attribute> </attribute>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
<resources/> <resources/>

View File

@ -5,6 +5,7 @@
#include <QSettings> #include <QSettings>
#include <QStandardPaths> #include <QStandardPaths>
#include <QDir> #include <QDir>
#include <QPushButton>
#include "logbook/logbook.h" #include "logbook/logbook.h"
#include "MessageBox.hpp" #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) Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd)
{ {
if(!isHidden()) return; 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->call->setText (hisCall);
ui->grid->setText (hisGrid); ui->grid->setText (hisGrid);
ui->name->clear (); 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); 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* level, float* sigdb, float* snr, float* dfreq,
float* width); float* width);
@ -294,6 +294,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_secID {0}, m_secID {0},
m_idleMinutes {0}, m_idleMinutes {0},
m_nSubMode {0}, m_nSubMode {0},
m_nSubMode_Q65 {0},
m_nSubMode_JT65 {0},
m_nSubMode_JT4 {0},
m_nclearave {1}, m_nclearave {1},
m_nWSPRdecodes {0}, m_nWSPRdecodes {0},
m_k0 {9999999}, m_k0 {9999999},
@ -750,7 +753,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
// ensure a balanced layout of the mode buttons // ensure a balanced layout of the mode buttons
qreal pointSize = m_config.text_font().pointSizeF(); qreal pointSize = m_config.text_font().pointSizeF();
if (pointSize < 12) { if (pointSize < 11) {
ui->houndButton->setMaximumWidth(40); ui->houndButton->setMaximumWidth(40);
ui->ft8Button->setMaximumWidth(40); ui->ft8Button->setMaximumWidth(40);
ui->ft4Button->setMaximumWidth(40); ui->ft4Button->setMaximumWidth(40);
@ -758,12 +761,12 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->q65Button->setMaximumWidth(40); ui->q65Button->setMaximumWidth(40);
ui->jt65Button->setMaximumWidth(40); ui->jt65Button->setMaximumWidth(40);
} else { } else {
ui->houndButton->setMinimumWidth(0); ui->houndButton->setMinimumWidth(50);
ui->ft8Button->setMinimumWidth(0); ui->ft8Button->setMinimumWidth(50);
ui->ft4Button->setMinimumWidth(0); ui->ft4Button->setMinimumWidth(50);
ui->msk144Button->setMinimumWidth(0); ui->msk144Button->setMinimumWidth(50);
ui->q65Button->setMinimumWidth(0); ui->q65Button->setMinimumWidth(50);
ui->jt65Button->setMinimumWidth(0); ui->jt65Button->setMinimumWidth(50);
} }
// hook up save WAV file exit handling // 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("FST4W_FTol",ui->sbFST4W_FTol->value());
m_settings->setValue("FST4_FLow",ui->sbF_Low->value()); m_settings->setValue("FST4_FLow",ui->sbF_Low->value());
m_settings->setValue("FST4_FHigh",ui->sbF_High->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("DTtol",m_DTtol);
m_settings->setValue("Ftol", ui->sbFtol->value ()); m_settings->setValue("Ftol", ui->sbFtol->value ());
m_settings->setValue("MinSync",m_minSync); m_settings->setValue("MinSync",m_minSync);
@ -1193,7 +1196,7 @@ void MainWindow::writeSettings()
m_settings->setValue("UploadSpots",m_uploadWSPRSpots); m_settings->setValue("UploadSpots",m_uploadWSPRSpots);
m_settings->setValue("NoOwnCall",ui->cbNoOwnCall->isChecked()); m_settings->setValue("NoOwnCall",ui->cbNoOwnCall->isChecked());
m_settings->setValue ("BandHopping", ui->band_hopping_group_box->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 ("MaxDrift", ui->sbMaxDrift->value());
m_settings->setValue ("TRPeriod_FST4W", ui->sbTR_FST4W->value ()); m_settings->setValue ("TRPeriod_FST4W", ui->sbTR_FST4W->value ());
m_settings->setValue("FastMode",m_bFastMode); 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->sbFST4W_RxFreq->setValue(m_settings->value("FST4W_RxFreq",1500).toInt());
ui->sbF_Low->setValue(m_settings->value("FST4_FLow",600).toInt()); ui->sbF_Low->setValue(m_settings->value("FST4_FLow",600).toInt());
ui->sbF_High->setValue(m_settings->value("FST4_FHigh",1400).toInt()); ui->sbF_High->setValue(m_settings->value("FST4_FHigh",1400).toInt());
m_nSubMode=m_settings->value("SubMode",0).toInt(); // m_nSubMode=m_settings->value("SubMode",0).toInt();
ui->sbSubmode->setValue(m_nSubMode); 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->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt()); ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt());
m_minSync=m_settings->value("MinSync",0).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_bSWL=m_settings->value("SWL",false).toBool();
m_bFast9=m_settings->value("Fast9",false).toBool(); m_bFast9=m_settings->value("Fast9",false).toBool();
m_bFastMode=m_settings->value("FastMode",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->sbMaxDrift->setValue (m_settings->value ("MaxDrift",0).toInt());
ui->sbTR_FST4W->setValue (m_settings->value ("TRPeriod_FST4W", 15).toInt()); ui->sbTR_FST4W->setValue (m_settings->value ("TRPeriod_FST4W", 15).toInt());
m_lastMonitoredFrequency = m_settings->value ("DialFreq", m_lastMonitoredFrequency = m_settings->value ("DialFreq",
@ -1411,6 +1423,7 @@ void MainWindow::setDecodedTextFont (QFont const& font)
} }
if (m_contestLogWindow) { if (m_contestLogWindow) {
m_contestLogWindow->set_log_view_font (font); m_contestLogWindow->set_log_view_font (font);
m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso());
} }
if(m_ActiveStationsWidget != NULL) { if(m_ActiveStationsWidget != NULL) {
m_ActiveStationsWidget->changeFont(font); m_ActiveStationsWidget->changeFont(font);
@ -1576,6 +1589,8 @@ void MainWindow::dataSink(qint64 frames)
if(m_mode=="Echo") { if(m_mode=="Echo") {
float dBerr=0.0; float dBerr=0.0;
int nfrit=0; int nfrit=0;
int nauto=0;
if(m_auto) nauto=1;
int nqual=0; int nqual=0;
float f1=1500.0; float f1=1500.0;
float xlevel=0.0; float xlevel=0.0;
@ -1584,7 +1599,7 @@ void MainWindow::dataSink(qint64 frames)
float width=0.0; float width=0.0;
echocom_.nclearave=m_nclearave; echocom_.nclearave=m_nclearave;
int nDop=0; 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); &dBerr,&dfreq,&width);
QString t; QString t;
t = t.asprintf("%3d %7.1f %7.1f %7.1f %7.1f %7.1f %3d",echocom_.nsum,xlevel,sigdb, 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->showNormal ();
m_contestLogWindow->raise (); m_contestLogWindow->raise ();
m_contestLogWindow->activateWindow (); m_contestLogWindow->activateWindow ();
m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso());
} }
void MainWindow::on_actionColors_triggered() 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>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>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+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>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+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>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+R </b></td><td>Set Tx4 message to RR73</td></tr>
<tr><td><b>Alt+S </b></td><td>Stop monitoring</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) //Once per second (onesec)
if(nsec != m_sec0) { if(nsec != m_sec0) {
// qDebug() << "AAA" << nsec; // qDebug() << "AAA" << nsec;
if(m_contestLogWindow) m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso());
if(m_mode=="FST4") chk_FST4_freq_range(); if(m_mode=="FST4") chk_FST4_freq_range();
m_currentBand=m_config.bands()->find(m_freqNominal); 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_xSent.clear ();
m_xRcvd.clear (); m_xRcvd.clear ();
if(m_contestLogWindow) {
m_contestLogWindow->set_nQSO(m_logBook.contest_log()->n_qso());
}
} }
void MainWindow::updateRate() void MainWindow::updateRate()
@ -6466,7 +6486,11 @@ void MainWindow::displayWidgets(qint64 n)
void MainWindow::on_actionFST4_triggered() 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"; m_mode="FST4";
ui->actionFST4->setChecked(true); ui->actionFST4->setChecked(true);
m_bFast9=false; m_bFast9=false;
@ -6500,7 +6524,8 @@ void MainWindow::on_actionFST4_triggered()
switch_mode (Modes::FST4); switch_mode (Modes::FST4);
m_wideGraph->setMode(m_mode); m_wideGraph->setMode(m_mode);
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800}); 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(); statusChanged();
m_bOK_to_chk=true; m_bOK_to_chk=true;
chk_FST4_freq_range(); chk_FST4_freq_range();
@ -6538,6 +6563,11 @@ void MainWindow::on_actionFST4W_triggered()
void MainWindow::on_actionFT4_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_mode="FT4";
m_TRperiod=7.5; m_TRperiod=7.5;
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
@ -6581,6 +6611,11 @@ void MainWindow::on_actionFT4_triggered()
void MainWindow::on_actionFT8_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"; m_mode="FT8";
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
m_bFast9=false; m_bFast9=false;
@ -6694,6 +6729,10 @@ void MainWindow::on_actionFT8_triggered()
void MainWindow::on_actionJT4_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"; m_mode="JT4";
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
WSPR_config(false); 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->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
if(bVHF) { 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 { } else {
ui->sbSubmode->setValue(0); ui->sbSubmode->setValue(0);
} }
@ -6736,6 +6778,7 @@ void MainWindow::on_actionJT4_triggered()
void MainWindow::on_actionJT9_triggered() void MainWindow::on_actionJT9_triggered()
{ {
QTimer::singleShot (50, [=] {on_sbSubmode_valueChanged(ui->sbSubmode->value());});
m_mode="JT9"; m_mode="JT9";
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
m_bFast9=ui->cbFast9->isChecked(); m_bFast9=ui->cbFast9->isChecked();
@ -6795,6 +6838,10 @@ void MainWindow::on_actionJT9_triggered()
void MainWindow::on_actionJT65_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(); on_actionJT9_triggered();
m_mode="JT65"; m_mode="JT65";
bool bVHF=m_config.enable_VHF_features(); bool bVHF=m_config.enable_VHF_features();
@ -6821,8 +6868,11 @@ void MainWindow::on_actionJT65_triggered()
m_bFast9=false; m_bFast9=false;
ui->sbSubmode->setMaximum(2); ui->sbSubmode->setMaximum(2);
if(bVHF) { if(bVHF) {
ui->sbSubmode->setValue(m_nSubMode); // ui->sbSubmode->setValue(m_nSubMode);
ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); 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")); ui->rh_decodes_title_label->setText(tr ("Average Decodes"));
} else { } else {
ui->sbSubmode->setValue(0); ui->sbSubmode->setValue(0);
@ -6845,6 +6895,10 @@ void MainWindow::on_actionJT65_triggered()
void MainWindow::on_actionQ65_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"; m_mode="Q65";
ui->actionQ65->setChecked(true); ui->actionQ65->setChecked(true);
switch_mode(Modes::Q65); switch_mode(Modes::Q65);
@ -6857,8 +6911,12 @@ void MainWindow::on_actionQ65_triggered()
Q_EMIT FFTSize(m_FFTSize); Q_EMIT FFTSize(m_FFTSize);
m_hsymStop=49; m_hsymStop=49;
ui->sbTR->values ({15, 30, 60, 120, 300}); ui->sbTR->values ({15, 30, 60, 120, 300});
on_sbTR_valueChanged (ui->sbTR->value()); ui->sbTR->setValue (m_settings->value ("TRPeriod_Q65", 30).toInt()); // remember sbTR settings by mode
ui->sbSubmode->setValue(m_nSubMode); 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"))}; QString fname {QDir::toNativeSeparators(m_config.temp_dir().absoluteFilePath ("red.dat"))};
m_wideGraph->setRedFile(fname); m_wideGraph->setRedFile(fname);
m_wideGraph->setMode(m_mode); m_wideGraph->setMode(m_mode);
@ -6928,7 +6986,11 @@ void MainWindow::on_actionMSK144_triggered()
m_bFastMode=true; m_bFastMode=true;
m_bFast9=false; m_bFast9=false;
ui->sbTR->values ({5, 10, 15, 30}); 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_wideGraph->hide();
m_fastGraph->showNormal(); m_fastGraph->showNormal();
ui->TxFreqSpinBox->setValue(1500); ui->TxFreqSpinBox->setValue(1500);
@ -7090,7 +7152,7 @@ void MainWindow::WSPR_config(bool b)
ui->rh_decodes_widget->setVisible(!b); ui->rh_decodes_widget->setVisible(!b);
ui->controls_stack_widget->setCurrentIndex (b && m_mode != "Echo" ? 1 : 0); ui->controls_stack_widget->setCurrentIndex (b && m_mode != "Echo" ? 1 : 0);
ui->QSO_controls_widget->setVisible (!b); 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->WSPR_controls_widget->setVisible (b);
ui->lh_decodes_title_label->setVisible(!b and ui->cbMenus->isChecked()); ui->lh_decodes_title_label->setVisible(!b and ui->cbMenus->isChecked());
ui->logQSOButton->setVisible(!b); ui->logQSOButton->setVisible(!b);
@ -7148,7 +7210,9 @@ void MainWindow::on_TxFreqSpinBox_valueChanged(int n)
ui->TxFreqSpinBox->setStyleSheet(""); 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 (); statusUpdate ();
} }
@ -7158,6 +7222,9 @@ void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
if (m_mode == "FreqCal") { if (m_mode == "FreqCal") {
setRig (); 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 (); statusUpdate ();
} }
@ -8046,7 +8113,16 @@ void MainWindow::on_sbTR_valueChanged(int value)
m_wideGraph->setPeriod (value, m_nsps); m_wideGraph->setPeriod (value, m_nsps);
progressBar.setMaximum (value); 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? ### // if(m_transmitting) on_stopTxButton_clicked(); //### Is this needed or desirable? ###
on_sbSubmode_valueChanged(ui->sbSubmode->value()); on_sbSubmode_valueChanged(ui->sbSubmode->value());
statusUpdate (); statusUpdate ();
@ -8102,6 +8178,10 @@ void MainWindow::on_sbSubmode_valueChanged(int n)
if(m_bFast9) ui->TxFreqSpinBox->setValue(700); if(m_bFast9) ui->TxFreqSpinBox->setValue(700);
} }
if(m_transmitting and m_bFast9 and m_nSubMode>=4) transmit (99.0); 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 (); statusUpdate ();
} }

View File

@ -461,6 +461,9 @@ private:
qint32 m_secID; qint32 m_secID;
qint32 m_idleMinutes; qint32 m_idleMinutes;
qint32 m_nSubMode; qint32 m_nSubMode;
qint32 m_nSubMode_Q65;
qint32 m_nSubMode_JT65;
qint32 m_nSubMode_JT4;
qint32 m_nclearave; qint32 m_nclearave;
qint32 m_minSync; qint32 m_minSync;
qint32 m_dBm; qint32 m_dBm;