From df37d9b1f7b5d2ae5ea9b6ad7df28a6d77af79d5 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Fri, 30 Nov 2018 13:46:54 -0600 Subject: [PATCH 01/13] Remove cqhund stuff and some other unused code. --- lib/ft8/ft8b.f90 | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 68d148c65..83a6a9cbf 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -17,13 +17,11 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & real s8(0:7,NN) real s2(0:511),s2l(0:511) real bmeta(174),bmetb(174),bmetc(174) - real bmetal(174),bmetbl(174),bmetcl(174) real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols - real llral(174),llrbl(174),llrcl(174) !Soft symbols real dd0(15*12000) integer*1 message77(77),apmask(174),cw(174) integer apsym(58) - integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29),mcqhund(29) + integer mcq(29),mcqru(29),mcqfd(29),mcqtest(29) integer mrrr(19),m73(19),mrr73(19) integer itone(NN) integer icos7(0:6),ip(1) @@ -43,7 +41,6 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & data mcqru/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0/ data mcqfd/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0/ data mcqtest/0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0/ - data mcqhund/0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,0,1,1,1,0,0/ data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/ data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/ data mrr73/0,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0,1/ @@ -57,7 +54,6 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & mcqfd=2*mcqfd-1 mcqru=2*mcqru-1 mcqtest=2*mcqtest-1 - mcqhund=2*mcqhund-1 mrrr=2*mrrr-1 m73=2*m73-1 mrr73=2*mrr73-1 @@ -205,37 +201,26 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & do ib=0,ibmax bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - & maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)) -! bml=maxval(s2l(0:nt-1),one(0:nt-1,ibmax-ib)) - & -! maxval(s2l(0:nt-1),.not.one(0:nt-1,ibmax-ib)) if(i32+ib .gt.174) cycle if(nsym.eq.1) then bmeta(i32+ib)=bm -! bmetal(i32+ib)=bml elseif(nsym.eq.2) then bmetb(i32+ib)=bm -! bmetbl(i32+ib)=bml elseif(nsym.eq.3) then bmetc(i32+ib)=bm -! bmetcl(i32+ib)=bml endif enddo enddo enddo enddo call normalizebmet(bmeta,174) -! call normalizebmet(bmetal,174) call normalizebmet(bmetb,174) -! call normalizebmet(bmetbl,174) call normalizebmet(bmetc,174) -! call normalizebmet(bmetcl,174) scalefac=2.83 llra=scalefac*bmeta -! llral=scalefac*bmetal llrb=scalefac*bmetb -! llrbl=scalefac*bmetbl llrc=scalefac*bmetc -! llrcl=scalefac*bmetcl apmag=maxval(abs(llra))*1.01 @@ -300,7 +285,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & if(ncontest.eq.2) llrd(1:29)=apmag*mcqtest(1:29) if(ncontest.eq.3) llrd(1:29)=apmag*mcqfd(1:29) if(ncontest.eq.4) llrd(1:29)=apmag*mcqru(1:29) - if(ncontest.eq.6) llrd(1:29)=apmag*mcqhund(1:29) + if(ncontest.eq.6) llrd(1:29)=apmag*mcq(1:29) apmask(75:77)=1 llrd(75:76)=apmag*(-1) llrd(77)=apmag*(+1) From d08ee43fc61c2bb8a919a4ad2c9a64f26e09b6fc Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 30 Nov 2018 15:52:11 -0500 Subject: [PATCH 02/13] Set m_mode_Tx="JT9" when mode is switched to JT9. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index af8fca7d5..97e025931 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5638,7 +5638,7 @@ void MainWindow::on_actionJT9_triggered() m_bFastMode=m_bFast9; WSPR_config(false); switch_mode (Modes::JT9); - if(m_modeTx!="JT9") on_pbTxMode_clicked(); + m_modeTx="JT9"; m_nsps=6912; m_FFTSize = m_nsps / 2; Q_EMIT FFTSize (m_FFTSize); From cb782c3d1940e3c47c829d301db3929acdbbf80d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 30 Nov 2018 21:50:44 +0000 Subject: [PATCH 03/13] Fix invalid member function pointer reference --- logbook/WorkedBefore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp index ee934a5ff..160e1fa8e 100644 --- a/logbook/WorkedBefore.cpp +++ b/logbook/WorkedBefore.cpp @@ -379,7 +379,7 @@ public: WorkedBefore::WorkedBefore () { - connect (&m_->loader_watcher_, QFutureWatcher::finished, [this] () { + connect (&m_->loader_watcher_, &QFutureWatcher::finished, [this] () { QString error; size_t n {0}; try From 42d68ff84e3ecca79d7b66d3fda044f638250a8a Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Sat, 1 Dec 2018 09:17:58 -0600 Subject: [PATCH 04/13] Add frequency drift (Hz/min) option to jt65sim. --- lib/jt65sim.f90 | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/jt65sim.f90 b/lib/jt65sim.f90 index 0e57962ce..6f7030cf4 100644 --- a/lib/jt65sim.f90 +++ b/lib/jt65sim.f90 @@ -21,12 +21,13 @@ program jt65sim character msg*22,fname*11,csubmode*1,c,optarg*500,numbuf*32 ! character call1*5,call2*5 logical :: display_help=.false.,seed_prngs=.true. - type (option) :: long_options(12) = [ & + type (option) :: long_options(13) = [ & option ('help',.false.,'h','Display this help message',''), & option ('sub-mode',.true.,'m','sub mode, default MODE=A','MODE'), & option ('num-sigs',.true.,'n','number of signals per file, default SIGNALS=10','SIGNALS'), & option ('f0',.true.,'F','base frequency offset, default F0=1500.0','F0'), & option ('doppler-spread',.true.,'d','Doppler spread, default SPREAD=0.0','SPREAD'), & + option ('drift per min',.true.,'D','Frequency drift (Hz/min), default DRIFT=0.0','DRIFT'), & option ('time-offset',.true.,'t','Time delta, default SECONDS=0.0','SECONDS'), & option ('num-files',.true.,'f','Number of files to generate, default FILES=1','FILES'), & option ('no-prng-seed',.false.,'p','Do not seed PRNGs (use for reproducible tests)',''), & @@ -50,6 +51,7 @@ program jt65sim nsigs=10 bf0=1500. fspread=0. + drift=0. xdt=0. snrdb=0. nfiles=1 @@ -58,7 +60,7 @@ program jt65sim msg="K1ABC W9XYZ EN37" do - call getopt('hm:n:F:d:t:f:ps:SG:M:',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) + call getopt('hm:n:F:d:D:t:f:ps:SG:M:',long_options,c,optarg,narglen,nstat,noffset,nremain,.true.) if( nstat .ne. 0 ) then exit end if @@ -76,6 +78,8 @@ program jt65sim read (optarg(:narglen), *,err=10) bf0 case ('d') read (optarg(:narglen), *,err=10) fspread + case ('D') + read (optarg(:narglen), *,err=10) drift case ('t') read (optarg(:narglen), *) numbuf if (numbuf(1:1) == '\') then !'\' @@ -217,11 +221,8 @@ program jt65sim do i=1,npts !Add this signal into cdat() isym=floor(i/sps)+1 if(isym.gt.nsym) exit - if(isym.ne.isym0) then - freq=f0 + itone(isym)*baud*mode65 - dphi=twopi*freq*dt - isym0=isym - endif + freq=f0 + (drift/60.0)*(i-npts/2)*dt + itone(isym)*baud*mode65 + dphi=twopi*freq*dt phi=phi + dphi if(phi.gt.twopi) phi=phi-twopi xphi=phi From 94bbe52c73c3d9ab40b988690e54f90881520786 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 1 Dec 2018 13:16:57 -0500 Subject: [PATCH 05/13] Fixes several QDateTime time spec issues that effected contest logs and Cabrillo exports --- item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp | 10 ++++++++-- models/CabrilloLog.cpp | 1 - widgets/logqso.cpp | 1 - widgets/logqso.ui | 6 ++++++ widgets/mainwindow.cpp | 10 +++++----- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp index 5b7f76eb8..fde7b8c13 100644 --- a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp +++ b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp @@ -1,8 +1,10 @@ #ifndef DATE_TIME_AS_SECS_SINCE_EPOCH_DELEGATE_HPP_ #define DATE_TIME_AS_SECS_SINCE_EPOCH_DELEGATE_HPP_ +#include #include #include +#include #include #include #include @@ -33,12 +35,16 @@ public: QString displayText (QVariant const& value, QLocale const& locale) const override { - return locale.toString (to_date_time (value), QLocale::ShortFormat); + return locale.toString (to_date_time (value), locale.dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); } QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const& /*option*/, QModelIndex const& /*index*/) const override { - return new QDateTimeEdit {parent}; + std::unique_ptr editor {new QDateTimeEdit {parent}}; + editor->setTimeSpec (Qt::UTC); // needed because it ignores time + // spec of the QDateTime that it is + // set from + return editor.release (); } void setEditorData (QWidget * editor, QModelIndex const& index) const override diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 965d6f957..95aba4378 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include "Configuration.hpp" #include "Bands.hpp" #include "qt_db_helpers.hpp" diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index e5b8a2e56..64f589d20 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -4,7 +4,6 @@ #include #include #include -#include #include "logbook/logbook.h" #include "MessageBox.hpp" diff --git a/widgets/logqso.ui b/widgets/logqso.ui index 75ca35db3..a03a3028a 100644 --- a/widgets/logqso.ui +++ b/widgets/logqso.ui @@ -81,6 +81,9 @@ dd/MM/yyyy HH:mm:ss + + Qt::UTC + @@ -113,6 +116,9 @@ dd/MM/yyyy HH:mm:ss + + Qt::UTC + diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 97e025931..8faf33fbd 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -188,7 +188,7 @@ namespace int ms_minute_error () { - auto const& now = QDateTime::currentDateTime (); + auto const& now = QDateTime::currentDateTimeUtc (); auto const& time = now.time (); auto second = time.second (); return now.msecsTo (now.addSecs (second > 30 ? 60 - second : -second)) - time.msec (); @@ -1508,7 +1508,7 @@ QString MainWindow::save_wave_file (QString const& name, short const * data, int BWFFile::InfoDictionary list_info { {{{'I','S','R','C'}}, source.toLocal8Bit ()}, {{{'I','S','F','T'}}, program_title (revision ()).simplified ().toLocal8Bit ()}, - {{{'I','C','R','D'}}, QDateTime::currentDateTime () + {{{'I','C','R','D'}}, QDateTime::currentDateTimeUtc () .toString ("yyyy-MM-ddTHH:mm:ss.zzzZ").toLocal8Bit ()}, {{{'I','C','M','T'}}, comment.toLocal8Bit ()}, }; @@ -2712,7 +2712,7 @@ void MainWindow::msgAvgDecode2() void MainWindow::decode() //decode() { - QDateTime now = QDateTime::currentDateTime(); + QDateTime now = QDateTime::currentDateTimeUtc (); if( m_dateTimeLastTX.isValid () ) { qint64 isecs_since_tx = m_dateTimeLastTX.secsTo(now); dec_data.params.lapcqonly= (isecs_since_tx > 600); @@ -3266,7 +3266,7 @@ void MainWindow::pskPost (DecodedText const& decodedtext) if(grid.contains (grid_regexp)) { // qDebug() << "To PSKreporter:" << deCall << grid << frequency << msgmode << snr; psk_Reporter->addRemoteStation(deCall,grid,QString::number(frequency),msgmode, - QString::number(snr),QString::number(QDateTime::currentDateTime().toTime_t())); + QString::number(snr),QString::number(QDateTime::currentDateTimeUtc ().toTime_t())); } } @@ -3399,7 +3399,7 @@ void MainWindow::guiUpdate() if(m_tune) m_bTxTime=true; //"Tune" takes precedence if(m_transmitting or m_auto or m_tune) { - m_dateTimeLastTX = QDateTime::currentDateTime (); + m_dateTimeLastTX = QDateTime::currentDateTimeUtc (); // Check for "txboth" (testing purposes only) QFile f(m_appDir + "/txboth"); From dac6a2cc260229ecc6395d5fd348645b8ab82266 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 00:51:41 +0000 Subject: [PATCH 06/13] More relaxed validation for FD exchange and fix up to uppercase --- Configuration.cpp | 25 +++- Configuration.ui | 291 ++++++++++++++++++++++------------------------ 2 files changed, 161 insertions(+), 155 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 244d885a2..c0c9a982f 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -210,6 +210,7 @@ namespace |DX # anyone else ) )", QRegularExpression::CaseInsensitiveOption | QRegularExpression::ExtendedPatternSyntaxOption}; + QRegularExpression field_day_exchange_re { R"( ( @@ -217,7 +218,7 @@ namespace |[0-2]\d |3[0-2] ) - [A-F]\ # class and space + [A-F]\ * # class and optional space ( AB|AK|AL|AR|AZ|BC|CO|CT|DE|EB # ARRL/RAC section |EMA|ENY|EPA|EWA|GA|GTA|IA|ID @@ -488,6 +489,8 @@ private: Q_SLOT void on_cbx4ToneSpacing_clicked(bool); Q_SLOT void on_prompt_to_log_check_box_clicked(bool); Q_SLOT void on_cbAutoLog_clicked(bool); + Q_SLOT void on_Field_Day_Exchange_textEdited (QString const&); + Q_SLOT void on_RTTY_Exchange_textEdited (QString const&); // typenames used as arguments must match registered type names :( Q_SIGNAL void start_transceiver (unsigned seqeunce_number) const; @@ -1011,8 +1014,8 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network ui_->callsign_line_edit->setValidator (new CallsignValidator {this}); ui_->grid_line_edit->setValidator (new MaidenheadLocatorValidator {this}); ui_->add_macro_line_edit->setValidator (new QRegularExpressionValidator {message_alphabet, this}); - ui_->Field_Day_Exchange->setValidator(new QRegularExpressionValidator {field_day_exchange_re}); - ui_->RTTY_Exchange->setValidator(new QRegularExpressionValidator {RTTY_roundup_exchange_re}); + ui_->Field_Day_Exchange->setValidator (new QRegularExpressionValidator {field_day_exchange_re, this}); + ui_->RTTY_Exchange->setValidator (new QRegularExpressionValidator {RTTY_roundup_exchange_re, this}); ui_->udp_server_port_spin_box->setMinimum (1); ui_->udp_server_port_spin_box->setMaximum (std::numeric_limits::max ()); @@ -2507,6 +2510,22 @@ void Configuration::impl::on_cbx4ToneSpacing_clicked(bool b) if(b) ui_->cbx2ToneSpacing->setChecked(false); } +void Configuration::impl::on_Field_Day_Exchange_textEdited (QString const& exchange) +{ + auto text = exchange.simplified ().toUpper (); + auto class_pos = text.indexOf (QRegularExpression {R"([A-H])"}); + if (class_pos >= 0 && text.size () >= class_pos + 2 && text.at (class_pos + 1) != QChar {' '}) + { + text.insert (class_pos + 1, QChar {' '}); + } + ui_->Field_Day_Exchange->setText (text); +} + +void Configuration::impl::on_RTTY_Exchange_textEdited (QString const& exchange) +{ + ui_->RTTY_Exchange->setText (exchange.toUpper ()); +} + bool Configuration::impl::have_rig () { if (!open_rig ()) diff --git a/Configuration.ui b/Configuration.ui index f52eeb2be..4ec35f7ef 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -2456,7 +2456,140 @@ Right click for insert and delete options. false - + + + + + <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> + + + Hound + + + true + + + special_op_activity_button_group + + + + + + + + 0 + 0 + + + + <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> + + + NA VHF Contest + + + special_op_activity_button_group + + + + + + + <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> + + + Fox + + + false + + + special_op_activity_button_group + + + + + + + + 0 + 0 + + + + <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> + + + EU VHF Contest + + + special_op_activity_button_group + + + + + + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + + + ARRL RTTY Roundup + + + special_op_activity_button_group + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + RTTY RU Exch: + + + RTTY_Exchange + + + + + + + + 70 + 0 + + + + <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> + + + NJ + + + Qt::AlignCenter + + + + + + + @@ -2503,7 +2636,7 @@ Right click for insert and delete options. - Exch: + FD Exch: Field_Day_Exchange @@ -2533,152 +2666,6 @@ Right click for insert and delete options. - - - - - - <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> - - - ARRL RTTY Roundup - - - special_op_activity_button_group - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Exch: - - - RTTY_Exchange - - - - - - - - 70 - 0 - - - - <html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html> - - - NJ - - - Qt::AlignCenter - - - - - - - - - - - <html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html> - - - Fox - - - false - - - special_op_activity_button_group - - - - - - - - 0 - 0 - - - - <html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html> - - - EU VHF Contest - - - special_op_activity_button_group - - - - - - - - 0 - 0 - - - - <html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html> - - - NA VHF Contest - - - special_op_activity_button_group - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - <html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html> - - - Hound - - - true - - - special_op_activity_button_group - - - @@ -3031,13 +3018,13 @@ Right click for insert and delete options. - - - + - + + + From d5c59e51c108af544dc60f35e134eb602e55d7a3 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 02:30:32 +0000 Subject: [PATCH 07/13] Ensure that pending log table edits do not lock out adding new QSOs Pending edits are now discarded when adding a new log contest or Fox log record. Also switch to commit on fields change edit strategy so there should be no pending edits now anyway. --- models/CabrilloLog.cpp | 8 ++++++-- models/FoxLog.cpp | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/models/CabrilloLog.cpp b/models/CabrilloLog.cpp index 95aba4378..d558e66e0 100644 --- a/models/CabrilloLog.cpp +++ b/models/CabrilloLog.cpp @@ -51,7 +51,7 @@ CabrilloLog::impl::impl (Configuration const * configuration) SQL_error_check (export_query_, &QSqlQuery::prepare, "SELECT frequency, \"when\", exchange_sent, call, exchange_rcvd FROM cabrillo_log ORDER BY \"when\""); - setEditStrategy (QSqlTableModel::OnRowChange); + setEditStrategy (QSqlTableModel::OnFieldChange); setTable ("cabrillo_log"); setHeaderData (fieldIndex ("frequency"), Qt::Horizontal, tr ("Freq(kHz)")); setHeaderData (fieldIndex ("when"), Qt::Horizontal, tr ("Date & Time(UTC)")); @@ -109,6 +109,10 @@ bool CabrilloLog::add_QSO (Frequency frequency, QDateTime const& when, QString c set_value_maybe_null (record, "exchange_sent", exchange_sent); set_value_maybe_null (record, "exchange_rcvd", exchange_received); set_value_maybe_null (record, "band", m_->configuration_->bands ()->find (frequency)); + if (m_->isDirty ()) + { + m_->revert (); // discard any uncommitted changes + } auto ok = m_->insertRecord (-1, record); if (ok) { @@ -135,7 +139,7 @@ void CabrilloLog::reset () SQL_error_check (*m_, &QSqlTableModel::removeRows, 0, m_->rowCount (), QModelIndex {}); transaction.submit (); m_->select (); // to refresh views - m_->setEditStrategy (QSqlTableModel::OnRowChange); + m_->setEditStrategy (QSqlTableModel::OnFieldChange); } } diff --git a/models/FoxLog.cpp b/models/FoxLog.cpp index 1503e5662..691647fdc 100644 --- a/models/FoxLog.cpp +++ b/models/FoxLog.cpp @@ -43,7 +43,7 @@ FoxLog::impl::impl () SQL_error_check (dupe_query_, &QSqlQuery::prepare, "SELECT COUNT(*) FROM fox_log WHERE call = :call AND band = :band"); - setEditStrategy (QSqlTableModel::OnRowChange); + setEditStrategy (QSqlTableModel::OnFieldChange); setTable ("fox_log"); setHeaderData (fieldIndex ("when"), Qt::Horizontal, tr ("Date & Time(UTC)")); setHeaderData (fieldIndex ("call"), Qt::Horizontal, tr ("Call")); @@ -100,6 +100,10 @@ bool FoxLog::add_QSO (QDateTime const& when, QString const& call, QString const& set_value_maybe_null (record, "report_sent", report_sent); set_value_maybe_null (record, "report_rcvd", report_received); set_value_maybe_null (record, "band", band); + if (m_->isDirty ()) + { + m_->revert (); // discard any uncommitted changes + } auto ok = m_->insertRecord (-1, record); if (ok) { @@ -126,6 +130,6 @@ void FoxLog::reset () SQL_error_check (*m_, &QSqlTableModel::removeRows, 0, m_->rowCount (), QModelIndex {}); transaction.submit (); m_->select (); // to refresh views - m_->setEditStrategy (QSqlTableModel::OnRowChange); + m_->setEditStrategy (QSqlTableModel::OnFieldChange); } } From fdb59cf6e9ec44f6489829f04d48d226443d4849 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 03:37:56 +0000 Subject: [PATCH 08/13] Fix a cardinality issue in the contest and Fox log windows for the Band column Foreign key relationship with the Bands model should have been many-to-many instead of one-to-many. --- widgets/CabrilloLogWindow.cpp | 2 +- widgets/FoxLogWindow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/CabrilloLogWindow.cpp b/widgets/CabrilloLogWindow.cpp index 20f39e4e6..4bf70f805 100644 --- a/widgets/CabrilloLogWindow.cpp +++ b/widgets/CabrilloLogWindow.cpp @@ -66,7 +66,7 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const set_log_view (m_->ui_.log_table_view); m_->ui_.log_table_view->setItemDelegateForColumn (2, new DateTimeAsSecsSinceEpochDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (3, new CallsignDelegate {this}); - m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), m_->log_model_, 0, 6, this}); + m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this}); m_->ui_.log_table_view->horizontalHeader ()->moveSection (6, 1); // band to first column } diff --git a/widgets/FoxLogWindow.cpp b/widgets/FoxLogWindow.cpp index 0f96529aa..4b8fbc253 100644 --- a/widgets/FoxLogWindow.cpp +++ b/widgets/FoxLogWindow.cpp @@ -43,7 +43,7 @@ FoxLogWindow::FoxLogWindow (QSettings * settings, Configuration const * configur m_->ui_.log_table_view->setItemDelegateForColumn (1, new DateTimeAsSecsSinceEpochDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (2, new CallsignDelegate {this}); m_->ui_.log_table_view->setItemDelegateForColumn (3, new MaidenheadLocatorDelegate {this}); - m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), m_->log_model_, 0, 6, this}); + m_->ui_.log_table_view->setItemDelegateForColumn (6, new ForeignKeyDelegate {configuration->bands (), 0, this}); m_->ui_.log_table_view->horizontalHeader ()->moveSection (6, 1); // move band to first column m_->ui_.rate_label->setNum (0); m_->ui_.queued_label->setNum (0); From 59fc83455d2c039d97ae1eb9992e6d7140d5b08a Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 10:09:37 -0500 Subject: [PATCH 09/13] Add contest exchange send and received fields to UDP logged QSO message Updated message_aggregator and udp_daemon reference applications to exercise this change. --- MessageClient.cpp | 6 ++- MessageClient.hpp | 3 +- MessageServer.cpp | 8 +++- MessageServer.hpp | 3 +- NetworkMessage.hpp | 2 + UDPExamples/BeaconsModel.cpp | 2 +- UDPExamples/DecodesModel.cpp | 2 +- UDPExamples/MessageAggregatorMainWindow.cpp | 9 +++- UDPExamples/MessageAggregatorMainWindow.hpp | 3 +- UDPExamples/UDPDaemon.cpp | 6 ++- widgets/logqso.cpp | 51 ++++++++++----------- widgets/logqso.h | 4 +- widgets/mainwindow.cpp | 7 ++- widgets/mainwindow.h | 4 +- 14 files changed, 67 insertions(+), 43 deletions(-) diff --git a/MessageClient.cpp b/MessageClient.cpp index 80ceb04e6..853c917a7 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -462,7 +462,8 @@ void MessageClient::qso_logged (QDateTime time_off, QString const& dx_call, QStr , QString const& report_received, QString const& tx_power , QString const& comments, QString const& name, QDateTime time_on , QString const& operator_call, QString const& my_call - , QString const& my_grid) + , QString const& my_grid, QString const& exchange_sent + , QString const& exchange_rcvd) { if (m_->server_port_ && !m_->server_string_.isEmpty ()) { @@ -470,7 +471,8 @@ void MessageClient::qso_logged (QDateTime time_off, QString const& dx_call, QStr NetworkMessage::Builder out {&message, NetworkMessage::QSOLogged, m_->id_, m_->schema_}; out << time_off << dx_call.toUtf8 () << dx_grid.toUtf8 () << dial_frequency << mode.toUtf8 () << report_sent.toUtf8 () << report_received.toUtf8 () << tx_power.toUtf8 () << comments.toUtf8 () - << name.toUtf8 () << time_on << operator_call.toUtf8 () << my_call.toUtf8 () << my_grid.toUtf8 (); + << name.toUtf8 () << time_on << operator_call.toUtf8 () << my_call.toUtf8 () << my_grid.toUtf8 () + << exchange_sent.toUtf8 () << exchange_rcvd.toUtf8 (); m_->send_message (out, message); } } diff --git a/MessageClient.hpp b/MessageClient.hpp index e1208f9c8..ec36a3357 100644 --- a/MessageClient.hpp +++ b/MessageClient.hpp @@ -64,7 +64,8 @@ public: , Frequency dial_frequency, QString const& mode, QString const& report_sent , QString const& report_received, QString const& tx_power, QString const& comments , QString const& name, QDateTime time_on, QString const& operator_call - , QString const& my_call, QString const& my_grid); + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd); // ADIF_record argument should be valid ADIF excluding any end // of record marker diff --git a/MessageServer.cpp b/MessageServer.cpp index b5a719e74..65394358f 100644 --- a/MessageServer.cpp +++ b/MessageServer.cpp @@ -294,8 +294,11 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s QByteArray operator_call; QByteArray my_call; QByteArray my_grid; + QByteArray exchange_sent; + QByteArray exchange_rcvd; in >> time_off >> dx_call >> dx_grid >> dial_frequency >> mode >> report_sent >> report_received - >> tx_power >> comments >> name >> time_on >> operator_call >> my_call >> my_grid; + >> tx_power >> comments >> name >> time_on >> operator_call >> my_call >> my_grid + >> exchange_sent >> exchange_rcvd; if (check_status (in) != Fail) { Q_EMIT self_->qso_logged (id, time_off, QString::fromUtf8 (dx_call), QString::fromUtf8 (dx_grid) @@ -303,7 +306,8 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s , QString::fromUtf8 (report_received), QString::fromUtf8 (tx_power) , QString::fromUtf8 (comments), QString::fromUtf8 (name), time_on , QString::fromUtf8 (operator_call), QString::fromUtf8 (my_call) - , QString::fromUtf8 (my_grid)); + , QString::fromUtf8 (my_grid), QString::fromUtf8 (exchange_sent) + , QString::fromUtf8 (exchange_rcvd)); } } break; diff --git a/MessageServer.hpp b/MessageServer.hpp index bb7501529..f308f7332 100644 --- a/MessageServer.hpp +++ b/MessageServer.hpp @@ -88,7 +88,8 @@ public: , Frequency dial_frequency, QString const& mode, QString const& report_sent , QString const& report_received, QString const& tx_power, QString const& comments , QString const& name, QDateTime time_on, QString const& operator_call - , QString const& my_call, QString const& my_grid); + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd); Q_SIGNAL void clear_decodes (QString const& id); Q_SIGNAL void logged_ADIF (QString const& id, QByteArray const& ADIF); diff --git a/NetworkMessage.hpp b/NetworkMessage.hpp index ffd0ff288..e5a3f5c08 100644 --- a/NetworkMessage.hpp +++ b/NetworkMessage.hpp @@ -240,6 +240,8 @@ * Operator call utf8 * My call utf8 * My grid utf8 + * Exchange sent utf8 + * Exchange received utf8 * * The QSO logged message is sent to the server(s) when the * WSJT-X user accepts the "Log QSO" dialog by clicking the "OK" diff --git a/UDPExamples/BeaconsModel.cpp b/UDPExamples/BeaconsModel.cpp index 1302dc05e..8955ea26a 100644 --- a/UDPExamples/BeaconsModel.cpp +++ b/UDPExamples/BeaconsModel.cpp @@ -72,7 +72,7 @@ namespace } BeaconsModel::BeaconsModel (QObject * parent) - : QStandardItemModel {0, sizeof (headings) / sizeof (headings[0]), parent} + : QStandardItemModel {0, sizeof headings / sizeof headings[0], parent} { int column {0}; for (auto const& heading : headings) diff --git a/UDPExamples/DecodesModel.cpp b/UDPExamples/DecodesModel.cpp index 5847e49ff..88b071c11 100644 --- a/UDPExamples/DecodesModel.cpp +++ b/UDPExamples/DecodesModel.cpp @@ -75,7 +75,7 @@ namespace } DecodesModel::DecodesModel (QObject * parent) - : QStandardItemModel {0, sizeof (headings) / sizeof (headings[0]), parent} + : QStandardItemModel {0, sizeof headings / sizeof headings[0], parent} { int column {0}; for (auto const& heading : headings) diff --git a/UDPExamples/MessageAggregatorMainWindow.cpp b/UDPExamples/MessageAggregatorMainWindow.cpp index 1d1dce5d6..0c2c51c30 100644 --- a/UDPExamples/MessageAggregatorMainWindow.cpp +++ b/UDPExamples/MessageAggregatorMainWindow.cpp @@ -25,12 +25,14 @@ namespace QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "Operator"), QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "My Call"), QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "My Grid"), + QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "Exchange Sent"), + QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "Exchange Rcvd"), QT_TRANSLATE_NOOP ("MessageAggregatorMainWindow", "Comments"), }; } MessageAggregatorMainWindow::MessageAggregatorMainWindow () - : log_ {new QStandardItemModel {0, 14, this}} + : log_ {new QStandardItemModel {0, sizeof headings / sizeof headings[0], this}} , decodes_model_ {new DecodesModel {this}} , beacons_model_ {new BeaconsModel {this}} , server_ {new MessageServer {this}} @@ -209,7 +211,8 @@ void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime time , QString const& report_sent, QString const& report_received , QString const& tx_power, QString const& comments , QString const& name, QDateTime time_on, QString const& operator_call - , QString const& my_call, QString const& my_grid) + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd) { QList row; row << new QStandardItem {time_on.toString ("dd-MMM-yyyy hh:mm:ss")} @@ -225,6 +228,8 @@ void MessageAggregatorMainWindow::log_qso (QString const& /*id*/, QDateTime time << new QStandardItem {operator_call} << new QStandardItem {my_call} << new QStandardItem {my_grid} + << new QStandardItem {exchange_sent} + << new QStandardItem {exchange_rcvd} << new QStandardItem {comments}; log_->appendRow (row); log_table_view_->resizeColumnsToContents (); diff --git a/UDPExamples/MessageAggregatorMainWindow.hpp b/UDPExamples/MessageAggregatorMainWindow.hpp index b699bee93..29f762d3d 100644 --- a/UDPExamples/MessageAggregatorMainWindow.hpp +++ b/UDPExamples/MessageAggregatorMainWindow.hpp @@ -32,7 +32,8 @@ public: , Frequency dial_frequency, QString const& mode, QString const& report_sent , QString const& report_received, QString const& tx_power, QString const& comments , QString const& name, QDateTime time_on, QString const& operator_call - , QString const& my_call, QString const& my_grid); + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd); private: void add_client (QString const& id, QString const& version, QString const& revision); diff --git a/UDPExamples/UDPDaemon.cpp b/UDPExamples/UDPDaemon.cpp index b75a8adec..c075cfe83 100644 --- a/UDPExamples/UDPDaemon.cpp +++ b/UDPExamples/UDPDaemon.cpp @@ -99,7 +99,8 @@ public: , Frequency dial_frequency, QString const& mode, QString const& report_sent , QString const& report_received, QString const& tx_power , QString const& comments, QString const& name, QDateTime time_on - , QString const& operator_call, QString const& my_call, QString const& my_grid) + , QString const& operator_call, QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd) { if (client_id == id_) { @@ -107,7 +108,8 @@ public: << "freq:" << dial_frequency << "mode:" << mode << "rpt_sent:" << report_sent << "rpt_rcvd:" << report_received << "Tx_pwr:" << tx_power << "comments:" << comments << "name:" << name << "operator_call:" << operator_call << "my_call:" << my_call - << "my_grid:" << my_grid; + << "my_grid:" << my_grid << "exchange_sent:" << exchange_sent + << "exchange_rcvd:" << exchange_rcvd; std::cout << QByteArray {80, '-'}.data () << '\n'; std::cout << tr ("%1: Logged %2 grid: %3 power: %4 sent: %5 recd: %6 freq: %7 time_off: %8 op: %9 my_call: %10 my_grid: %11") .arg (id_).arg (dx_call).arg (dx_grid).arg (tx_power).arg (report_sent).arg (report_received) diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index 64f589d20..da8d00819 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -69,7 +69,7 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString if (ui->cbTxPower->isChecked ()) ui->txPower->setText(m_txPower); if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments); if (m_config->report_in_comments()) { - QString t=mode; + auto t=mode; if(rptSent!="") t+=" Sent: " + rptSent; if(rptRcvd!="") t+=" Rcvd: " + rptRcvd; ui->comments->setText(t); @@ -107,30 +107,28 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString void LogQSO::accept() { - QString hisCall,hisGrid,mode,rptSent,rptRcvd,dateOn,dateOff,timeOn,timeOff,band,operator_call; - QString comments,name; - - hisCall=ui->call->text(); - hisGrid=ui->grid->text(); - mode=ui->mode->text(); - rptSent=ui->sent->text(); - rptRcvd=ui->rcvd->text(); - m_dateTimeOn = ui->start_date_time->dateTime (); - m_dateTimeOff = ui->end_date_time->dateTime (); - band=ui->band->text(); - name=ui->name->text(); - m_txPower=ui->txPower->text(); - comments=ui->comments->text(); - m_comments=comments; - QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6)); - operator_call = ui->loggedOperator->text(); + auto hisCall = ui->call->text (); + auto hisGrid = ui->grid->text (); + auto mode = ui->mode->text (); + auto rptSent = ui->sent->text (); + auto rptRcvd = ui->rcvd->text (); + auto m_dateTimeOn = ui->start_date_time->dateTime (); + auto m_dateTimeOff = ui->end_date_time->dateTime (); + auto band = ui->band->text (); + auto name = ui->name->text (); + auto m_txPower = ui->txPower->text (); + auto m_comments = ui->comments->text (); + auto strDialFreq = QString::number (m_dialFreq / 1.e6,'f',6); + auto operator_call = ui->loggedOperator->text (); + auto xsent = ui->exchSent->text (); + auto xrcvd = ui->exchRcvd->text (); // validate using SpOp = Configuration::SpecialOperatingActivity; auto special_op = m_config->special_op_id (); if (SpOp::NONE < special_op && special_op < SpOp::FOX) { - if (ui->exchSent->text ().isEmpty () || ui->exchRcvd->text ().isEmpty ()) + if (xsent.isEmpty () || xrcvd.isEmpty ()) { show (); MessageBox::warning_message (this, tr ("Invalid QSO Data"), @@ -138,8 +136,7 @@ void LogQSO::accept() return; // without accepting } - if (!m_cabrilloLog->add_QSO (m_dialFreq, m_dateTimeOff, hisCall, - ui->exchSent->text (), ui->exchRcvd->text ())) + if (!m_cabrilloLog->add_QSO (m_dialFreq, m_dateTimeOff, hisCall, xsent, xrcvd)) { show (); MessageBox::warning_message (this, tr ("Invalid QSO Data"), @@ -161,7 +158,7 @@ void LogQSO::accept() m_dateTimeOff.time().toString("hh:mm:ss,") + hisCall + "," + hisGrid + "," + strDialFreq + "," + mode + "," + rptSent + "," + rptRcvd + "," + m_txPower + - "," + comments + "," + name; + "," + m_comments + "," + name; QTextStream out(&f); out << logEntry << endl; f.close(); @@ -176,12 +173,14 @@ void LogQSO::accept() , rptSent , rptRcvd , m_txPower - , comments + , m_comments , name , m_dateTimeOn , operator_call , m_myCall , m_myGrid + , xsent + , xrcvd , LogBook::QSOToADIF (hisCall , hisGrid , mode @@ -190,15 +189,15 @@ void LogQSO::accept() , m_dateTimeOn , m_dateTimeOff , band - , comments + , m_comments , name , strDialFreq , m_myCall , m_myGrid , m_txPower , operator_call - , ui->exchSent->text () - , ui->exchRcvd->text ())); + , xsent + , xrcvd)); QDialog::accept(); } diff --git a/widgets/logqso.h b/widgets/logqso.h index b0e703a93..346e3e5a2 100644 --- a/widgets/logqso.h +++ b/widgets/logqso.h @@ -40,7 +40,9 @@ signals: , QString const& rpt_sent, QString const& rpt_received , QString const& tx_power, QString const& comments , QString const& name, QDateTime const& QSO_date_on, QString const& operator_call - , QString const& my_call, QString const& my_grid, QByteArray const& ADIF); + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd + , QByteArray const& ADIF); protected: void hideEvent (QHideEvent *); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8faf33fbd..2393f01db 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -5376,7 +5376,9 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, , QString const& rpt_sent, QString const& rpt_received , QString const& tx_power, QString const& comments , QString const& name, QDateTime const& QSO_date_on, QString const& operator_call - , QString const& my_call, QString const& my_grid, QByteArray const& ADIF) + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd + , QByteArray const& ADIF) { QString date = QSO_date_on.toString("yyyyMMdd"); if (!m_logBook.add (m_hisCall, grid, m_config.bands()->find(m_freqNominal), m_modeTx, ADIF)) @@ -5386,7 +5388,8 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call, } m_messageClient->qso_logged (QSO_date_off, call, grid, dial_freq, mode, rpt_sent, rpt_received - , tx_power, comments, name, QSO_date_on, operator_call, my_call, my_grid); + , tx_power, comments, name, QSO_date_on, operator_call, my_call, my_grid + , exchange_sent, exchange_rcvd); m_messageClient->logged_ADIF (ADIF); // Log to N1MM Logger diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index e8f593c3f..6a2527440 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -230,7 +230,9 @@ private slots: , QString const& rpt_sent, QString const& rpt_received , QString const& tx_power, QString const& comments , QString const& name, QDateTime const& QSO_date_on, QString const& operator_call - , QString const& my_call, QString const& my_grid, QByteArray const& ADIF); + , QString const& my_call, QString const& my_grid + , QString const& exchange_sent, QString const& exchange_rcvd + , QByteArray const& ADIF); void on_bandComboBox_currentIndexChanged (int index); void on_bandComboBox_activated (int index); void on_readFreq_clicked(); From 43edd81a8b4fa83d7dcdbd9947f0a39e2255a3ab Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 15:31:22 +0000 Subject: [PATCH 10/13] Include seconds in datebase field date/time item delegate editor --- item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp index fde7b8c13..a666ed323 100644 --- a/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp +++ b/item_delegates/DateTimeAsSecsSinceEpochDelegate.hpp @@ -41,6 +41,7 @@ public: QWidget * createEditor (QWidget * parent, QStyleOptionViewItem const& /*option*/, QModelIndex const& /*index*/) const override { std::unique_ptr editor {new QDateTimeEdit {parent}}; + editor->setDisplayFormat (parent->locale ().dateFormat (QLocale::ShortFormat) + " hh:mm:ss"); editor->setTimeSpec (Qt::UTC); // needed because it ignores time // spec of the QDateTime that it is // set from From 4360a5b6742ea99bcfff8d711d8309e682f4ed9d Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 16:07:46 +0000 Subject: [PATCH 11/13] Add tool tip for rescan ADIF log button Also removed the tool tip for the settings main tab widget as it is confusing when it gets inherited by children with no tool tip. --- Configuration.ui | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Configuration.ui b/Configuration.ui index 4ec35f7ef..6b04fd353 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -16,9 +16,6 @@ - - Select tab to change configuration parameters. - 0 @@ -2259,6 +2256,9 @@ Right click for insert and delete options. + + <html><head/><body><p>Click to scan the wsjtx_log.adi ADIF file again for worked before information</p></body></html> + Rescan ADIF Log From 025a0161f87527856e79192fc92515866b1c824c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 2 Dec 2018 23:19:08 +0000 Subject: [PATCH 12/13] Add special operation mode enumeration to UDP status message Also updated the message_aggregator UDP reference application to exercise this field. --- MessageClient.cpp | 4 ++-- MessageClient.hpp | 2 +- MessageServer.cpp | 6 ++++-- MessageServer.hpp | 3 ++- NetworkMessage.hpp | 15 ++++++++++++++- UDPExamples/ClientWidget.cpp | 20 +++++++++++++++++--- UDPExamples/ClientWidget.hpp | 3 ++- UDPExamples/UDPDaemon.cpp | 3 ++- widgets/mainwindow.cpp | 3 ++- 9 files changed, 46 insertions(+), 13 deletions(-) diff --git a/MessageClient.cpp b/MessageClient.cpp index 853c917a7..6ceca2dce 100644 --- a/MessageClient.cpp +++ b/MessageClient.cpp @@ -405,7 +405,7 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con , qint32 rx_df, qint32 tx_df, QString const& de_call , QString const& de_grid, QString const& dx_grid , bool watchdog_timeout, QString const& sub_mode - , bool fast_mode) + , bool fast_mode, quint8 special_op_mode) { if (m_->server_port_ && !m_->server_string_.isEmpty ()) { @@ -414,7 +414,7 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con out << f << mode.toUtf8 () << dx_call.toUtf8 () << report.toUtf8 () << tx_mode.toUtf8 () << tx_enabled << transmitting << decoding << rx_df << tx_df << de_call.toUtf8 () << de_grid.toUtf8 () << dx_grid.toUtf8 () << watchdog_timeout << sub_mode.toUtf8 () - << fast_mode; + << fast_mode << special_op_mode; m_->send_message (out, message); } } diff --git a/MessageClient.hpp b/MessageClient.hpp index ec36a3357..0deb1a49d 100644 --- a/MessageClient.hpp +++ b/MessageClient.hpp @@ -52,7 +52,7 @@ public: , QString const& tx_mode, bool tx_enabled, bool transmitting, bool decoding , qint32 rx_df, qint32 tx_df, QString const& de_call, QString const& de_grid , QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode - , bool fast_mode); + , bool fast_mode, quint8 special_op_mode); Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency , QString const& mode, QString const& message, bool low_confidence , bool off_air); diff --git a/MessageServer.cpp b/MessageServer.cpp index 65394358f..609d24a9a 100644 --- a/MessageServer.cpp +++ b/MessageServer.cpp @@ -216,9 +216,10 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s bool watchdog_timeout {false}; QByteArray sub_mode; bool fast_mode {false}; + quint8 special_op_mode {0}; in >> f >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding >> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode - >> fast_mode; + >> fast_mode >> special_op_mode; if (check_status (in) != Fail) { Q_EMIT self_->status_update (id, f, QString::fromUtf8 (mode), QString::fromUtf8 (dx_call) @@ -226,7 +227,8 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s , tx_enabled, transmitting, decoding, rx_df, tx_df , QString::fromUtf8 (de_call), QString::fromUtf8 (de_grid) , QString::fromUtf8 (dx_grid), watchdog_timeout - , QString::fromUtf8 (sub_mode), fast_mode); + , QString::fromUtf8 (sub_mode), fast_mode + , special_op_mode); } } break; diff --git a/MessageServer.hpp b/MessageServer.hpp index f308f7332..4a6022bfd 100644 --- a/MessageServer.hpp +++ b/MessageServer.hpp @@ -76,7 +76,8 @@ public: , QString const& report, QString const& tx_mode, bool tx_enabled , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid - , bool watchdog_timeout, QString const& sub_mode, bool fast_mode); + , bool watchdog_timeout, QString const& sub_mode, bool fast_mode + , quint8 special_op_mode); Q_SIGNAL void client_closed (QString const& id); Q_SIGNAL void decode (bool is_new, QString const& id, QTime time, qint32 snr, float delta_time , quint32 delta_frequency, QString const& mode, QString const& message diff --git a/NetworkMessage.hpp b/NetworkMessage.hpp index e5a3f5c08..a4d9ba0d5 100644 --- a/NetworkMessage.hpp +++ b/NetworkMessage.hpp @@ -124,6 +124,7 @@ * Tx Watchdog bool * Sub-mode utf8 * Fast mode bool + * Special operation mode quint8 * * WSJT-X sends this status message when various internal state * changes to allow the server to track the relevant state of each @@ -142,10 +143,22 @@ * At the start and end of decoding, * When the Rx DF changes, * When the Tx DF changes, - * When the DE call or grid changes (currently when settings are exited), + * When settings are exited, * When the DX call or grid changes, * When the Tx watchdog is set or reset. * + * The Special operation mode is an enumeration that indicates the + * setting selected in the WSJT-X "Settings->Advanced->Special + * operating activity" panel. The values are as follows: + * + * 0 -> NONE + * 1 -> NA VHF + * 2 -> EU VHF + * 3 -> FIELD DAY + * 4 -> RTTY RU + * 5 -> FOX + * 6 -> HOUND + * * * Decode Out 2 quint32 * Id (unique key) utf8 diff --git a/UDPExamples/ClientWidget.cpp b/UDPExamples/ClientWidget.cpp index 10361d55d..7423f6d81 100644 --- a/UDPExamples/ClientWidget.cpp +++ b/UDPExamples/ClientWidget.cpp @@ -244,15 +244,29 @@ void ClientWidget::update_status (QString const& id, Frequency f, QString const& , QString const& report, QString const& tx_mode, bool tx_enabled , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid - , bool watchdog_timeout, QString const& sub_mode, bool fast_mode) + , bool watchdog_timeout, QString const& sub_mode, bool fast_mode + , quint8 special_op_mode) { if (id == id_) { fast_mode_ = fast_mode; decodes_proxy_model_.de_call (de_call); decodes_proxy_model_.rx_df (rx_df); - de_label_->setText (de_call.size () >= 0 ? QString {"DE: %1%2"}.arg (de_call) - .arg (de_grid.size () ? '(' + de_grid + ')' : QString {}) : QString {}); + QString special; + switch (special_op_mode) + { + case 1: special = "[NA VHF]"; break; + case 2: special = "[EU VHF]"; break; + case 3: special = "[FD]"; break; + case 4: special = "[RTTY RU]"; break; + case 5: special = "[Fox]"; break; + case 6: special = "[Hound]"; break; + default: break; + } + de_label_->setText (de_call.size () >= 0 ? QString {"DE: %1%2%3"}.arg (de_call) + .arg (de_grid.size () ? '(' + de_grid + ')' : QString {}) + .arg (special) + : QString {}); mode_label_->setText (QString {"Mode: %1%2%3%4"} .arg (mode) .arg (sub_mode) diff --git a/UDPExamples/ClientWidget.hpp b/UDPExamples/ClientWidget.hpp index 29059bfa5..0459ad036 100644 --- a/UDPExamples/ClientWidget.hpp +++ b/UDPExamples/ClientWidget.hpp @@ -32,7 +32,8 @@ public: , QString const& report, QString const& tx_mode, bool tx_enabled , bool transmitting, bool decoding, qint32 rx_df, qint32 tx_df , QString const& de_call, QString const& de_grid, QString const& dx_grid - , bool watchdog_timeout, QString const& sub_mode, bool fast_mode); + , bool watchdog_timeout, QString const& sub_mode, bool fast_mode + , quint8 special_op_mode); Q_SLOT void decode_added (bool is_new, QString const& client_id, QTime, qint32 snr , float delta_time, quint32 delta_frequency, QString const& mode , QString const& message, bool low_confidence, bool off_air); diff --git a/UDPExamples/UDPDaemon.cpp b/UDPExamples/UDPDaemon.cpp index c075cfe83..0ee202dc7 100644 --- a/UDPExamples/UDPDaemon.cpp +++ b/UDPExamples/UDPDaemon.cpp @@ -50,7 +50,8 @@ public: , QString const& /*report*/, QString const& /*tx_mode*/, bool /*tx_enabled*/ , bool /*transmitting*/, bool /*decoding*/, qint32 /*rx_df*/, qint32 /*tx_df*/ , QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/ - , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/) + , bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/ + , quint8 /*special_op_mode*/) { if (id == id_) { diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 2393f01db..b265ad7ba 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7684,7 +7684,8 @@ void MainWindow::statusUpdate () const ui->RxFreqSpinBox->value (), ui->TxFreqSpinBox->value (), m_config.my_callsign (), m_config.my_grid (), m_hisGrid, m_tx_watchdog, - submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode); + submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode, + static_cast (m_config.special_op_id ())); } void MainWindow::childEvent (QChildEvent * e) From 6fc27d550d208e35af756143c02a6cf07beab173 Mon Sep 17 00:00:00 2001 From: Steve Franke Date: Mon, 3 Dec 2018 07:18:52 -0600 Subject: [PATCH 13/13] Fix an egregious bug and another not-so-egregious bug. The egregious bug prevented decodes of most signals with negative DT. --- lib/ft8/ft8_params.f90 | 4 ++-- lib/ft8/ft8apset.f90 | 2 +- lib/ft8/ft8b.f90 | 1 - lib/ft8/sync8.f90 | 4 ++-- lib/ft8_decode.f90 | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/ft8/ft8_params.f90 b/lib/ft8/ft8_params.f90 index 858e61e96..bd228bdef 100644 --- a/lib/ft8/ft8_params.f90 +++ b/lib/ft8/ft8_params.f90 @@ -1,5 +1,5 @@ -! LDPC (174,87) code -parameter (KK=87) !Information bits (75 + CRC12) +! LDPC (174,91) code +parameter (KK=91) !Information bits (77 + CRC14) parameter (ND=58) !Data symbols parameter (NS=21) !Sync symbols (3 @ Costas 7x7) parameter (NN=NS+ND) !Total channel symbols (79) diff --git a/lib/ft8/ft8apset.f90 b/lib/ft8/ft8apset.f90 index 178c61161..2fac41969 100644 --- a/lib/ft8/ft8apset.f90 +++ b/lib/ft8/ft8apset.f90 @@ -30,10 +30,10 @@ subroutine ft8apset(mycall12,hiscall12,apsym) apsym(1)=99 apsym(30)=99 return - endif read(c77,'(58i1)',err=1) apsym(1:58) + apsym=2*apsym-1 if(nohiscall) apsym(30)=99 return diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index 83a6a9cbf..0f075aad2 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -275,7 +275,6 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & if(ncontest.eq.6.and.f1.gt.950.0) cycle ! Hounds use AP only for signals below 950 Hz if(iaptype.ge.2 .and. apsym(1).gt.1) cycle ! No, or nonstandard, mycall if(iaptype.ge.3 .and. apsym(30).gt.1) cycle ! No, or nonstandard, dxcall - apsym=2*apsym-1 ! Change from [0,1] to antipodal if(iaptype.eq.1) then ! CQ or CQ RU or CQ TEST or CQ FD apmask=0 diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index f68e0a9c8..3924f1bad 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -44,7 +44,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & nssy=NSPS/NSTEP ! # steps per symbol nfos=NFFT1/NSPS ! # frequency bin oversampling factor jstrt=0.5/tstep - candidate0=0. k=0 @@ -133,7 +132,8 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,s,candidate, & j=indx(i) ! if( candidate0(3,j) .ge. syncmin .and. candidate0(2,j).ge.-1.5 ) then if( candidate0(3,j) .ge. syncmin ) then - candidate(1:3,k)=abs(candidate0(1:3,j)) + candidate(2:3,k)=candidate0(2:3,j) + candidate(1,k)=abs(candidate0(1,j)) k=k+1 endif enddo diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 511252c42..e29fa921d 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -52,7 +52,7 @@ contains character*12 mycall12,hiscall12,mycall12_0 character*6 hisgrid6 integer*2 iwave(15*12000) - integer apsym1(KK),apsym2(58) + integer apsym2(58) character datetime*13,msg37*37 ! character message*22 character*37 allmessages(100)