From 11805d7323a4fc55c0d5976c6d66a9352817d3dd Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 29 Sep 2020 15:14:49 +0100 Subject: [PATCH 01/19] Revised check for older hamlib API version --- CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7d65cf5b..f3c0da890 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,10 @@ if (POLICY CMP0071) cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources endif (POLICY CMP0071) +if (POLICY CMP0075) + cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks +endif (POLICY CMP0075) + include (${PROJECT_SOURCE_DIR}/CMake/VersionCompute.cmake) message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}") @@ -868,6 +872,7 @@ endif (APPLE) # # find some useful tools # +include (CheckTypeSize) include (CheckSymbolExists) find_program(CTAGS ctags) @@ -907,7 +912,8 @@ message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}") set (CMAKE_REQUIRED_INCLUDES "${hamlib_INCLUDE_DIRS}") set (CMAKE_REQUIRED_LIBRARIES "${hamlib_LIBRARIES}") -check_symbol_exists (CACHE_ALL "hamlib/rig.h" HAVE_HAMLIB_OLD_CACHING) +set (CMAKE_EXTRA_INCLUDE_FILES "hamlib/rig.h") +check_type_size (CACHE_ALL HAMLIB_OLD_CACHING) check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING) From b99aafa336a750120fb8b899326b25d1b51f758e Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 29 Sep 2020 13:00:57 -0400 Subject: [PATCH 02/19] On change of TxFreq during an FST4 transmission, regenerate the Tx waveform and restart. --- widgets/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7262f2e12..f7c5476eb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -7042,7 +7042,7 @@ void MainWindow::setFreq4(int rxFreq, int txFreq) } else { if (ui->TxFreqSpinBox->isEnabled ()) { ui->TxFreqSpinBox->setValue(txFreq); - if ("FT8" == m_mode || "FT4" == m_mode) + if ("FT8" == m_mode || "FT4" == m_mode || m_mode=="FST4") { // we need to regenerate the current transmit waveform for // GFSK modulated modes From a7d5c3b03e337e499c69775f90a43802dbe4806a Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 29 Sep 2020 13:18:48 -0400 Subject: [PATCH 03/19] Shift+Click on waterfall now sets TxFreq in FST4W mode. --- widgets/plotter.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/widgets/plotter.cpp b/widgets/plotter.cpp index d612b2eb6..3b5ff22ff 100644 --- a/widgets/plotter.cpp +++ b/widgets/plotter.cpp @@ -719,16 +719,17 @@ void CPlotter::mouseMoveEvent (QMouseEvent * event) void CPlotter::mouseReleaseEvent (QMouseEvent * event) { - if (Qt::LeftButton == event->button () and m_mode!="FST4W") { + if (Qt::LeftButton == event->button()) { int x=event->x(); if(x<0) x=0; if(x>m_Size.width()) x=m_Size.width(); bool ctrl = (event->modifiers() & Qt::ControlModifier); bool shift = (event->modifiers() & Qt::ShiftModifier); + if(!shift and m_mode=="FST4W") return; int newFreq = int(FreqfromX(x)+0.5); int oldTxFreq = m_txFreq; int oldRxFreq = m_rxFreq; - if (ctrl) { + if (ctrl and m_mode!="FST4W") { emit setFreq1 (newFreq, newFreq); } else if (shift) { emit setFreq1 (oldRxFreq, newFreq); From 806d9bed7c412876fda9971acfd66d84fea3ea54 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 29 Sep 2020 23:28:21 +0100 Subject: [PATCH 04/19] Fix Linux package dependencies --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3c0da890..d4df1159d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1863,11 +1863,11 @@ endif () set (CPACK_DEBIAN_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION}") set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") -set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=10), libfftw3-single3 (>=3.3.8), libgomp1 (>=10), libqt5serialport5 (>=5.12.8), libqt5multimedia5-plugins (>=5.12.8), libqt5widgets5 (>=5.12.8), libqt5network5 (>=5.12.8), libqt5printsupport5 (>=5.12.8), libqt5sql5-sqlite (>=5.12.8), libusb-1.0-0 (>=1.0.23)") +set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8), libfftw3-single3 (>=3.3), libgomp1 (>=8), libqt5serialport5 (>=5.9), libqt5multimedia5-plugins (>=5.9), libqt5widgets5 (>=5.9), libqt5network5 (>=5.9), libqt5printsupport5 (>=5.9), libqt5sql5-sqlite (>=5.9), libusb-1.0-0 (>=1.0.21)") set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) -set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.13.2, qt5-qtserialport >= 5.13.2, qt5-qtmultimedia >= 5.13.2, qt5-qtsvg >= 5.13.2, libusbx >= 1.0.23, libgfortran >= 10.0.1, libgomp >= 10.0.1, fftw-libs-single >= 3.3.8") +set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 9, libgomp >= 9, fftw-libs-single >= 3.3") set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" From 541c1ddea61f6d54943773d08797a08fbcfd3cfa Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 30 Sep 2020 09:37:15 -0400 Subject: [PATCH 05/19] Fix the problem of FST4W transmitting on the FST4 TxFreq after mode switch. --- widgets/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index f7c5476eb..59942b2f6 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4044,6 +4044,7 @@ void MainWindow::guiUpdate() float fsample=48000.0; float dfreq=hmod*fsample/nsps; float f0=ui->TxFreqSpinBox->value() - m_XIT + 1.5*dfreq; + if(m_mode=="FST4W") f0=ui->WSPRfreqSpinBox->value() - m_XIT + 1.5*dfreq; int nwave=(nsym+2)*nsps; int icmplx=0; gen_fst4wave_(const_cast(itone),&nsym,&nsps,&nwave, From b56ce23f38f7bd4206b5e60364e5fa9f6c5df248 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 30 Sep 2020 10:01:57 -0400 Subject: [PATCH 06/19] Implement optional x2/x4 tone spacings for FST4 and FST4W. --- widgets/mainwindow.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 59942b2f6..6d5b01e58 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -4031,7 +4031,9 @@ void MainWindow::guiUpdate() } genfst4_(message,&ichk,msgsent,const_cast (fst4msgbits), const_cast(itone), &iwspr, 37, 37); - int hmod=1; //No FST4/W submodes + int hmod=1; + if(m_config.x2ToneSpacing()) hmod=2; + if(m_config.x4ToneSpacing()) hmod=4; int nsps=720; if(m_TRperiod==30) nsps=1680; if(m_TRperiod==60) nsps=3888; @@ -7224,11 +7226,13 @@ void MainWindow::transmit (double snr) if(m_TRperiod==300) nsps=21504; if(m_TRperiod==900) nsps=66560; if(m_TRperiod==1800) nsps=134400; - int hmod=1; //No FST4/W submodes + int hmod=1; + if(m_config.x2ToneSpacing()) hmod=2; + if(m_config.x4ToneSpacing()) hmod=4; double dfreq=hmod*12000.0/nsps; double f0=ui->WSPRfreqSpinBox->value() - m_XIT; if(m_mode=="FST4") f0=ui->TxFreqSpinBox->value() - m_XIT; - if(!m_tune) f0 += + 1.5*dfreq; + if(!m_tune) f0 += 1.5*dfreq; Q_EMIT sendMessage (m_mode, NUM_FST4_SYMBOLS,double(nsps),f0,toneSpacing, m_soundOutput,m_config.audio_output_channel(), true, false, snr, m_TRperiod); From 9200c3e27a594df1a872af2516bafb84e9fa7b32 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Wed, 30 Sep 2020 13:32:03 -0400 Subject: [PATCH 07/19] Add NB = -3% option to cycle through NB=0, 1, 2, 3, ... 20%. --- lib/fst4_decode.f90 | 6 ++++-- widgets/mainwindow.cpp | 2 +- widgets/mainwindow.ui | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/fst4_decode.f90 b/lib/fst4_decode.f90 index e97d8f096..ba49fb54d 100644 --- a/lib/fst4_decode.f90 +++ b/lib/fst4_decode.f90 @@ -227,7 +227,7 @@ contains ndropmax=1 single_decode=iand(nexp_decode,32).ne.0 npct=0 - nb=nexp_decode/256 - 2 + nb=nexp_decode/256 - 3 if(nb.ge.0) npct=nb inb1=20 inb2=5 @@ -235,6 +235,8 @@ contains inb2=5 !Try NB = 0, 5, 10, 15, 20% else if(nb.eq.-2) then inb2=2 !Try NB = 0, 2, 4,... 20% + else if(nb.eq.-3) then + inb2=1 !Try NB = 0, 1, 2,... 20% else inb1=0 !Fixed NB value, 0 to 25% ipct(0)=npct @@ -900,6 +902,6 @@ contains enddo return - end subroutine dopspread + end subroutine dopspread end module fst4_decode diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 6d5b01e58..8df2966f1 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3120,7 +3120,7 @@ void MainWindow::decode() //decode() dec_data.params.nexp_decode = static_cast (m_config.special_op_id()); if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; - if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+2); + if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+3); ::memcpy(dec_data.params.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime); ::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index bf80c09ac..bf7ac9885 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -2471,7 +2471,7 @@ Yellow when too low NB - -2 + -3 25 From 5cc48497b877678ce778d4e83caf81d246d60c20 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 1 Oct 2020 11:29:25 +0100 Subject: [PATCH 08/19] Remove constraint on WSPRnet.org spots being in WSPR band segments This seems harmless and will accommodate FST4W spots where operation is outside of WSPR band segments. --- Network/wsprnet.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Network/wsprnet.cpp b/Network/wsprnet.cpp index 669ab1554..2ac173095 100644 --- a/Network/wsprnet.cpp +++ b/Network/wsprnet.cpp @@ -144,9 +144,11 @@ void WSPRNet::post (QString const& call, QString const& grid, QString const& rfr if (match.hasMatch ()) { SpotQueue::value_type query; - // Prevent reporting data ouside of the current frequency band + // Prevent reporting data ouside of the current frequency + // band - removed by G4WJS to accommodate FST4W spots + // outside of WSPR segments auto tqrg = match.captured ("freq").toInt (); - if (tqrg >= 1400 && tqrg <= 1600) + // if (tqrg >= 1400 && tqrg <= 1600) { query.addQueryItem ("function", "wspr"); // use time as at 3/4 of T/R period before current to From 0c0adbdaab92cb8a2f62bbe6bf4c34385d8c8b12 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Thu, 1 Oct 2020 12:58:09 +0100 Subject: [PATCH 09/19] Fix widget foreground when forcing the background colour This is required so as to maintain good contrast between foreground and background elements when the widget colour palette is changed, e.g. when using a lights out style sheet. --- widgets/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 8df2966f1..7f5c0a681 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -6675,8 +6675,8 @@ void MainWindow::chk_FST4_freq_range() int diff=ui->sbF_High->value() - ui->sbF_Low->value(); if(diff<100 or diff>maxDiff) { - ui->sbF_Low->setStyleSheet("QSpinBox { background-color: red; }"); - ui->sbF_High->setStyleSheet("QSpinBox { background-color: red; }"); + ui->sbF_Low->setStyleSheet("QSpinBox { color: white; background-color: red; }"); + ui->sbF_High->setStyleSheet("QSpinBox { color: white; background-color: red; }"); } else { ui->sbF_Low->setStyleSheet(""); ui->sbF_High->setStyleSheet(""); From ada4f6798e52db16cc2c9c9779716fee376af0f0 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Sat, 3 Oct 2020 08:31:01 -0400 Subject: [PATCH 10/19] Reduce FLow/FHigh step size to 50. --- widgets/mainwindow.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index bf7ac9885..a932ca1cd 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -1036,7 +1036,7 @@ When not checked you can view the calibration results. 5000 - 100 + 50 1400 @@ -1058,7 +1058,7 @@ When not checked you can view the calibration results. 5000 - 100 + 50 600 From add63fb3748705718095fe5bcaadc6ff7cfb7a4c Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 4 Oct 2020 22:41:52 +0100 Subject: [PATCH 11/19] Adapt WSPRnet.org spotting to moveable Rx analysis window This allows spots at any frequency to be posted rather than just those in the 1400 to 1600 Hz range above the VFO dial frequency. --- Network/wsprnet.cpp | 39 ++++++++++++++++++++------------------- widgets/mainwindow.cpp | 32 +++++++++++++++++++++----------- widgets/mainwindow.h | 2 +- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Network/wsprnet.cpp b/Network/wsprnet.cpp index 2ac173095..ba1e36c18 100644 --- a/Network/wsprnet.cpp +++ b/Network/wsprnet.cpp @@ -86,26 +86,29 @@ void WSPRNet::upload (QString const& call, QString const& grid, QString const& r m_file = fileName; // Open the wsprd.out file - QFile wsprdOutFile (fileName); - if (!wsprdOutFile.open (QIODevice::ReadOnly | QIODevice::Text) || !wsprdOutFile.size ()) + if (m_uploadType != 3) { - spot_queue_.enqueue (urlEncodeNoSpot ()); - m_uploadType = 1; - } - else - { - // Read the contents - while (!wsprdOutFile.atEnd()) + QFile wsprdOutFile (fileName); + if (!wsprdOutFile.open (QIODevice::ReadOnly | QIODevice::Text) || !wsprdOutFile.size ()) { - SpotQueue::value_type query; - if (decodeLine (wsprdOutFile.readLine(), query)) + spot_queue_.enqueue (urlEncodeNoSpot ()); + m_uploadType = 1; + } + else + { + // Read the contents + while (!wsprdOutFile.atEnd()) { - // Prevent reporting data ouside of the current frequency band - float f = fabs (m_rfreq.toFloat() - query.queryItemValue ("tqrg", QUrl::FullyDecoded).toFloat()); - if (f < 0.0002) + SpotQueue::value_type query; + if (decodeLine (wsprdOutFile.readLine(), query)) { - spot_queue_.enqueue(urlEncodeSpot (query)); - m_uploadType = 2; + // Prevent reporting data ouside of the current frequency band + float f = fabs (m_rfreq.toFloat() - query.queryItemValue ("tqrg", QUrl::FullyDecoded).toFloat()); + if (f < 0.01) // MHz + { + spot_queue_.enqueue(urlEncodeSpot (query)); + m_uploadType = 2; + } } } } @@ -133,10 +136,8 @@ void WSPRNet::post (QString const& call, QString const& grid, QString const& rfr if (!spot_queue_.size ()) { spot_queue_.enqueue (urlEncodeNoSpot ()); - m_uploadType = 1; + m_uploadType = 3; } - spots_to_send_ = spot_queue_.size (); - upload_timer_.start (200); } else { diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 7f5c0a681..16eec61b9 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3248,7 +3248,14 @@ void MainWindow::decodeDone () if(m_mode=="QRA64") m_wideGraph->drawRed(0,0); if ("FST4W" == m_mode) { - uploadWSPRSpots (true); // DE station info and trigger posts + if (m_uploadWSPRSpots + && m_config.is_transceiver_online ()) { // need working rig control +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + uploadTimer.start(QRandomGenerator::global ()->bounded (0, 20000)); // Upload delay +#else + uploadTimer.start(20000 * qrand()/((double)RAND_MAX + 1.0)); // Upload delay +#endif + } } auto tnow = QDateTime::currentDateTimeUtc (); double tdone = fmod(double(tnow.time().second()),m_TRperiod); @@ -7959,35 +7966,38 @@ void MainWindow::uploadWSPRSpots (bool direct_post, QString const& decode_text) { // do not spot if disabled, replays, or if rig control not working if(!m_uploadWSPRSpots || m_diskData || !m_config.is_transceiver_online ()) return; - if(m_uploading) { + if(m_uploading && !decode_text.size ()) { qDebug() << "Previous upload has not completed, spots were lost"; wsprNet->abortOutstandingRequests (); m_uploading = false; } - QString rfreq = QString("%1").arg((m_dialFreqRxWSPR + 1500) / 1e6, 0, 'f', 6); + QString rfreq = QString("%1").arg((m_dialFreqRxWSPR + m_wideGraph->rxFreq ()) / 1e6, 0, 'f', 6); QString tfreq = QString("%1").arg((m_dialFreqRxWSPR + ui->TxFreqSpinBox->value()) / 1e6, 0, 'f', 6); auto pct = QString::number (ui->autoButton->isChecked () ? ui->sbTxPercent->value () : 0); - if (!direct_post) + if (direct_post) { + // queues one FST4W spot + wsprNet->post (m_config.my_callsign (), m_config.my_grid (), rfreq, tfreq, + m_mode, m_TRperiod, pct, + QString::number (m_dBm), version (), decode_text); + } + else + { + // queues spots for each decode in wspr_spots.txt wsprNet->upload (m_config.my_callsign (), m_config.my_grid (), rfreq, tfreq, m_mode, m_TRperiod, pct, QString::number (m_dBm), version (), m_config.writeable_data_dir ().absoluteFilePath ("wspr_spots.txt")); } - else - { - wsprNet->post (m_config.my_callsign (), m_config.my_grid (), rfreq, tfreq, - m_mode, m_TRperiod, pct, - QString::number (m_dBm), version (), decode_text); - } + // trigger upload of any queued spots if (!decode_text.size ()) { m_uploading = true; } } -void MainWindow::uploadResponse(QString response) +void MainWindow::uploadResponse(QString const& response) { if (response == "done") { m_uploading=false; diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 8c19c8302..3fbe6aa52 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -278,7 +278,7 @@ private slots: void WSPR_config(bool b); void uploadWSPRSpots (bool direct_post = false, QString const& decode_text = QString {}); void TxAgain(); - void uploadResponse(QString response); + void uploadResponse(QString const& response); void on_WSPRfreqSpinBox_valueChanged(int n); void on_sbFST4W_RxFreq_valueChanged(int n); void on_sbFST4W_FTol_valueChanged(int n); From ead587ee5553f9a948b1694c2b11ca408c7e6fa1 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 4 Oct 2020 00:45:56 +0100 Subject: [PATCH 12/19] Fix up out of date common block sizing --- lib/ft8/foxgen_wrap.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ft8/foxgen_wrap.f90 b/lib/ft8/foxgen_wrap.f90 index fec9f37c6..825107607 100644 --- a/lib/ft8/foxgen_wrap.f90 +++ b/lib/ft8/foxgen_wrap.f90 @@ -1,7 +1,7 @@ subroutine foxgen_wrap(msg40,msgbits,itone) parameter (NN=79,ND=58,KK=77,NSPS=4*1920) - parameter (NWAVE=(160+2)*134400) !the biggest waveform we generate (FST4-1800) + parameter (NWAVE=(160+2)*134400*4) !the biggest waveform we generate (FST4-1800) character*40 msg40,cmsg character*12 mycall12 From 522000cfab5763d191b7f07badb52e7f90aa4ee7 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sun, 4 Oct 2020 00:46:59 +0100 Subject: [PATCH 13/19] Added SWL Mode to View menu SWL mode hides all lower panel widgets, maximizing the size of the decodes windows. Designed for operators running several instances to monitor multiple bands and modes. --- widgets/mainwindow.cpp | 136 +- widgets/mainwindow.h | 1 + widgets/mainwindow.ui | 4692 ++++++++++++++++++++-------------------- 3 files changed, 2419 insertions(+), 2410 deletions(-) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 16eec61b9..9f073c234 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -869,8 +869,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, ui->labAz->setStyleSheet("border: 0px;"); ui->labAz->setText(""); auto t = "UTC dB DT Freq " + tr ("Message"); - ui->decodedTextLabel->setText(t); - ui->decodedTextLabel2->setText(t); + ui->lh_decodes_headings_label->setText(t); + ui->rh_decodes_headings_label->setText(t); readSettings(); //Restore user's setup parameters m_audioThread.start (m_audioThreadPriority); @@ -1172,6 +1172,7 @@ void MainWindow::writeSettings() m_settings->setValue ("JT65AP", ui->actionEnable_AP_JT65->isChecked ()); m_settings->setValue("SplitterState",ui->splitter->saveState()); m_settings->setValue("Blanker",ui->sbNB->value()); + m_settings->setValue ("SWLView", ui->actionSWL_Mode->isChecked ()); { QList coeffs; // suitable for QSettings @@ -1277,6 +1278,8 @@ void MainWindow::readSettings() ui->actionEnable_AP_JT65->setChecked (m_settings->value ("JT65AP", false).toBool()); ui->splitter->restoreState(m_settings->value("SplitterState").toByteArray()); ui->sbNB->setValue(m_settings->value("Blanker",0).toInt()); + ui->actionSWL_Mode->setChecked (m_settings->value ("SWLView", false).toBool ()); + on_actionSWL_Mode_triggered (ui->actionSWL_Mode->isChecked ()); { auto const& coeffs = m_settings->value ("PhaseEqualizationCoefficients" , QList {0., 0., 0., 0., 0.}).toList (); @@ -1344,8 +1347,8 @@ void MainWindow::setDecodedTextFont (QFont const& font) ui->textBrowser4->displayFoxToBeCalled(" "); ui->textBrowser4->setText(""); auto style_sheet = "QLabel {" + font_as_stylesheet (font) + '}'; - ui->decodedTextLabel->setStyleSheet (ui->decodedTextLabel->styleSheet () + style_sheet); - ui->decodedTextLabel2->setStyleSheet (ui->decodedTextLabel2->styleSheet () + style_sheet); + ui->lh_decodes_headings_label->setStyleSheet (ui->lh_decodes_headings_label->styleSheet () + style_sheet); + ui->rh_decodes_headings_label->setStyleSheet (ui->rh_decodes_headings_label->styleSheet () + style_sheet); if (m_msgAvgWidget) { m_msgAvgWidget->changeFont (font); } @@ -1854,8 +1857,8 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog m_config.transceiver_online (); if(!m_bFastMode) setXIT (ui->TxFreqSpinBox->value ()); if ((m_config.single_decode () && !m_mode.startsWith ("FST4")) || m_mode=="JT4") { - ui->label_6->setText(tr ("Single-Period Decodes")); - ui->label_7->setText(tr ("Average Decodes")); + ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); + ui->rh_decodes_title_label->setText(tr ("Average Decodes")); } update_watchdog_label (); @@ -2575,6 +2578,15 @@ void MainWindow::on_actionCopyright_Notice_triggered() MessageBox::warning_message(this, message); } +void MainWindow::on_actionSWL_Mode_triggered (bool checked) +{ + ui->lower_panel_widget->setVisible (!checked); + if (checked) + { + hideMenus (false); // make sure we can be turned off + } +} + // This allows the window to shrink by removing certain things // and reducing space used by controls void MainWindow::hideMenus(bool checked) @@ -2593,12 +2605,10 @@ void MainWindow::hideMenus(bool checked) minimumSize().setWidth(770); } ui->menuBar->setVisible(!checked); - if(m_mode!="FreqCal" and m_mode!="WSPR" and m_mode!="Fst4W") { - ui->label_6->setVisible(!checked); - ui->label_7->setVisible(!checked); - ui->decodedTextLabel2->setVisible(!checked); + if(m_mode!="FreqCal" and m_mode!="WSPR" and m_mode!="FST4W") { + ui->lh_decodes_title_label->setVisible(!checked); } - ui->decodedTextLabel->setVisible(!checked); + ui->lh_decodes_headings_label->setVisible(!checked); ui->gridLayout_5->layout()->setSpacing(spacing); ui->horizontalLayout_2->layout()->setSpacing(spacing); ui->horizontalLayout_5->layout()->setSpacing(spacing); @@ -2611,7 +2621,7 @@ void MainWindow::hideMenus(bool checked) ui->horizontalLayout_12->layout()->setSpacing(spacing); ui->horizontalLayout_13->layout()->setSpacing(spacing); ui->horizontalLayout_14->layout()->setSpacing(spacing); - ui->verticalLayout->layout()->setSpacing(spacing); + ui->rh_decodes_widget->layout()->setSpacing(spacing); ui->verticalLayout_2->layout()->setSpacing(spacing); ui->verticalLayout_3->layout()->setSpacing(spacing); ui->verticalLayout_5->layout()->setSpacing(spacing); @@ -3770,7 +3780,7 @@ void MainWindow::guiUpdate() } } else { - // For all modes other than WSPR and Fst4W + // For all modes other than WSPR and FST4W m_bTxTime = (t2p >= tx1) and (t2p < tx2); if(m_mode=="Echo") m_bTxTime = m_bTxTime and m_bEchoTxOK; if(m_mode=="FT8" and ui->tx5->currentText().contains("/B ")) { @@ -5921,8 +5931,8 @@ void MainWindow::on_actionFST4_triggered() m_nsps=6912; //For symspec only m_FFTSize = m_nsps / 2; Q_EMIT FFTSize(m_FFTSize); - ui->label_6->setText(tr ("Band Activity")); - ui->label_7->setText(tr ("Rx Frequency")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); WSPR_config(false); if(m_config.single_decode()) { // 012345678901234567890123456789012345 @@ -6007,13 +6017,13 @@ void MainWindow::on_actionFT4_triggered() VHF_features_enabled(bVHF); m_fastGraph->hide(); m_wideGraph->show(); - ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message")); m_wideGraph->setPeriod(m_TRperiod,m_nsps); m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe - ui->label_7->setText(tr ("Rx Frequency")); - ui->label_6->setText(tr ("Band Activity")); - ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); displayWidgets(nWidgets("111010000100111000010000000110001000")); ui->txrb2->setEnabled(true); ui->txrb4->setEnabled(true); @@ -6051,17 +6061,17 @@ void MainWindow::on_actionFT8_triggered() m_TRperiod=15.0; m_fastGraph->hide(); m_wideGraph->show(); - ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message")); m_wideGraph->setPeriod(m_TRperiod,m_nsps); m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe - ui->label_7->setText(tr ("Rx Frequency")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); if(SpecOp::FOX==m_config.special_op_id()) { - ui->label_6->setText(tr ("Stations calling DXpedition %1").arg (m_config.my_callsign())); - ui->decodedTextLabel->setText( "Call Grid dB Freq Dist Age Continent"); + ui->lh_decodes_title_label->setText(tr ("Stations calling DXpedition %1").arg (m_config.my_callsign())); + ui->lh_decodes_headings_label->setText( "Call Grid dB Freq Dist Age Continent"); } else { - ui->label_6->setText(tr ("Band Activity")); - ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message")); } displayWidgets(nWidgets("111010000100111000010000100110001000")); ui->txrb2->setEnabled(true); @@ -6156,10 +6166,10 @@ void MainWindow::on_actionJT4_triggered() m_bFast9=false; setup_status_bar (bVHF); ui->sbSubmode->setMaximum(6); - ui->label_6->setText(tr ("Single-Period Decodes")); - ui->label_7->setText(tr ("Average Decodes")); - ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message")); - ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message")); + ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); + ui->rh_decodes_title_label->setText(tr ("Average Decodes")); + 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); } else { @@ -6208,22 +6218,22 @@ void MainWindow::on_actionJT9_triggered() m_fastGraph->showNormal(); ui->TxFreqSpinBox->setValue(700); ui->RxFreqSpinBox->setValue(700); - ui->decodedTextLabel->setText(" UTC dB T Freq " + tr ("Message")); - ui->decodedTextLabel2->setText(" UTC dB T Freq " + tr ("Message")); + ui->lh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message")); } else { ui->cbAutoSeq->setChecked(false); if (m_mode != "FST4") { m_TRperiod=60.0; - ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message")); - ui->decodedTextLabel2->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")); } } m_wideGraph->setPeriod(m_TRperiod,m_nsps); m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe - ui->label_6->setText(tr ("Band Activity")); - ui->label_7->setText(tr ("Rx Frequency")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); if(bVHF) { displayWidgets(nWidgets("111110101000111110010000000000000000")); } else { @@ -6262,10 +6272,10 @@ void MainWindow::on_actionJT9_JT65_triggered() m_bFastMode=false; m_bFast9=false; ui->sbSubmode->setValue(0); - ui->label_6->setText(tr ("Band Activity")); - ui->label_7->setText(tr ("Rx Frequency")); - ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message")); - ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); + ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); displayWidgets(nWidgets("111010000001111000010000000000001000")); fast_config(false); statusChanged(); @@ -6309,12 +6319,12 @@ void MainWindow::on_actionJT65_triggered() ui->sbSubmode->setMaximum(2); if(bVHF) { ui->sbSubmode->setValue(m_nSubMode); - ui->label_6->setText(tr ("Single-Period Decodes")); - ui->label_7->setText(tr ("Average Decodes")); + ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes")); + ui->rh_decodes_title_label->setText(tr ("Average Decodes")); } else { ui->sbSubmode->setValue(0); - ui->label_6->setText(tr ("Band Activity")); - ui->label_7->setText(tr ("Rx Frequency")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->rh_decodes_title_label->setText(tr ("Rx Frequency")); } if(bVHF) { displayWidgets(nWidgets("111110010000110110101100010000000000")); @@ -6371,6 +6381,7 @@ void MainWindow::on_actionISCAT_triggered() m_hsymStop=103; m_toneSpacing=11025.0/256.0; WSPR_config(false); + ui->rh_decodes_widget->setVisible (false); switch_mode(Modes::ISCAT); m_wideGraph->setMode(m_mode); m_wideGraph->setModeTx(m_modeTx); @@ -6379,10 +6390,7 @@ void MainWindow::on_actionISCAT_triggered() if(m_wideGraph->isVisible()) m_wideGraph->hide(); setup_status_bar (true); ui->cbShMsgs->setChecked(false); - ui->label_7->setText(""); - ui->decodedTextBrowser2->setVisible(false); - ui->decodedTextLabel2->setVisible(false); - ui->decodedTextLabel->setText( + ui->lh_decodes_headings_label->setText( " UTC Sync dB DT DF F1 M N C T "); ui->tabWidget->setCurrentIndex(0); ui->sbSubmode->setMaximum(1); @@ -6437,13 +6445,13 @@ void MainWindow::on_actionMSK144_triggered() ui->RxFreqSpinBox->setMinimum(1400); ui->RxFreqSpinBox->setMaximum(1600); ui->RxFreqSpinBox->setSingleStep(10); - ui->decodedTextLabel->setText(" UTC dB T Freq " + tr ("Message")); - ui->decodedTextLabel2->setText(" UTC dB T Freq " + tr ("Message")); + ui->lh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message")); m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe m_fastGraph->setTRPeriod(m_TRperiod); - ui->label_6->setText(tr ("Band Activity")); - ui->label_7->setText(tr ("Tx Messages")); + ui->lh_decodes_title_label->setText(tr ("Band Activity")); + ui->rh_decodes_title_label->setText(tr ("Tx Messages")); ui->actionMSK144->setChecked(true); ui->rptSpinBox->setMinimum(-8); ui->rptSpinBox->setMaximum(24); @@ -6522,7 +6530,7 @@ void MainWindow::on_actionEcho_triggered() m_bFastMode=false; m_bFast9=false; WSPR_config(true); - ui->decodedTextLabel->setText(" UTC N Level Sig DF Width Q"); + ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q"); displayWidgets(nWidgets("000000000000000000000010000000000000")); fast_config(false); statusChanged(); @@ -6547,7 +6555,7 @@ void MainWindow::on_actionFreqCal_triggered() ui->RxFreqSpinBox->setValue(1500); setup_status_bar (true); // 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2 - ui->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N"); + ui->lh_decodes_headings_label->setText(" UTC Freq CAL Offset fMeas DF Level S/N"); ui->measure_check_box->setChecked (false); displayWidgets(nWidgets("001101000000000000000000000001000000")); statusChanged(); @@ -6580,23 +6588,19 @@ void MainWindow::switch_mode (Mode mode) ui->tabWidget->setVisible(!b); if(b) { ui->DX_controls_widget->setVisible(false); - ui->decodedTextBrowser2->setVisible(false); - ui->decodedTextLabel2->setVisible(false); - ui->label_6->setVisible(false); - ui->label_7->setVisible(false); + ui->rh_decodes_widget->setVisible (false); + ui->lh_decodes_title_label->setVisible(false); } } void MainWindow::WSPR_config(bool b) { - ui->decodedTextBrowser2->setVisible(!b); - ui->decodedTextLabel2->setVisible(!b and ui->cbMenus->isChecked()); + 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->WSPR_controls_widget->setVisible (b); - ui->label_6->setVisible(!b and ui->cbMenus->isChecked()); - ui->label_7->setVisible(!b and ui->cbMenus->isChecked()); + ui->lh_decodes_title_label->setVisible(!b and ui->cbMenus->isChecked()); ui->logQSOButton->setVisible(!b); ui->DecodeButton->setEnabled(!b); bool bFST4W=(m_mode=="FST4W"); @@ -6610,7 +6614,7 @@ void MainWindow::WSPR_config(bool b) QString t="UTC dB DT Freq Drift Call Grid dBm "; if(m_config.miles()) t += " mi"; if(!m_config.miles()) t += " km"; - ui->decodedTextLabel->setText(t); + ui->lh_decodes_headings_label->setText(t); if (m_config.is_transceiver_online ()) { m_config.transceiver_tx_frequency (0); // turn off split } @@ -7518,18 +7522,18 @@ void MainWindow::on_sbTR_valueChanged(int value) { if (m_TRperiod < 60) { - ui->decodedTextLabel->setText(" UTC dB DT Freq " + tr ("Message")); + ui->lh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message")); if (m_mode != "FST4W") { - ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message")); } } else { - ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message")); + ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); if (m_mode != "FST4W") { - ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message")); + ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message")); } } } diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 3fbe6aa52..7a8537d03 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -165,6 +165,7 @@ private slots: void on_actionSpecial_mouse_commands_triggered(); void on_actionSolve_FreqCal_triggered(); void on_actionCopyright_Notice_triggered(); + void on_actionSWL_Mode_triggered (bool checked); void on_DecodeButton_clicked (bool); void decode(); void decodeBusy(bool b); diff --git a/widgets/mainwindow.ui b/widgets/mainwindow.ui index a932ca1cd..6ffcf9a24 100644 --- a/widgets/mainwindow.ui +++ b/widgets/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 805 - 555 + 589 @@ -23,16 +23,22 @@ - + + + + 0 + 2 + + Qt::Horizontal - + 500 @@ -55,7 +61,7 @@ - + 300 @@ -179,10 +185,22 @@ - - + + + + 0 + + + 0 + + + 0 + + + 0 + - + 10 @@ -199,7 +217,7 @@ - + 300 @@ -323,59 +341,74 @@ - - - - - CQ only - - - - - - - - 50 - 0 - - - - Enter this QSO in log - - - Log &QSO - - - - - - - - 50 - 0 - - - - Stop monitoring - - - &Stop - - - - - - - - 50 - 0 - - - - Toggle monitoring On/Off - - - QPushButton:checked { + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + CQ only + + + + + + + + 50 + 0 + + + + Enter this QSO in log + + + Log &QSO + + + + + + + + 50 + 0 + + + + Stop monitoring + + + &Stop + + + + + + + + 50 + 0 + + + + Toggle monitoring On/Off + + + QPushButton:checked { color: #000000; background-color: #00ff00; border-style: outset; @@ -385,69 +418,69 @@ min-width: 5em; padding: 3px; } - - - &Monitor - - - true - - - false - - - - - - - - 50 - 0 - - - - <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> - - - Erase right window. Double-click to erase both windows. - - - &Erase - - - - - - - true - - - <html><head/><body><p>Clear the accumulating message average.</p></body></html> - - - Clear the accumulating message average. - - - Clear Avg - - - - - - - - 50 - 0 - - - - <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> - - - Decode most recent Rx period at QSO Frequency - - - QPushButton:checked { + + + &Monitor + + + true + + + false + + + + + + + + 50 + 0 + + + + <html><head/><body><p>Erase right window. Double-click to erase both windows.</p></body></html> + + + Erase right window. Double-click to erase both windows. + + + &Erase + + + + + + + true + + + <html><head/><body><p>Clear the accumulating message average.</p></body></html> + + + Clear the accumulating message average. + + + Clear Avg + + + + + + + + 50 + 0 + + + + <html><head/><body><p>Decode most recent Rx period at QSO Frequency</p></body></html> + + + Decode most recent Rx period at QSO Frequency + + + QPushButton:checked { color: rgb(0, 0, 0); background-color: cyan; border-style: outset; @@ -457,31 +490,31 @@ min-width: 5em; padding: 3px; } - - - &Decode - - - true - - - - - - - - 50 - 0 - - - - <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> - - - Toggle Auto-Tx On/Off - - - QPushButton:checked { + + + &Decode + + + true + + + + + + + + 50 + 0 + + + + <html><head/><body><p>Toggle Auto-Tx On/Off</p></body></html> + + + Toggle Auto-Tx On/Off + + + QPushButton:checked { color: rgb(0, 0, 0); background-color: red; border-style: outset; @@ -491,41 +524,41 @@ min-width: 5em; padding: 3px; } - - - E&nable Tx - - - true - - - - - - - - 50 - 0 - - - - Stop transmitting immediately - - - &Halt Tx - - - - - - - <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> - - - Toggle a pure Tx tone On/Off - - - QPushButton:checked { + + + E&nable Tx + + + true + + + + + + + + 50 + 0 + + + + Stop transmitting immediately + + + &Halt Tx + + + + + + + <html><head/><body><p>Toggle a pure Tx tone On/Off</p></body></html> + + + Toggle a pure Tx tone On/Off + + + QPushButton:checked { color: rgb(0, 0, 0); background-color: red; border-style: outset; @@ -535,42 +568,75 @@ min-width: 5em; padding: 3px; } - - - &Tune - - - true - - - - - - - Menus - - - true - - - - - - - - - - - false - - - <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> - - - If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. - - - QPushButton { + + + &Tune + + + true + + + + + + + Menus + + + true + + + + + + + + + + + + 0 + 0 + + + + USB dial frequency + + + QLabel { + font-family: MS Shell Dlg 2; + font-size: 16pt; + color : yellow; + background-color : black; +} +QLabel[oob="true"] { + background-color: red; +} + + + 14.078 000 + + + Qt::AlignCenter + + + 5 + + + + + + + false + + + <html><head/><body><p>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</p></body></html> + + + If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode. + + + QPushButton { font-family: helvetica; font-size: 9pt; font-weight: bold; @@ -594,56 +660,448 @@ QPushButton[state="warning"] { QPushButton[state="ok"] { background-color: #00ff00; } - - - ? - - - - - - - <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> - - - Frequency entry - - - Select operating band or enter frequency in MHz or enter kHz increment followed by k. - - - true - - - QComboBox::NoInsert - - - QComboBox::AdjustToMinimumContentsLength - - - - - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - + + + ? + + + + + + + Pwr + + + + + + + <html><head/><body><p>Select operating band or enter frequency in MHz or enter kHz increment followed by k.</p></body></html> + + + Frequency entry + + + Select operating band or enter frequency in MHz or enter kHz increment followed by k. + + + true + + + QComboBox::NoInsert + + + QComboBox::AdjustToMinimumContentsLength + + + + + + + + + Qt::AlignCenter + + + % + + + NB + + + -2 + + + 25 + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> + + + Rx Signal + + + 30dB recommended when only noise present +Green when good +Red when clipping may occur +Yellow when too low + + + QFrame::Panel + + + QFrame::Sunken + + + + + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 159 + 175 + 213 + + + + + + + 159 + 175 + 213 + + + + + + + + true + + + DX Call + + + Qt::AlignCenter + + + 5 + + + 2 + + + dxCallEntry + + + + + + + + 0 + 0 + + + + true + + + Az: 251 16553 km + + + Qt::AlignCenter + + + 4 + + + + + + + Callsign of station to be worked + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 252 + 252 + 252 + + + + + + + 159 + 175 + 213 + + + + + + + + + 159 + 175 + 213 + + + + + + + 159 + 175 + 213 + + + + + + + + true + + + DX Grid + + + Qt::AlignCenter + + + 5 + + + 2 + + + dxGridEntry + + + + + + + Search for callsign in database + + + &Lookup + + + + + + + Locator of station to be worked + + + + + + Qt::AlignCenter + + + + + + + Add callsign and locator to database + + + Add + + + + + + + + + + + 0 + 0 + + + + QLabel { + font-family: MS Shell Dlg 2; + font-size: 16pt; + background-color : black; + color : yellow; +} + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 2 + + + 0 + + + <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> + + + Qt::AlignCenter + + + 5 + + + + + + + Adjust Tx audio level + + + 450 + + + 0 + + + Qt::Vertical + + + true + + + true + + + QSlider::TicksBelow + + + 50 + + + + + + + 0 + + + 0 @@ -657,211 +1115,522 @@ QPushButton[state="ok"] { 0 - - - - - - - <html><head/><body><p>Check to use short-format messages.</p></body></html> - - - Check to use short-format messages. - - - Sh - - - - - - - <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> - - - Check to enable JT9 fast modes - - - Fast - - - - - - - <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> - - - Check to enable automatic sequencing of Tx messages based on received messages. - - - Auto Seq - - - - - - - <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> - - - Check to call the first decoded responder to my CQ. - - - Call 1st - - - - - - - false - - - Check to generate "@1250 (SEND MSGS)" in Tx6. - - - Tx6 - - - - - - - - - <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> - - - Submode determines tone spacing; A is narrowest. - - - Qt::AlignCenter - - - Submode - - - 0 - - - 7 - - - - - - - - - false - - - <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> - - - Frequency to call CQ on in kHz above the current MHz - - - Tx CQ - - - 1 - - - 999 - - - 260 - - - - - - - false - - - <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> - - - Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + + 50 + 20 + + + + Set Tx frequency to Rx Frequency + + + Set Tx frequency to Rx Frequency + + + + + + + + + + Frequency tolerance (Hz) + + + Qt::AlignCenter + + + F Tol + + + 1 + + + 1000 + + + 10 + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + + 50 + 20 + + + + Set Rx frequency to Tx Frequency + + + Set Rx frequency to Tx Frequency + + + + + + + + + + + + true + + + + 0 + 0 + + + + Toggle Tx mode + + + Tx JT9 @ + + + + + + + Audio Tx frequency + + + Qt::AlignCenter + + + Hz + + + Tx + + + 200 + + + 5000 + + + 1500 + + + + + + + <html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html> + + + Submode determines tone spacing; A is narrowest. + + + Qt::AlignCenter + + + Submode + + + 0 + + + 7 + + + + + + + Qt::AlignCenter + + + + + + F High + + + 100 + + + 5000 + + + 50 + + + 1400 + + + + + + + + + <html><head/><body><p>Check to use short-format messages.</p></body></html> + + + Check to use short-format messages. + + + Sh + + + + + + + <html><head/><body><p>Check to enable JT9 fast modes</p></body></html> + + + Check to enable JT9 fast modes + + + Fast + + + + + + + <html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html> + + + Check to enable automatic sequencing of Tx messages based on received messages. + + + Auto Seq + + + + + + + <html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html> + + + Check to call the first decoded responder to my CQ. + + + Call 1st + + + + + + + false + + + Check to generate "@1250 (SEND MSGS)" in Tx6. + + + Tx6 + + + + + + + + + Qt::AlignCenter + + + F Low + + + 100 + + + 5000 + + + 50 + + + 600 + + + + + + + <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> + + + Double-click on another caller to queue that call for your next QSO. + + + Next Call + + + Qt::AlignCenter + + + + + + + Audio Rx frequency + + + Qt::AlignCenter + + + Hz + + + Rx + + + 200 + + + 5000 + + + 1500 + + + + + + + <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> + + + Tx/Rx or Frequency calibration sequence length + + + Qt::AlignCenter + + + s + + + T/R + + + 5 + + + 1800 + + + 30 + + + + + + + + + false + + + <html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html> + + + Frequency to call CQ on in kHz above the current MHz + + + Tx CQ + + + 1 + + + 999 + + + 260 + + + + + + + false + + + <html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html> + + + Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on. Not available to nonstandard callsign holders. - - - - - - - - - - Rx All Freqs - - - - - - - - - true - - - - 0 - 0 - - - - Toggle Tx mode - - - Tx JT9 @ - - - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - Fox - - - Qt::AlignCenter - - - - - - - <html><head/><body><p>Check to monitor Sh messages.</p></body></html> - - - Check to monitor Sh messages. - - - SWL - - - - - - - QPushButton:checked { + + + + + + + + + + Rx All Freqs + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Tx# + + + 1 + + + 4095 + + + + + + + <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> + + + Check to keep Tx frequency fixed when double-clicking on decoded text. + + + Hold Tx Freq + + + + + + + <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> + + + Synchronizing threshold. Lower numbers accept weaker sync signals. + + + Qt::AlignCenter + + + Sync + + + -1 + + + 10 + + + 1 + + + + + + + <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> + + + Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. + + + Tx even/1st + + + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + Fox + + + Qt::AlignCenter + + + + + + + <html><head/><body><p>Check to monitor Sh messages.</p></body></html> + + + Check to monitor Sh messages. + + + SWL + + + + + + + QPushButton:checked { color: rgb(0, 0, 0); background-color: red; border-style: outset; @@ -871,945 +1640,748 @@ Not available to nonstandard callsign holders. min-width: 5em; padding: 3px; } - - - Best S+P - - - true - - - - - - - <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> - - - Check this to start recording calibration data. + + + Best S+P + + + true + + + + + + + <html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html> + + + Check this to start recording calibration data. While measuring calibration correction is disabled. When not checked you can view the calibration results. - - - Measure - - - - - - - - - Audio Tx frequency - - - Qt::AlignCenter - - - Hz - - - Tx - - - 200 - - - 5000 - - - 1500 - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Tx# - - - 1 - - - 4095 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - <html><head/><body><p>Check to keep Tx frequency fixed when double-clicking on decoded text.</p></body></html> - - - Check to keep Tx frequency fixed when double-clicking on decoded text. - - - Hold Tx Freq - - - - - - - <html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html> - - - Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences. - - - Tx even/1st - - - - - - - <html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html> - - - Synchronizing threshold. Lower numbers accept weaker sync signals. - - - Qt::AlignCenter - - - Sync - - - -1 - - - 10 - - - 1 - - - - - - - <html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html> - - - Double-click on another caller to queue that call for your next QSO. - - - Next Call - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - F High - - - 100 - - - 5000 - - - 50 - - - 1400 - - - - - - - Qt::AlignCenter - - - F Low - - - 100 - - - 5000 - - - 50 - - - 600 - - - - - - - Audio Rx frequency - - - Qt::AlignCenter - - - Hz - - - Rx - - - 200 - - - 5000 - - - 1500 - - - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - - 50 - 20 - - - - Set Tx frequency to Rx Frequency - - - Set Tx frequency to Rx Frequency - - - - - - - - - - Frequency tolerance (Hz) - - - Qt::AlignCenter - - - F Tol - - - 1 - - - 1000 - - - 10 - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - - 50 - 20 - - - - Set Rx frequency to Tx Frequency - - - Set Rx frequency to Tx Frequency - - - - - - - - - - - - <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> - - - Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). - - - Qt::AlignCenter - - - Report - - - -50 - - - 49 - - - -15 - - - - - - - <html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html> - - - Tx/Rx or Frequency calibration sequence length - - - Qt::AlignCenter - - - s - - - T/R - - - 5 - - - 1800 - - - 30 - - - - - - - - - - 0 - 0 - - - - QTabWidget::West - - - QTabWidget::Triangular - - - 0 - - - - 1 - - - - - - - - Send this message in next Tx interval - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+2 - - - - - - - <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> - - - Send this message in next Tx interval + + + Measure + + + + + + + + + <html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html> + + + Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB). + + + Qt::AlignCenter + + + Report + + + -50 + + + 49 + + + -15 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + QTabWidget::West + + + QTabWidget::Triangular + + + 0 + + + + 1 + + + + + + + + Send this message in next Tx interval + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+2 + + + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + Send this message in next Tx interval Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+1 - - - - - - - Switch to this Tx message NOW - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &2 - - - Alt+2 - - - - - - - - - - <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> - - - Switch to this Tx message NOW + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+1 + + + + + + + Switch to this Tx message NOW + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &2 + + + Alt+2 + + + + + + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders)</p></body></html> + + + Switch to this Tx message NOW Double click to toggle the use of the Tx1 message to start a QSO with a station (not allowed for type 1 compound call holders) - - - Qt::LeftToRight - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &1 - - - Alt+1 - - - - - - - Send this message in next Tx interval - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+6 - - - true - - - - - - - - - - <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> - - - Send this message in next Tx interval + + + Qt::LeftToRight + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &1 + + + Alt+1 + + + + + + + Send this message in next Tx interval + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+6 + + + true + + + + + + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + Send this message in next Tx interval Double-click to reset to the standard 73 message - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+5 - - - - - - - Send this message in next Tx interval - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+3 - - - - - - - Switch to this Tx message NOW - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &3 - - - Alt+3 - - - - - - - <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> - - - Send this message in next Tx interval + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+5 + + + + + + + Send this message in next Tx interval + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+3 + + + + + + + Switch to this Tx message NOW + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &3 + + + Alt+3 + + + + + + + <html><head/><body><p>Send this message in next Tx interval</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + Send this message in next Tx interval Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type 2 compound call holders) RR73 messages should only be used when you are reasonably confident that no message repetitions will be required - - - margin-left: 10%; margin-right: 0% - - - - - - Ctrl+4 - - - - - - - <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> - - - Switch to this Tx message NOW + + + margin-left: 10%; margin-right: 0% + + + + + + Ctrl+4 + + + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders)</p><p>RR73 messages should only be used when you are reasonably confident that no message repetitions will be required</p></body></html> + + + Switch to this Tx message NOW Double-click to toggle between RRR and RR73 messages in Tx4 (not allowed for type2 compound call holders) RR73 messages should only be used when you are reasonably confident that no message repetitions will be required - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &4 - - - Alt+4 - - - - - - - <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> - - - Switch to this Tx message NOW + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &4 + + + Alt+4 + + + + + + + <html><head/><body><p>Switch to this Tx message NOW</p><p>Double-click to reset to the standard 73 message</p></body></html> + + + Switch to this Tx message NOW Double-click to reset to the standard 73 message - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &5 - - - Alt+5 - - - - - - - - - - Switch to this Tx message NOW - - - Now - - - Qt::AlignCenter - - - - - - - Generate standard messages for minimal QSO - - - Generate Std Msgs - - - - - - - Switch to this Tx message NOW - - - padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% - - - Tx &6 - - - Alt+6 - - - - - - - Enter a free text message (maximum 13 characters) + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &5 + + + Alt+5 + + + + + + + + + + Switch to this Tx message NOW + + + Now + + + Qt::AlignCenter + + + + + + + Generate standard messages for minimal QSO + + + Generate Std Msgs + + + + + + + Switch to this Tx message NOW + + + padding-left: 15%; padding-right: 15%; padding-top: 3%; padding-bottom: 3% + + + Tx &6 + + + Alt+6 + + + + + + + Enter a free text message (maximum 13 characters) or select a predefined macro from the dropdown list. Press ENTER to add the current text to the predefined list. The list can be maintained in Settings (F2). - - - true - - - QComboBox::InsertAtBottom - - - - - - - - - - + + + true + + + QComboBox::InsertAtBottom + + + + + + + + + + + + + + + + + + + + + Queue up the next Tx message + + + Next + + + Qt::AlignCenter + + + + + + + + + + 2 + + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Max dB + + + -15 + + + 70 + + + 30 + + + + + + + CQ + + + + CQ + + + + + CQ AF + + + + + CQ AN + + + + + CQ AS + + + + + CQ EU + + + + + CQ NA + + + + + CQ OC + + + + + CQ SA + + + + + CQ 0 + + + + + CQ 1 + + + + + CQ 2 + + + + + CQ 3 + + + + + CQ 4 + + + + + CQ 5 + + + + + CQ 6 + + + + + CQ 7 + + + + + CQ 8 + + + + + CQ 9 + + + + + + + + Reset + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + N List + + + 5 + + + 100 + + + 12 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + N Slots + + + 1 + + + 5 + + + 1 + + + 10 + + + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Random + + + 5 + + + + Random + + + + + Call + + + + + Grid + + + + + S/N (dB) + + + + + Distance + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + More CQs + + + + + + + + + + 16777215 + 16777215 + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + - - - + + + Qt::Horizontal - - - - - - Queue up the next Tx message - - - Next - - - Qt::AlignCenter - - - - - - - - - - 2 - - - - - - - - - 0 - 0 - - - + - 16777215 - 16777215 + 40 + 20 - - Max dB - - - -15 - - - 70 - - - 30 - - + - - - - CQ + + + + Qt::Horizontal - - - CQ - - - - - CQ AF - - - - - CQ AN - - - - - CQ AS - - - - - CQ EU - - - - - CQ NA - - - - - CQ OC - - - - - CQ SA - - - - - CQ 0 - - - - - CQ 1 - - - - - CQ 2 - - - - - CQ 3 - - - - - CQ 4 - - - - - CQ 5 - - - - - CQ 6 - - - - - CQ 7 - - - - - CQ 8 - - - - - CQ 9 - - - - - - - - Reset - - - - - - - - 0 - 0 - - - + - 16777215 - 16777215 + 40 + 20 - - N List - - - 5 - - - 100 - - - 12 - - + - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - N Slots - - - 1 - - - 5 - - - 1 - - - 10 - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Random - - - 5 - - - - Random - - - - - Call - - - - - Grid - - - - - S/N (dB) - - - - - Distance - - - - - - + + Qt::Vertical @@ -1821,417 +2393,318 @@ list. The list can be maintained in Settings (F2). - - - - More CQs - - - - - - - - - - 16777215 - 16777215 - - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Qt::AlignCenter - - - Hz - - - Tx - - - 1400 - - - 1600 - - - 1500 - - - - - - - Qt::AlignCenter - - - Hz - - - Rx - - - 100 - - - 4900 - - - 100 - - - 1500 - - - - - - - Qt::AlignCenter - - - Hz - - - F Tol - - - 100 - - - 500 - - - 100 - - - - - - - true - - - 0 - - - - Random - - - - - 1/2 - - - - - 2/2 - - - - - 1/3 - - - - - 2/3 - - - - - 3/3 - - - - - 1/4 - - - - - 2/4 - - - - - 3/4 - - - - - 4/4 - - - - - 1/5 - - - - - 2/5 - - - - - 3/5 - - - - - 4/5 - - - - - 5/5 - - - - - 1/6 - - - - - 2/6 - - - - - 3/6 - - - - - 4/6 - - - - - 5/6 - - - - - 6/6 - - - - - - - - Percentage of minute sequences devoted to transmitting. - - - QSpinBox:enabled[notx="true"] { - color: rgb(0, 0, 0); - background-color: rgb(255, 255, 0); -} - - - Qt::AlignCenter - - - % - - - Tx Pct - - - 100 - - - - - - - Qt::AlignCenter - - - s - - - T/R - - - 15 - - - 1800 - - - - - - - Band Hopping - - - true - - + + + + - - - Choose bands and times of day for band-hopping. + + + Qt::AlignCenter - - Schedule ... + + Hz + + + Tx + + + 1400 + + + 1600 + + + 1500 - - - - - - - - - - - - - - - Upload decoded messages to WSPRnet.org. + + + + Qt::AlignCenter + + + Hz + + + Rx + + + 100 + + + 4900 + + + 100 + + + 1500 + + + + + + + Qt::AlignCenter + + + Hz + + + F Tol + + + 100 + + + 500 + + + 100 + + + + + + + true + + + 0 + + + + Random - - QCheckBox:unchecked { + + + + 1/2 + + + + + 2/2 + + + + + 1/3 + + + + + 2/3 + + + + + 3/3 + + + + + 1/4 + + + + + 2/4 + + + + + 3/4 + + + + + 4/4 + + + + + 1/5 + + + + + 2/5 + + + + + 3/5 + + + + + 4/5 + + + + + 5/5 + + + + + 1/6 + + + + + 2/6 + + + + + 3/6 + + + + + 4/6 + + + + + 5/6 + + + + + 6/6 + + + + + + + + Percentage of minute sequences devoted to transmitting. + + + QSpinBox:enabled[notx="true"] { color: rgb(0, 0, 0); background-color: rgb(255, 255, 0); } - - - Upload spots - - - - - - - - - <html><head/><body><p>6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> - - - 6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. - - - Prefer Type 1 messages - - - true - - - - - - - No own call decodes - - - - - - - - - <html><head/><body><p>Transmit during the next sequence.</p></body></html> - - - QPushButton:checked { + + + Qt::AlignCenter + + + % + + + Tx Pct + + + 100 + + + + + + + Qt::AlignCenter + + + s + + + T/R + + + 15 + + + 1800 + + + + + + + Band Hopping + + + true + + + + + + Choose bands and times of day for band-hopping. + + + Schedule ... + + + + + + + + + + + + + + + + + + Upload decoded messages to WSPRnet.org. + + + QCheckBox:unchecked { + color: rgb(0, 0, 0); + background-color: rgb(255, 255, 0); +} + + + Upload spots + + + + + + + + + <html><head/><body><p>6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol.</p></body></html> + + + 6 digit locators cause 2 different messages to be sent, the second contains the full locator but only a hashed callsign, other stations must have decoded the first once before they can decode your call in the second. Check this option to only send 4 digit locators if it will avoid the two message protocol. + + + Prefer Type 1 messages + + + true + + + + + + + No own call decodes + + + + + + + + + <html><head/><body><p>Transmit during the next sequence.</p></body></html> + + + QPushButton:checked { color: rgb(0, 0, 0); background-color: red; border-style: outset; @@ -2241,520 +2714,87 @@ list. The list can be maintained in Settings (F2). min-width: 5em; padding: 3px; } - - - Tx Next - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - + + + Tx Next + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Set Tx power in dBm (dB above 1 mW) as part of your WSPR message. + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + - - - - - - - - - - 0 - 0 - - - - USB dial frequency - - - QLabel { - font-family: MS Shell Dlg 2; - font-size: 16pt; - color : yellow; - background-color : black; -} -QLabel[oob="true"] { - background-color: red; -} - - - 14.078 000 - - - Qt::AlignCenter - - - 5 - - - - - - - Pwr - - - - - - - - 0 - 0 - - - - QLabel { - font-family: MS Shell Dlg 2; - font-size: 16pt; - background-color : black; - color : yellow; -} - - - QFrame::StyledPanel - - - QFrame::Sunken - - - 2 - - - 0 - - - <html><head/><body><p align="center"> 2015 Jun 17 </p><p align="center"> 01:23:45 </p></body></html> - - - Qt::AlignCenter - - - 5 - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - <html><head/><body><p>30dB recommended when only noise present<br/>Green when good<br/>Red when clipping may occur<br/>Yellow when too low</p></body></html> - - - Rx Signal - - - 30dB recommended when only noise present -Green when good -Red when clipping may occur -Yellow when too low - - - QFrame::Panel - - - QFrame::Sunken - - - - - - - Adjust Tx audio level - - - 450 - - - 0 - - - Qt::Vertical - - - true - - - true - - - QSlider::TicksBelow - - - 50 - - - - - - - Qt::AlignCenter - - - % - - - NB - - - -3 - - - 25 - - - - - - - - 0 - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 159 - 175 - 213 - - - - - - - 159 - 175 - 213 - - - - - - - - true - - - DX Call - - - Qt::AlignCenter - - - 5 - - - 2 - - - dxCallEntry - - - - - - - - 0 - 0 - - - - true - - - Az: 251 16553 km - - - Qt::AlignCenter - - - 4 - - - - - - - Callsign of station to be worked - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 252 - 252 - 252 - - - - - - - 159 - 175 - 213 - - - - - - - - - 159 - 175 - 213 - - - - - - - 159 - 175 - 213 - - - - - - - - true - - - DX Grid - - - Qt::AlignCenter - - - 5 - - - 2 - - - dxGridEntry - - - - - - - Search for callsign in database - - - &Lookup - - - - - - - Locator of station to be worked - - - - - - Qt::AlignCenter - - - - - - - Add callsign and locator to database - - - Add - - - - + + + @@ -2800,7 +2840,7 @@ Yellow when too low - + @@ -3342,6 +3382,17 @@ Yellow when too low FST4W + + + true + + + SWL Mode + + + Hide lower panel controls to maximize deocde windows + + @@ -3392,54 +3443,7 @@ Yellow when too low autoButton stopTxButton tuneButton - dxCallEntry - dxGridEntry - lookupButton - addButton - txFirstCheckBox - TxFreqSpinBox - sbCQTxFreq - cbCQTx - cbShMsgs - cbFast9 - cbAutoSeq - cbTx6 - pbTxMode - sbSubmode - syncSpinBox - tabWidget - outAttenuation - genStdMsgsPushButton - tx1 - tx2 - tx3 - tx4 - tx5 - tx6 - txrb1 - txrb2 - txrb3 - txrb4 - txrb5 - txrb6 - txb1 - txb2 - txb3 - txb4 - txb5 - txb6 - band_hopping_group_box - band_hopping_schedule_push_button - cbUploadWSPR_Spots - WSPR_prefer_type_1_check_box - pbTxNext - TxPowerComboBox - WSPRfreqSpinBox - decodedTextBrowser2 decodedTextBrowser - bandComboBox - sbTxPercent - readFreq From d15e419993de5f88b996141f47c47a46408b43b0 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 7 Oct 2020 19:11:27 +0100 Subject: [PATCH 14/19] Allow UDP service port zero, this disables the UDP Message Protocol --- Configuration.cpp | 7 +------ Configuration.ui | 12 ++++++------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Configuration.cpp b/Configuration.cpp index 0466fd662..5df45c543 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -1070,18 +1070,13 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network // // validation + // 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, 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 ()); - - ui_->n1mm_server_port_spin_box->setMinimum (1); - ui_->n1mm_server_port_spin_box->setMaximum (std::numeric_limits::max ()); - // // assign ids to radio buttons // diff --git a/Configuration.ui b/Configuration.ui index d22032d53..fbd53c422 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -1893,9 +1893,6 @@ and DX Grid fields when a 73 or free text message is sent. <html><head/><body><p>Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be broadcast.</p></body></html> - - 0 - 65534 @@ -1988,6 +1985,9 @@ and DX Grid fields when a 73 or free text message is sent. <html><head/><body><p>Enter the port number that WSJT-X should use for UDP broadcasts of ADIF log information. For N1MM Logger+, this value should be 2333. If this is zero, no updates will be broadcast.</p></body></html> + + 65534 + @@ -3194,11 +3194,11 @@ Right click for insert and delete options. - - + - + + From 41fa614324133a05e4ace4254a496d01cce8d7a1 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Wed, 7 Oct 2020 19:16:48 +0100 Subject: [PATCH 15/19] Bump RC number --- Versions.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Versions.cmake b/Versions.cmake index ab6753cf6..a5345179d 100644 --- a/Versions.cmake +++ b/Versions.cmake @@ -2,5 +2,5 @@ set (WSJTX_VERSION_MAJOR 2) set (WSJTX_VERSION_MINOR 3) set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 1) # release candidate number, comment out or zero for development versions +set (WSJTX_RC 2) # release candidate number, comment out or zero for development versions set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build From d9c992943af8b3f3758f3c955f7c6cc59e14e0f7 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 10 Oct 2020 13:17:21 +0100 Subject: [PATCH 16/19] Fix CMake warning when using new configurations --- CMakeLists.txt | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4df1159d..8a0d48716 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,37 +22,41 @@ Change this to the newest SDK available that you can install on your system (>10 Do not override this if you intend to build an official deployable installer.") endif (APPLE) -project (wsjtx C CXX Fortran) - # # CMake policies # if (POLICY CMP0020) cmake_policy (SET CMP0020 NEW) # link to Qt winmain on Windows -endif (POLICY CMP0020) +endif () if (POLICY CMP0043) cmake_policy (SET CMP0043 NEW) # ignore COMPILE_DEFINITIONS_ -endif (POLICY CMP0043) +endif () + +if (POLICY CMP0048) + cmake_policy (SET CMP0048 NEW) # clear PROJECT_VERSION_* variables if not defined in project() command +endif () if (POLICY CMP0063) cmake_policy (SET CMP0063 NEW) # honour visibility properties for all library types -endif (POLICY CMP0063) +endif () if (POLICY CMP0071) cmake_policy (SET CMP0071 NEW) # run automoc and autouic on generated sources -endif (POLICY CMP0071) +endif () if (POLICY CMP0075) cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks -endif (POLICY CMP0075) - -include (${PROJECT_SOURCE_DIR}/CMake/VersionCompute.cmake) -message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}") +endif () # # project information # +project (wsjtx C CXX Fortran) + +include (${PROJECT_SOURCE_DIR}/CMake/VersionCompute.cmake) +message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}") + set (PROJECT_NAME "WSJT-X") set (PROJECT_VENDOR "Joe Taylor, K1JT") set (PROJECT_CONTACT "Joe Taylor ") From ed92d0811ae6df61b12b887935bf1bcef0779ea8 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 10 Oct 2020 13:18:04 +0100 Subject: [PATCH 17/19] Implement "No own decodes" functionality for FST4W mode --- widgets/mainwindow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 9f073c234..e6b410d41 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -3312,6 +3312,12 @@ void MainWindow::readFromStdout() //readFromStdout fSpread = text.toFloat (&haveFSpread); line_read = line_read.left (64); } + auto const& cs = m_config.my_callsign ().toLocal8Bit (); + if ("FST4W" == m_mode && ui->cbNoOwnCall->isChecked () + && (line_read.contains (" " + cs + " ") + || line_read.contains ("<" + cs + ">"))) { + continue; + } } if (m_mode!="FT8" and m_mode!="FT4" && !m_mode.startsWith ("FST4")) { From 1995d762bbdd7c80359008e1e2b4ee1bee2294ac Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Sat, 10 Oct 2020 13:38:15 +0100 Subject: [PATCH 18/19] Add Version Info resources to Windows executables where needed. Version information and more in the Windows resources for main applications, installer and un-installer. Update CMake policies for new project() command, and DEB dependency changes Support older libgfortran packages, and other Linux package dependencies. Use new project description file in Debian packaging. Linux packaging dependency adjustments for Debian style packages, including a machine readable Debian copyright format, project description in separate file for CPack compatibility, and use for DEB packaging. Configure check for need to link libm Standard C Math Library. CMake compatibility for <3.17. --- CMake/Modules/VersionInfo.h.in | 94 ++++ CMake/Modules/VersionResource.rc.in | 73 +++ CMake/Modules/generate_version_info.cmake | 167 +++++++ CMake/Modules/set_build_type.cmake | 42 ++ CMake/VersionCompute.cmake | 11 - CMake/getsvn.cmake | 46 +- CMakeCPackOptions.cmake.in | 16 +- CMakeLists.txt | 487 +++++++++---------- UDPExamples/message_aggregator.rc | 1 - UDPExamples/udp_daemon.rc | 1 - Versions.cmake | 6 - debian/CMakeLists.txt | 2 +- debian/{changelog.Debian.in => changelog.in} | 0 debian/copyright.in | 13 +- main.cpp | 2 +- manpages/CMakeLists.txt | 4 + manpages/man1/fcal.1.txt | 42 ++ manpages/man1/fmeasure.1.txt | 43 ++ manpages/man1/fmtave.1.txt | 44 ++ manpages/man1/fst4sim.1.txt | 93 ++++ manpages/man1/jt65code.1.txt | 93 +++- manpages/man1/wsprd.1.txt | 6 +- package_description.txt | 67 +++ qmake_only/scs_version.h | 4 + revision_utils.cpp | 10 +- widgets/about.cpp | 2 +- wsjtx.rc | 1 - wsjtx_config.h.in | 21 +- 28 files changed, 1065 insertions(+), 326 deletions(-) create mode 100644 CMake/Modules/VersionInfo.h.in create mode 100644 CMake/Modules/VersionResource.rc.in create mode 100644 CMake/Modules/generate_version_info.cmake create mode 100644 CMake/Modules/set_build_type.cmake delete mode 100644 CMake/VersionCompute.cmake delete mode 100644 UDPExamples/message_aggregator.rc delete mode 100644 UDPExamples/udp_daemon.rc delete mode 100644 Versions.cmake rename debian/{changelog.Debian.in => changelog.in} (100%) create mode 100644 manpages/man1/fcal.1.txt create mode 100644 manpages/man1/fmeasure.1.txt create mode 100644 manpages/man1/fmtave.1.txt create mode 100644 manpages/man1/fst4sim.1.txt create mode 100644 package_description.txt create mode 100644 qmake_only/scs_version.h delete mode 100644 wsjtx.rc diff --git a/CMake/Modules/VersionInfo.h.in b/CMake/Modules/VersionInfo.h.in new file mode 100644 index 000000000..1fb09c766 --- /dev/null +++ b/CMake/Modules/VersionInfo.h.in @@ -0,0 +1,94 @@ +#pragma once + +#ifndef VERSION_INFO_@PRODUCT_NAME@_H__ +#define VERSION_INFO_@PRODUCT_NAME@_H__ + +#include "scs_version.h" + +#ifndef PRODUCT_VERSION_MAJOR +#define PRODUCT_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@ +#endif + +#ifndef PRODUCT_VERSION_MINOR +#define PRODUCT_VERSION_MINOR @PRODUCT_VERSION_MINOR@ +#endif + +#ifndef PRODUCT_VERSION_PATCH +#define PRODUCT_VERSION_PATCH @PRODUCT_VERSION_PATCH@ +#endif + +#ifndef PRODUCT_VERSION_TWEAK +#define PRODUCT_VERSION_TWEAK @PRODUCT_VERSION_TWEAK@ +#endif + +#ifndef PRODUCT_VERSION_REVISION +#define PRODUCT_VERSION_REVISION @PRODUCT_VERSION_REVISION@ +#endif + +#ifndef FILE_VERSION_MAJOR +#define FILE_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@ +#endif + +#ifndef FILE_VERSION_MINOR +#define FILE_VERSION_MINOR @PRODUCT_VERSION_MINOR@ +#endif + +#ifndef FILE_VERSION_PATCH +#define FILE_VERSION_PATCH @PRODUCT_VERSION_PATCH@ +#endif + +#ifndef FILE_VERSION_TWEAK +#define FILE_VERSION_TWEAK @PRODUCT_VERSION_TWEAK@ +#endif + +#ifndef TO_STRING__ +#define TO_STRING_IMPL__(x) #x +#define TO_STRING__(x) TO_STRING_IMPL__(x) +#endif + +#define PRODUCT_VERSION_MAJOR_MINOR_STR TO_STRING__ (PRODUCT_VERSION_MAJOR) "." TO_STRING__(PRODUCT_VERSION_MINOR) +#define PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR PRODUCT_VERSION_MAJOR_MINOR_STR "." TO_STRING__ (PRODUCT_VERSION_PATCH) +#define PRODUCT_VERSION_FULL_STR PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR TO_STRING__ (PRODUCT_VERSION_REVISION) +#define PRODUCT_VERSION_RESOURCE PRODUCT_VERSION_MAJOR,PRODUCT_VERSION_MINOR,PRODUCT_VERSION_PATCH,PRODUCT_VERSION_TWEAK +#define PRODUCT_VERSION_RESOURCE_STR PRODUCT_VERSION_FULL_STR " " SCS_VERSION_STR "\0" + +#define FILE_VERSION_MAJOR_MINOR_STR TO_STRING__ (FILE_VERSION_MAJOR) "." TO_STRING__ (FILE_VERSION_MINOR) +#define FILE_VERSION_MAJOR_MINOR_PATCH_STR FILE_VERSION_MAJOR_MINOR_STR "." TO_STRING__ (FILE_VERSION_PATCH) +#define FILE_VERSION_FULL_STR FILE_VERSION_MAJOR_MINOR_PATCH_STR TO_STRING__ (PRODUCT_VERSION_REVISION) +#define FILE_VERSION_RESOURCE FILE_VERSION_MAJOR,FILE_VERSION_MINOR,FILE_VERSION_PATCH,FILE_VERSION_TWEAK +#define FILE_VERSION_RESOURCE_STR FILE_VERSION_FULL_STR "\0" + +#ifndef PRODUCT_ICON +#define PRODUCT_ICON "@PRODUCT_ICON@" +#endif + +#ifndef PRODUCT_COMMENTS +#define PRODUCT_COMMENTS "@PRODUCT_COMMENTS@\0" +#endif + +#ifndef PRODUCT_VENDOR_NAME +#define PRODUCT_VENDOR_NAME "@PRODUCT_VENDOR_NAME@\0" +#endif + +#ifndef PRODUCT_LEGAL_COPYRIGHT +#define PRODUCT_LEGAL_COPYRIGHT "@PRODUCT_LEGAL_COPYRIGHT@\0" +#endif + +#ifndef PRODUCT_FILE_DESCRIPTION +#define PRODUCT_FILE_DESCRIPTION "@PRODUCT_FILE_DESCRIPTION@\0" +#endif + +#ifndef PRODUCT_INTERNAL_NAME +#define PRODUCT_INTERNAL_NAME "@PRODUCT_NAME@\0" +#endif + +#ifndef PRODUCT_ORIGINAL_FILENAME +#define PRODUCT_ORIGINAL_FILENAME "@PRODUCT_ORIGINAL_FILENAME@\0" +#endif + +#ifndef PRODUCT_BUNDLE +#define PRODUCT_BUNDLE "@PRODUCT_BUNDLE@\0" +#endif + +#endif + diff --git a/CMake/Modules/VersionResource.rc.in b/CMake/Modules/VersionResource.rc.in new file mode 100644 index 000000000..ded4b0cdc --- /dev/null +++ b/CMake/Modules/VersionResource.rc.in @@ -0,0 +1,73 @@ +#include "VersionInfo_@PRODUCT_NAME@.h" + +#ifdef RC_INVOKED + +#if defined (__MINGW64__) || defined (__MINGW32__) + /* MinGW-w64 or MinGW */ + #if defined (__has_include) && __has_include () + #include + #else + #include + #include + #endif +#else + /* MSVC, Windows SDK */ + #include +#endif + +#ifndef _NDEBUG +#define PRODUCT_DEBUGFLAG 0x0L +#else +#define PRODUCT_DEBUGFLAG VS_FF_DEBUG +#endif + +#ifdef SCS_VERSION_IS_DIRTY +#define PRODUCT_SPECIALFLAG VS_FF_SPECIALBUILD +#else +#define PRODUCT_SPECIALFLAG 0x0L +#endif + +#if PRODUCT_PRERELEASE +#define PRODUCT_PRERELEASEFLAG VS_FF_PRERELEASE +#else +#define PRODUCT_PRERELEASEFLAG 0x0L +#endif + +IDI_ICON1 ICON DISCARDABLE PRODUCT_ICON + +LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL + +VS_VERSION_INFO VERSIONINFO +FILEVERSION FILE_VERSION_RESOURCE +PRODUCTVERSION PRODUCT_VERSION_RESOURCE +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +FILEFLAGS (PRODUCT_DEBUGFLAG | PRODUCT_SPECIALFLAG | PRODUCT_PRERELEASEFLAG) +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", PRODUCT_COMMENTS + VALUE "CompanyName", PRODUCT_VENDOR_NAME + VALUE "FileDescription", PRODUCT_FILE_DESCRIPTION + VALUE "FileVersion", FILE_VERSION_RESOURCE_STR + VALUE "LegalCopyright", PRODUCT_LEGAL_COPYRIGHT + VALUE "ProductName", PRODUCT_BUNDLE + VALUE "ProductVersion", PRODUCT_VERSION_RESOURCE_STR + VALUE "InternalName", PRODUCT_INTERNAL_NAME + VALUE "OriginalFileName", PRODUCT_ORIGINAL_FILENAME +#if SCS_VERSION_IS_DIRTY + VALUE "SpecialBuild", SCS_VERSION_STR "\0" +#endif + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04b /* en-US Unicode */ + END +END + +#endif diff --git a/CMake/Modules/generate_version_info.cmake b/CMake/Modules/generate_version_info.cmake new file mode 100644 index 000000000..885921f5f --- /dev/null +++ b/CMake/Modules/generate_version_info.cmake @@ -0,0 +1,167 @@ +include (CMakeParseArguments) + +set (_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}") + +# generate_product_version() function +# +# This function uses VersionInfo.in template file and VersionResource.rc file +# to generate WIN32 resource with version information and general resource strings. +# +# Usage: +# generate_product_version( +# SomeOutputResourceVariable +# NAME MyVersinedTarget +# ICON ${PATH_TO_ICON} +# VERSION_MAJOR 2 +# VERSION_MINOR 3 +# VERSION_PATCH 1 +# VERSION_REVISION sha1 +# ) +# +# You can use generated resource for your executable targets: +# add_executable(target-name ${target-files} ${SomeOutputResourceVariable}) +# add_library (target-name SHARED ${target-files} ${SomeOutputResourceVariable}) +# +# You can specify resource strings in arguments: +# NAME - name of executable (no defaults, ex: Microsoft Word) +# BUNDLE - bundle (${PROJECT_NAME} or ${NAME} is default, ex: Microsoft Office) +# ICON - path to application icon, default: ${CMAKE_SOURCE_DIR}/icons/windows-icons/${NAME}.ico +# VERSION_MAJOR - default: 1 +# VERSION_MINOR - deafult: 0 +# VERSION_PATCH - deafult: 0 +# VERSION_REVISION - deafult: 0 +# VENDOR_NAME - your vendor name, default: ${PROJECT_VENDOR} +# LEGAL_COPYRIGHT - default: ${PROJECT_COPYRIGHT} +# COMMENTS - default: ${PROJECT_DESCRIPTION} +# ORIGINAL_FILENAME - default: ${NAME} +# INTERNAL_NAME - default: ${NAME} +# FILE_DESCRIPTION - default: ${COMMENTS} +function(generate_version_info outfiles) + set (options) + set (oneValueArgs + NAME + BUNDLE + ICON + VERSION_MAJOR + VERSION_MINOR + VERSION_PATCH + VERSION_REVISION + VENDOR_NAME + LEGAL_COPYRIGHT + COMMENTS + ORIGINAL_FILENAME + INTERNAL_NAME + FILE_DESCRIPTION) + set (multiValueArgs) + cmake_parse_arguments(PRODUCT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT PRODUCT_BUNDLE) + if (PROJECT_NAME) + set (PRODUCT_BUNDLE "${PROJECT_NAME}") + else () + set (PRODUCT_BUNDLE "${PRODUCT_NAME}") + endif () + endif() + + if (NOT PRODUCT_ICON) + set (PRODUCT_ICON "${CMAKE_SOURCE_DIR}/icons/windows-icons/${PRODUCT_NAME}.ico") + endif () + + if (NOT PRODUCT_VERSION_MAJOR) + if (PROJECT_VERSION_MAJOR) + set (PRODUCT_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) + else () + set (PRODUCT_VERSION_MAJOR 1) + endif () + else () + if (NOT ${PRODUCT_VERSION_MAJOR} MATCHES "^[0-9]+$") + message (FATAL_ERROR "Numeric major version number required") + endif () + endif () + + if (NOT PRODUCT_VERSION_MINOR) + if (PROJECT_VERSION_MINOR) + set (PRODUCT_VERSION_MINOR ${PROJECT_VERSION_MINOR}) + else () + set (PRODUCT_VERSION_MINOR 0) + endif () + else () + if (NOT ${PRODUCT_VERSION_MINOR} MATCHES "^[0-9]+$") + message (FATAL_ERROR "Numeric minor version number required") + endif () + endif() + + if (NOT PRODUCT_VERSION_PATCH) + if (PROJECT_VERSION_PATCH) + set (PRODUCT_VERSION_PATCH ${PROJECT_VERSION_PATCH}) + else () + set (PRODUCT_VERSION_PATCH 0) + endif () + else () + if (NOT ${PRODUCT_VERSION_PATCH} MATCHES "^[0-9]+$") + message (FATAL_ERROR "Numeric patch version number required") + endif () + endif() + + if (NOT PRODUCT_VERSION_TWEAK) + if (PROJECT_VERSION_TWEAK) + set (PRODUCT_VERSION_TWEAK ${PROJECT_VERSION_TWEAK}) + else () + set (PRODUCT_VERSION_TWEAK 0) + endif () + else() + if (NOT ${PRODUCT_VERSION_TWEAK} MATCHES "^[0-9]+$") + message (FATAL_ERROR "Numeric tweak version number required") + endif() + endif() + + if (NOT PROJECT_VERSION_REVISION AND BUILD_TYPE_REVISION) + set (PRODUCT_VERSION_REVISION ${BUILD_TYPE_REVISION}) + endif () + + if (NOT PRODUCT_VENDOR_NAME AND PROJECT_VENDOR) + set (PRODUCT_VENDOR_NAME ${PROJECT_VENDOR}) + endif () + + if (NOT PRODUCT_LEGAL_COPYRIGHT) + if (PROJECT_COPYRIGHT) + set (PRODUCT_LEGAL_COPYRIGHT ${PROJECT_COPYRIGHT}) + else () + string(TIMESTAMP PRODUCT_CURRENT_YEAR "%Y") + set(PRODUCT_LEGAL_COPYRIGHT "${PRODUCT_VENDOR_NAME} (C) Copyright ${PRODUCT_CURRENT_YEAR}") + endif () + endif() + + if (NOT PRODUCT_COMMENTS) + if (PROJECT_DESCRIPTION) + set(PRODUCT_COMMENTS ${PROJECT_DESCRIPTION}) + else () + set(PRODUCT_COMMENTS "${PRODUCT_NAME} v${PRODUCT_VERSION_MAJOR}.${PRODUCT_VERSION_MINOR}.${PRODUCT_VERSION_PATCH}") + endif () + endif() + + if (NOT PRODUCT_ORIGINAL_FILENAME) + set(PRODUCT_ORIGINAL_FILENAME "${PRODUCT_NAME}") + endif() + + if (NOT PRODUCT_INTERNAL_NAME) + set(PRODUCT_INTERNAL_NAME "${PRODUCT_NAME}") + endif() + + if (NOT PRODUCT_FILE_DESCRIPTION) + set(PRODUCT_FILE_DESCRIPTION "${PRODUCT_COMMENTS}") + endif() + + set (_VersionInfoFile VersionInfo_${PRODUCT_NAME}.h) + set (_VersionResourceFile VersionResource_${PRODUCT_NAME}.rc) + configure_file( + ${_THIS_MODULE_BASE_DIR}/VersionInfo.h.in + ${_VersionInfoFile} + @ONLY) + configure_file( + ${_THIS_MODULE_BASE_DIR}/VersionResource.rc.in + ${_VersionResourceFile} + @ONLY) + list(APPEND ${outfiles} ${CMAKE_CURRENT_BINARY_DIR}/${_VersionInfoFile} ${CMAKE_CURRENT_BINARY_DIR}/${_VersionResourceFile}) + set (${outfiles} ${${outfiles}} PARENT_SCOPE) +endfunction() diff --git a/CMake/Modules/set_build_type.cmake b/CMake/Modules/set_build_type.cmake new file mode 100644 index 000000000..1f1f12731 --- /dev/null +++ b/CMake/Modules/set_build_type.cmake @@ -0,0 +1,42 @@ +include (CMakeParseArguments) + +# set_build_type() function +# +# Configure the output artefacts and their names for development, +# Release Candidate (RC), or General Availability (GA) build type. +# +# Usage: +# set_build_type () +# set_build_type (RC n) +# set_build_type (GA) +# +# With no arguments or with RC 0 a development is specified. The +# variable BUILD_TYPE_REVISION is set to "-devel". +# +# With RC n with n>0 specifies a Release Candidate build. The +# variable BUIlD_TYPE_REVISION is set to "-rcn". +# +# With GA a General Availability release is specified and the +# variable BUIlD_TYPE_REVISION is unset. +# +macro (set_build_type) + set (options GA) + set (oneValueArgs RC) + set (multiValueArgs) + cmake_parse_arguments (BUILD_TYPE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (BUILD_TYPE_UNPARSED_ARGUMENTS) + message (FATAL_ERROR "Unrecognized macro arguments: \"${BUILD_TYPE_UNPARSED_ARGUMENTS}\"") + endif () + if (BUILD_TYPE_GA AND BUILD_TYPE_RC) + message (FATAL_ERROR "Only specify one build type from RC or GA.") + endif () + if (NOT BUILD_TYPE_GA) + if (BUILD_TYPE_RC) + set (BUILD_TYPE_REVISION "-rc${BUILD_TYPE_RC}") + else () + set (BUILD_TYPE_REVISION "-devel") + endif () + endif () + message (STATUS "Building ${PROJECT_NAME} v${PROJECT_VERSION}${BUILD_TYPE_REVISION}") +endmacro () diff --git a/CMake/VersionCompute.cmake b/CMake/VersionCompute.cmake deleted file mode 100644 index b69bbfc88..000000000 --- a/CMake/VersionCompute.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# Load version number components. -include (${CMAKE_SOURCE_DIR}/Versions.cmake) - -# Compute the full version string. -if (WSJTX_RC AND NOT WSJTX_VERSION_IS_RELEASE) - set (WSJTX_VERSION_PATCH ${WSJTX_VERSION_PATCH}-rc${WSJTX_RC}) -elseif (NOT WSJTX_VERSION_IS_RELEASE) - set (WSJTX_VERSION_PATCH ${WSJTX_VERSION_PATCH}-devel) -endif (WSJTX_RC AND NOT WSJTX_VERSION_IS_RELEASE) - -set (wsjtx_VERSION ${WSJTX_VERSION_MAJOR}.${WSJTX_VERSION_MINOR}.${WSJTX_VERSION_PATCH}) diff --git a/CMake/getsvn.cmake b/CMake/getsvn.cmake index af149a496..92b5b4156 100644 --- a/CMake/getsvn.cmake +++ b/CMake/getsvn.cmake @@ -1,4 +1,6 @@ message (STATUS "Checking for revision information") +set (__scs_header_file ${BINARY_DIR}/scs_version.h.txt) +file (WRITE ${__scs_header_file} "/* SCS version information */\n\n") if (EXISTS "${SOURCE_DIR}/.svn") message (STATUS "Checking for Subversion revision information") find_package (Subversion QUIET REQUIRED) @@ -14,16 +16,18 @@ if (EXISTS "${SOURCE_DIR}/.svn") file (STRINGS "${BINARY_DIR}/svn_status.txt" __svn_changes REGEX "^[^?].*$" ) + set (SCS_VERSION "r${MY_WC_LAST_CHANGED_REV}") if (__svn_changes) - message (STATUS "Source tree based on revision ${MY_WC_LAST_CHANGED_REV} appears to have local changes") - set (MY_WC_LAST_CHANGED_REV "${MY_WC_LAST_CHANGED_REV}-dirty") + message (STATUS "Source tree based on revision ${SCS_VERSION} appears to have local changes") + file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") + set (SCS_VERSION_STR "${SCS_VERSION}-dirty") foreach (__svn_change ${__svn_changes}) message (STATUS "${__svn_change}") endforeach (__svn_change ${__svn_changes}) - endif (__svn_changes) - message (STATUS "${SOURCE_DIR} contains a .svn and is revision ${MY_WC_LAST_CHANGED_REV}") - # write a file with the SCS_VERSION define - file (WRITE "${BINARY_DIR}/scs_version.h.txt" "#define SCS_VERSION r${MY_WC_LAST_CHANGED_REV}\n") + else () + set (SCS_VERSION_STR "${SCS_VERSION}") + endif () + message (STATUS "${SOURCE_DIR} contains a .svn and is revision ${SCS_VERSION}") elseif (EXISTS "${SOURCE_DIR}/.git") if (EXISTS "${SOURCE_DIR}/.git/svn/.metadata") # try git-svn message (STATUS "Checking for Subversion revision information using git-svn") @@ -31,6 +35,7 @@ elseif (EXISTS "${SOURCE_DIR}/.git") # extract working copy information for SOURCE_DIR into MY_XXX variables GitSubversion_WC_INFO (${SOURCE_DIR} MY) message ("${MY_WC_INFO}") + set (SCS_VERSION "r${MY_WC_LAST_CHANGED_REV}") # try and determine if the working copy has outstanding changes execute_process (COMMAND ${GIT_EXECUTABLE} --git-dir=${SOURCE_DIR}/.git --work-tree=${SOURCE_DIR} svn dcommit --dry-run RESULT_VARIABLE __git_svn_status @@ -42,10 +47,11 @@ elseif (EXISTS "${SOURCE_DIR}/.git") ) if ((NOT ${__git_svn_status} EQUAL 0) OR __svn_changes) message (STATUS "Source tree based on revision ${MY_WC_LAST_CHANGED_REV} appears to have local changes") - set (MY_WC_LAST_CHANGED_REV "${MY_WC_LAST_CHANGED_REV}-dirty") + file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") + set (SCS_VERSION_STR "${SCS_VERSION}-dirty") + else () + set (SCS_VERSION_STR "${SCS_VERSION}") endif () - # write a file with the SVNVERSION define - file (WRITE "${BINARY_DIR}/scs_version.h.txt" "#define SCS_VERSION r${MY_WC_LAST_CHANGED_REV}\n") else () # # try git @@ -53,23 +59,27 @@ elseif (EXISTS "${SOURCE_DIR}/.git") message (STATUS "Checking for gitrevision information") include (${SOURCE_DIR}/CMake/Modules/GetGitRevisionDescription.cmake) get_git_head_revision (${SOURCE_DIR} GIT_REFSPEC GIT_SHA1) - git_local_changes (${SOURCE_DIR} GIT_DIRTY) - string (SUBSTRING "${GIT_SHA1}" 0 6 GIT_SHA1) - if ("${GIT_DIRTY}" STREQUAL "DIRTY") - message (STATUS "Source tree based on revision ${GIT_REFSPEC} ${GIT_SHA1} appears to have local changes") - set (GIT_SHA1 "${GIT_SHA1}-dirty") + git_local_changes (${SOURCE_DIR} GIT_SANITARY) + string (SUBSTRING "${GIT_SHA1}" 0 6 SCS_VERSION) + if ("${GIT_SANITARY}" STREQUAL "DIRTY") + message (STATUS "Source tree based on revision ${GIT_REFSPEC} ${SCS_VERSION} appears to have local changes") + file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") + set (SCS_VERSION_STR "${SCS_VERSION}-dirty") execute_process (COMMAND ${GIT_EXECUTABLE} --git-dir=${SOURCE_DIR}/.git --work-tree=${SOURCE_DIR} status ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + else () + set (SCS_VERSION_STR "${SCS_VERSION}") endif () - message (STATUS "refspec: ${GIT_REFSPEC} - SHA1: ${GIT_SHA1}") - file (WRITE "${BINARY_DIR}/scs_version.h.txt" "#define SCS_VERSION ${GIT_SHA1}\n") + message (STATUS "refspec: ${GIT_REFSPEC} - SHA1: ${SCS_VERSION}") endif () else() message (STATUS "No SCS found") - file (WRITE "${BINARY_DIR}/scs_version.h.txt" "#define SCS_VERSION\n") endif () +file (APPEND ${__scs_header_file} "#define SCS_VERSION ${SCS_VERSION}\n") +file (APPEND ${__scs_header_file} "#define SCS_VERSION_STR \"${SCS_VERSION_STR}\"\n") # copy the file to the final header only if the version changes # reduces needless rebuilds -execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different "${BINARY_DIR}/scs_version.h.txt" "${OUTPUT_DIR}/scs_version.h") +execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${__scs_header_file} "${OUTPUT_DIR}/scs_version.h") +file (REMOVE ${__scs_header_file}) diff --git a/CMakeCPackOptions.cmake.in b/CMakeCPackOptions.cmake.in index 6980c6141..eceae4edf 100644 --- a/CMakeCPackOptions.cmake.in +++ b/CMakeCPackOptions.cmake.in @@ -4,7 +4,6 @@ set (CPACK_PACKAGE_VENDOR "@PROJECT_VENDOR@") set (CPACK_PACKAGE_CONTACT "@PROJECT_CONTACT@") -set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "@PROJECT_SUMMARY_DESCRIPTION@") set (CPACK_RESOURCE_FILE_LICENSE "@PROJECT_SOURCE_DIR@/COPYING") set (CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME}) set (CPACK_PACKAGE_EXECUTABLES wsjtx "@PROJECT_NAME@") @@ -43,6 +42,19 @@ if (CPACK_GENERATOR MATCHES "NSIS") set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}") set (CPACK_NSIS_MUI_FINISHPAGE_RUN "wsjtx.exe") set (CPACK_NSIS_MODIFY_PATH ON) + + # Setup the installer and uninstall VersionInfo resource + set (CPACK_NSIS_EXTRA_DEFINES + "VIProductVersion @PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@PROJECT_VERSION_TWEAK@ +VIFileVersion @PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@PROJECT_VERSION_TWEAK@ +VIAddVersionKey /LANG=0 \"ProductName\" \"@PROJECT_NAME@\" +VIAddVersionKey /LANG=0 \"ProductVersion\" \"v@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@@BUILD_TYPE_REVISION@\" +VIAddVersionKey /LANG=0 \"Comments\" \"@PROJECT_DESCRIPTION@\" +VIAddVersionKey /LANG=0 \"CompanyName\" \"@PROJECT_VENDOR@\" +VIAddVersionKey /LANG=0 \"LegalCopyright\" \"@PROJECT_COPYRIGHT@\" +VIAddVersionKey /LANG=0 \"FileDescription\" \"@PROJECT_NAME@ Installer\" +VIAddVersionKey /LANG=0 \"FileVersion\" \"v@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@@BUILD_TYPE_REVISION@\"" + ) endif () if ("${CPACK_GENERATOR}" STREQUAL "PackageMaker") @@ -52,7 +64,7 @@ if ("${CPACK_GENERATOR}" STREQUAL "PackageMaker") endif () if ("${CPACK_GENERATOR}" STREQUAL "DragNDrop") - set (CPACK_DMG_VOLUME_NAME "@PROJECT_NAME@") + set (CPACK_DMG_VOLUME_NAME "@PROJECT_BUNDLE_NAME@") set (CPACK_DMG_BACKGROUND_IMAGE "@PROJECT_SOURCE_DIR@/icons/Darwin/DragNDrop Background.png") set (CPACK_DMG_DS_STORE "@PROJECT_SOURCE_DIR@/Darwin/wsjtx_DMG.DS_Store") set (CPACK_BUNDLE_NAME "@WSJTX_BUNDLE_NAME@") diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a0d48716..71589a073 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 2.8.10 FATAL_ERROR) +cmake_minimum_required (VERSION 3.9 FATAL_ERROR) if (APPLE) # @@ -13,12 +13,7 @@ if (APPLE) set (CMAKE_OSX_DEPLOYMENT_TARGET 10.12 CACHE STRING "Earliest version of macOS supported -Earliest version we can support with Qt 5.12, C++11 & libc++ is 10.13. -Do not override this if you intend to build an official deployable installer.") - set (CMAKE_OSX_SYSROOT /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk - CACHE STRING "Mac OS X SDK to build with - -Change this to the newest SDK available that you can install on your system (>10.14 preferred). +Earliest version we can support with Qt 5.12, C++11 & libc++ is 10.12. Do not override this if you intend to build an official deployable installer.") endif (APPLE) @@ -34,7 +29,7 @@ if (POLICY CMP0043) endif () if (POLICY CMP0048) - cmake_policy (SET CMP0048 NEW) # clear PROJECT_VERSION_* variables if not defined in project() command + cmake_policy (SET CMP0048 NEW) # clear PROJECT_Version_* variables if not set in project() command endif () if (POLICY CMP0063) @@ -49,90 +44,47 @@ if (POLICY CMP0075) cmake_policy (SET CMP0075 NEW) # honour CMAKE_REQUIRED_LIBRARIES in config checks endif () +project (wsjtx + VERSION 2.3.0.0 + DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio" + LANGUAGES C CXX Fortran + ) + +# +# Local CMake modules and support files +# +set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) + +set (PROJECT_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") +if (NOT PROJECT_ARCHITECTURE) + # This is supposed to happen already on Windows + if (CMAKE_SIZEOF_VOID_P MATCHES 8) + set (PROJECT_ARCHITECTURE "x64") + else () + set (PROJECT_ARCHITECTURE "$ENV{PROCESSOR_ARCHITECTURE}") + endif () +endif () +message (STATUS "******************************************************") +message (STATUS "Building for for: ${CMAKE_SYSTEM_NAME}-${PROJECT_ARCHITECTURE}") +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 2) +set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") + # # project information # -project (wsjtx C CXX Fortran) - -include (${PROJECT_SOURCE_DIR}/CMake/VersionCompute.cmake) -message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}") - -set (PROJECT_NAME "WSJT-X") +set (PROJECT_BUNDLE_NAME "WSJT-X") set (PROJECT_VENDOR "Joe Taylor, K1JT") set (PROJECT_CONTACT "Joe Taylor ") -set (PROJECT_COPYRIGHT "Copyright (C) 2001-2019 by Joe Taylor, K1JT") -set (PROJECT_HOMEPAGE http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html) +set (PROJECT_COPYRIGHT "Copyright (C) 2001-2020 by Joe Taylor, K1JT") +set (PROJECT_HOMEPAGE https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html) set (PROJECT_MANUAL wsjtx-main) -set (PROJECT_MANUAL_DIRECTORY_URL http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/) +set (PROJECT_MANUAL_DIRECTORY_URL https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/) set (PROJECT_SAMPLES_URL http://downloads.sourceforge.net/project/wsjt/) set (PROJECT_SAMPLES_UPLOAD_DEST frs.sourceforge.net:/home/frs/project/wsjt/) -set (PROJECT_SUMMARY_DESCRIPTION "${PROJECT_NAME} - Digital Modes for Weak Signal Communications in Amateur Radio.") -set (PROJECT_DESCRIPTION "${PROJECT_SUMMARY_DESCRIPTION} - ${PROJECT_NAME} is a computer program designed to facilitate basic amateur - radio communication using very weak signals. The first four letters in - the program name stand for `(W)eak (S)ignal communication by - K1(JT),` while the suffix `-X` indicates that ${PROJECT_NAME} started as - an extended and experimental branch of the program - WSJT. - . - ${PROJECT_NAME} Version 1.8 offers nine different protocols or modes: FT8, - JT4, JT9, JT65, QRA64, ISCAT, MSK144, WSPR, and Echo. - The first five are designed for making reliable QSOs under extreme - weak-signal conditions. They use nearly identical message structure - and source encoding. JT65 and QRA64 were designed for EME - (`moonbounce`) on the VHF/UHF bands and have also proven very - effective for worldwide QRP communication on the HF bands. QRA64 has - a number of advantages over JT65, including better performance on the - very weakest signals. We imagine that over time it may replace JT65 - for EME use. JT9 was originally designed for the LF, MF, and lower HF - bands. Its submode JT9A is 2 dB more sensitive than JT65 while using - less than 10% of the bandwidth. JT4 offers a wide variety of tone - spacings and has proven highly effective for EME on microwave bands up - to 24 GHz. These four `slow` modes use one-minute timed sequences - of alternating transmission and reception, so a minimal QSO takes four - to six minutes — two or three transmissions by each station, one - sending in odd UTC minutes and the other even. FT8 is operationally - similar but four times faster (15-second T/R sequences) and less - sensitive by a few dB. On the HF bands, world-wide QSOs are possible - with any of these modes using power levels of a few watts (or even - milliwatts) and compromise antennas. On VHF bands and higher, QSOs - are possible (by EME and other propagation types) at signal levels 10 - to 15 dB below those required for CW. - . - ISCAT, MSK144, and optionally submodes JT9E-H are `fast` - protocols designed to take advantage of brief signal enhancements from - ionized meteor trails, aircraft scatter, and other types of scatter - propagation. These modes use timed sequences of 5, 10, 15, or 30 s - duration. User messages are transmitted repeatedly at high rate (up - to 250 characters per second, for MSK144) to make good use of the - shortest meteor-trail reflections or `pings`. ISCAT uses free-form - messages up to 28 characters long, while MSK144 uses the same - structured messages as the slow modes and optionally an abbreviated - format with hashed callsigns. - . - WSPR (pronounced `whisper`) stands for (W)eak (S)ignal - (P)ropagation (R)eporter. The WSPR protocol was designed for probing - potential propagation paths using low-power transmissions. WSPR - messages normally carry the transmitting station’s callsign, grid - locator, and transmitter power in dBm, and they can be decoded at - signal-to-noise ratios as low as -28 dB in a 2500 Hz bandwidth. WSPR - users with internet access can automatically upload reception - reports to a central database called wsprnet that provides a mapping - facility, archival storage, and many other features. - . - Echo mode allows you to detect and measure your own station's echoes - from the moon, even if they are far below the audible threshold. - . - ${PROJECT_NAME} provides spectral displays for receiver passbands as wide as - 5 kHz, flexible rig control for nearly all modern radios used by - amateurs, and a wide variety of special aids such as automatic Doppler - tracking for EME QSOs and Echo testing. The program runs equally well - on Windows, Macintosh, and Linux systems, and installation packages - are available for all three platforms. - . - Be sure to read the online ${PROJECT_NAME} User's Guide.") - -set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH}) # make sure that the default configuration is a RELEASE if (NOT CMAKE_BUILD_TYPE) @@ -190,19 +142,6 @@ If you just want to see the debug output from the application then the easiest w attach a debugger which will then receive the console output inside its console." ON "WIN32" OFF) -set (PROJECT_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") -if (NOT PROJECT_ARCHITECTURE) - # This is supposed to happen already on Windows - if (CMAKE_SIZEOF_VOID_P MATCHES 8) - set (PROJECT_ARCHITECTURE "x64") - else () - set (PROJECT_ARCHITECTURE "$ENV{PROCESSOR_ARCHITECTURE}") - endif () -endif (NOT PROJECT_ARCHITECTURE) -message (STATUS "******************************************************") -message (STATUS "Building for for: ${CMAKE_SYSTEM_NAME}-${PROJECT_ARCHITECTURE}") -message (STATUS "******************************************************") - # # install locations # @@ -814,6 +753,8 @@ if (APPLE) DEPENDS ${ICONSRCS} COMMENT "Building Icons" ) +else () + set (WSJTX_ICON_FILE icons/windows-icons/wsjtx.ico) endif (APPLE) set_source_files_properties (${WSJTX_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) @@ -877,11 +818,30 @@ endif (APPLE) # find some useful tools # include (CheckTypeSize) +include (CheckCSourceCompiles) include (CheckSymbolExists) +include (generate_version_info) find_program(CTAGS ctags) find_program(ETAGS etags) +# +# Standard C Math Library +# +set (LIBM_TEST_SOURCE "#include\nfloat f; int main(){sqrt(f);return 0;}") +check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_MATH) +if (HAVE_MATH) + set (LIBM_LIBRARIES) +else () + set (CMAKE_REQUIRED_LIBRARIES m) + check_c_source_compiles ("${LIBM_TEST_SOURCE}" HAVE_LIBM_MATH) + unset (CMAKE_REQUIRED_LIBRARIES) + if (NOT HAVE_LIBM_MATH) + message (FATAL_ERROR "Unable to use C math library functions") + endif () + set (LIBM_LIBRARIES m) +endif () + # # Boost # @@ -1103,6 +1063,139 @@ query_qmake (QT_INSTALL_IMPORTS QT_IMPORTS_DIR) query_qmake (QT_HOST_DATA QT_DATA_DIR) set (QT_MKSPECS_DIR ${QT_DATA_DIR}/mkspecs) +# project definitions +add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1) +if (CMAKE_HOST_UNIX) + add_definitions (-DUNIX) +elseif (CMAKE_HOST_WIN32) + add_definitions (-DWIN32) +endif () + +# build a library of package functionality (without and optionally with OpenMP support) +add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) +target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES}) + +# build an OpenMP variant of the Fortran library routines +add_library (wsjt_fort STATIC ${wsjt_FSRCS}) +target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES}) +if (${OPENMP_FOUND} OR APPLE) + add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS}) + target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES}) + if (OpenMP_C_FLAGS) + set_target_properties (wsjt_fort_omp + PROPERTIES + COMPILE_FLAGS "${OpenMP_C_FLAGS}" + ) + endif () + set_target_properties (wsjt_fort_omp + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp + ) + file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp) + if (APPLE) + # On Mac we don't have working OpenMP support in the C/C++ + # compilers so we have to manually set the correct flags to get + # OpenMP support in jt9. + target_compile_options (wsjt_fort_omp + PRIVATE + $<$:-fopenmp> # assumes GNU style Fortran compiler + ) + endif (APPLE) +endif (${OPENMP_FOUND} OR APPLE) + +if(WSJT_BUILD_UTILS) + +add_executable (jt4sim lib/jt4sim.f90) +target_link_libraries (jt4sim wsjt_fort wsjt_cxx) + +add_executable (jt65sim lib/jt65sim.f90) +target_link_libraries (jt65sim wsjt_fort wsjt_cxx) + +add_executable (sumsim lib/sumsim.f90) +target_link_libraries (sumsim wsjt_fort wsjt_cxx) + +add_executable (qra64sim lib/qra/qra64/qra64sim.f90) +target_link_libraries (qra64sim wsjt_fort wsjt_cxx) + +add_executable (jt49sim lib/jt49sim.f90) +target_link_libraries (jt49sim wsjt_fort wsjt_cxx) + +add_executable (allsim lib/allsim.f90) +target_link_libraries (allsim wsjt_fort wsjt_cxx) + +add_executable (rtty_spec lib/rtty_spec.f90) +target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) + +add_executable (jt65code lib/jt65code.f90) +target_link_libraries (jt65code wsjt_fort wsjt_cxx) + +add_executable (qra64code lib/qra64code.f90) +target_link_libraries (qra64code wsjt_fort wsjt_cxx) + +add_executable (jt9code lib/jt9code.f90) +target_link_libraries (jt9code wsjt_fort wsjt_cxx) + +add_executable (wsprcode lib/wsprcode/wsprcode.f90 lib/wsprcode/nhash.c) +target_link_libraries (wsprcode wsjt_fort wsjt_cxx) + +add_executable (encode77 lib/77bit/encode77.f90) +target_link_libraries (encode77 wsjt_fort wsjt_cxx) + +add_executable (wsprsim ${wsprsim_CSRCS}) +target_link_libraries (wsprsim ${LIBM_LIBRARIES}) + +add_executable (jt4code lib/jt4code.f90) +target_link_libraries (jt4code wsjt_fort wsjt_cxx) + +add_executable (msk144code lib/msk144code.f90) +target_link_libraries (msk144code wsjt_fort wsjt_cxx) + +add_executable (ft8code lib/ft8/ft8code.f90) +target_link_libraries (ft8code wsjt_fort wsjt_cxx) + +add_executable (ft4code lib/ft4/ft4code.f90) +target_link_libraries (ft4code wsjt_fort wsjt_cxx) + +add_executable (ft8sim lib/ft8/ft8sim.f90) +target_link_libraries (ft8sim wsjt_fort wsjt_cxx) + +add_executable (msk144sim lib/msk144sim.f90) +target_link_libraries (msk144sim wsjt_fort wsjt_cxx) + +add_executable (ft4sim lib/ft4/ft4sim.f90) +target_link_libraries (ft4sim wsjt_fort wsjt_cxx) + +add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90) +target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) + +add_executable (fst4sim lib/fst4/fst4sim.f90) +target_link_libraries (fst4sim wsjt_fort wsjt_cxx) + +add_executable (ldpcsim240_101 lib/fst4/ldpcsim240_101.f90) +target_link_libraries (ldpcsim240_101 wsjt_fort wsjt_cxx) + +add_executable (ldpcsim240_74 lib/fst4/ldpcsim240_74.f90) +target_link_libraries (ldpcsim240_74 wsjt_fort wsjt_cxx) + +endif(WSJT_BUILD_UTILS) + +add_executable (fmtave lib/fmtave.f90) + +add_executable (fcal lib/fcal.f90) + +add_executable (fmeasure lib/fmeasure.f90) + +# build the wsprd WSPR mode decoder driver +generate_version_info (wsprd_VERSION_RESOURCES + NAME wsprd + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "WSPR mode decoder" + ) +add_executable (wsprd ${wsprd_CSRCS} lib/indexx.f90 lib/wsprd/osdwspr.f90 ${wsprd_VERSION_RESOURCES}) +target_include_directories (wsprd PRIVATE ${FFTW3_INCLUDE_DIRS}) +target_link_libraries (wsprd ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) + # Tell CMake to run moc when necessary set (CMAKE_AUTOMOC ON) include_directories (${CMAKE_CURRENT_BINARY_DIR}) @@ -1116,14 +1209,6 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR}) # look for includes there: set (CMAKE_INCLUDE_CURRENT_DIR ON) -# project definitions -add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1) -if (CMAKE_HOST_UNIX) - add_definitions (-DUNIX) -elseif (CMAKE_HOST_WIN32) - add_definitions (-DWIN32) -endif () - # # source navigation # @@ -1207,7 +1292,6 @@ add_resources (wsjtx_RESOURCES /Translations ${QM_FILES}) configure_file (wsjtx.qrc.in wsjtx.qrc @ONLY) - # UI generation qt5_wrap_ui (wsjt_qt_GENUISRCS ${wsjt_qt_UISRCS}) qt5_wrap_ui (wsjtx_GENUISRCS ${wsjtx_UISRCS}) @@ -1225,39 +1309,11 @@ if (WIN32) endif (WIN32) # -# targets +# targets dependent on Qt # -# build a library of package functionality (without and optionally with OpenMP support) -add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS}) - -# build an OpenMP variant of the Fortran library routines -add_library (wsjt_fort STATIC ${wsjt_FSRCS}) -target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES}) -if (${OPENMP_FOUND} OR APPLE) - add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS}) - target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES}) - if (OpenMP_C_FLAGS) - set_target_properties (wsjt_fort_omp - PROPERTIES - COMPILE_FLAGS "${OpenMP_C_FLAGS}" - ) - endif () - set_target_properties (wsjt_fort_omp - PROPERTIES - Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp - ) - file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp) - if (APPLE) - # On Mac we don't have working OpenMP support in the C/C++ - # compilers so we have to manually set the correct flags to get - # OpenMP support in jt9. - target_compile_options (wsjt_fort_omp - PRIVATE - $<$:-fopenmp> # assumes GNU style Fortran compiler - ) - endif (APPLE) -endif (${OPENMP_FOUND} OR APPLE) +add_executable (record_time_signal Audio/tools/record_time_signal.cpp) +target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) # build a library for the QCustomPlot widget add_library (qcp STATIC ${qcp_CXXSRCS}) @@ -1282,18 +1338,15 @@ target_link_libraries (fort_qt Qt5::Core) add_library (wsjt_qtmm STATIC ${wsjt_qtmm_CXXSRCS} ${wsjt_qtmm_GENUISRCS}) target_link_libraries (wsjt_qtmm Qt5::Multimedia) -# Always build these: -add_executable (wsprd ${wsprd_CSRCS} lib/indexx.f90 lib/wsprd/osdwspr.f90) -target_include_directories (wsprd PRIVATE ${FFTW3_INCLUDE_DIRS}) -target_link_libraries (wsprd ${FFTW3_LIBRARIES}) +# build the jt9 slow mode decoder driver +generate_version_info (jt9_VERSION_RESOURCES + NAME jt9 + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Slow mode decoder" + ) -add_executable (fmtave lib/fmtave.f90 wsjtx.rc) - -add_executable (fcal lib/fcal.f90 wsjtx.rc) - -add_executable (fmeasure lib/fmeasure.f90 wsjtx.rc) - -add_executable (jt9 ${jt9_FSRCS} wsjtx.rc) +add_executable (jt9 ${jt9_FSRCS} ${jt9_VERSION_RESOURCES}) if (${OPENMP_FOUND} OR APPLE) if (APPLE) # On Mac we don't have working OpenMP support in the C/C++ @@ -1331,91 +1384,19 @@ else (${OPENMP_FOUND} OR APPLE) target_link_libraries (jt9 wsjt_fort wsjt_cxx fort_qt) endif (${OPENMP_FOUND} OR APPLE) -if(WSJT_BUILD_UTILS) -add_executable (jt4sim lib/jt4sim.f90 wsjtx.rc) -target_link_libraries (jt4sim wsjt_fort wsjt_cxx) - -add_executable (jt65sim lib/jt65sim.f90 wsjtx.rc) -target_link_libraries (jt65sim wsjt_fort wsjt_cxx) - -add_executable (sumsim lib/sumsim.f90 wsjtx.rc) -target_link_libraries (sumsim wsjt_fort wsjt_cxx) - -add_executable (qra64sim lib/qra/qra64/qra64sim.f90 wsjtx.rc) -target_link_libraries (qra64sim wsjt_fort wsjt_cxx) - -add_executable (jt49sim lib/jt49sim.f90 wsjtx.rc) -target_link_libraries (jt49sim wsjt_fort wsjt_cxx) - -add_executable (allsim lib/allsim.f90 wsjtx.rc) -target_link_libraries (allsim wsjt_fort wsjt_cxx) - -add_executable (rtty_spec lib/rtty_spec.f90 wsjtx.rc) -target_link_libraries (rtty_spec wsjt_fort wsjt_cxx) - -add_executable (jt65code lib/jt65code.f90 wsjtx.rc) -target_link_libraries (jt65code wsjt_fort wsjt_cxx) - -add_executable (qra64code lib/qra64code.f90 wsjtx.rc) -target_link_libraries (qra64code wsjt_fort wsjt_cxx) - -add_executable (jt9code lib/jt9code.f90 wsjtx.rc) -target_link_libraries (jt9code wsjt_fort wsjt_cxx) - -add_executable (wsprcode lib/wsprcode/wsprcode.f90 lib/wsprcode/nhash.c - wsjtx.rc) -target_link_libraries (wsprcode wsjt_fort wsjt_cxx) - -add_executable (encode77 lib/77bit/encode77.f90 wsjtx.rc) -target_link_libraries (encode77 wsjt_fort wsjt_cxx) - -add_executable (wsprsim ${wsprsim_CSRCS}) - -add_executable (jt4code lib/jt4code.f90 wsjtx.rc) -target_link_libraries (jt4code wsjt_fort wsjt_cxx) - -add_executable (msk144code lib/msk144code.f90 wsjtx.rc) -target_link_libraries (msk144code wsjt_fort wsjt_cxx) - -add_executable (ft8code lib/ft8/ft8code.f90 wsjtx.rc) -target_link_libraries (ft8code wsjt_fort wsjt_cxx) - -add_executable (ft4code lib/ft4/ft4code.f90 wsjtx.rc) -target_link_libraries (ft4code wsjt_fort wsjt_cxx) - -add_executable (ft8sim lib/ft8/ft8sim.f90 wsjtx.rc) -target_link_libraries (ft8sim wsjt_fort wsjt_cxx) - -add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc) -target_link_libraries (msk144sim wsjt_fort wsjt_cxx) - -add_executable (ft4sim lib/ft4/ft4sim.f90 wsjtx.rc) -target_link_libraries (ft4sim wsjt_fort wsjt_cxx) - -add_executable (ft4sim_mult lib/ft4/ft4sim_mult.f90 wsjtx.rc) -target_link_libraries (ft4sim_mult wsjt_fort wsjt_cxx) - -add_executable (record_time_signal Audio/tools/record_time_signal.cpp) -target_link_libraries (record_time_signal wsjt_cxx wsjt_qtmm wsjt_qt) - -add_executable (fst4sim lib/fst4/fst4sim.f90 wsjtx.rc) -target_link_libraries (fst4sim wsjt_fort wsjt_cxx) - -add_executable (ldpcsim240_101 lib/fst4/ldpcsim240_101.f90 wsjtx.rc) -target_link_libraries (ldpcsim240_101 wsjt_fort wsjt_cxx) - -add_executable (ldpcsim240_74 lib/fst4/ldpcsim240_74.f90 wsjtx.rc) -target_link_libraries (ldpcsim240_74 wsjt_fort wsjt_cxx) - -endif(WSJT_BUILD_UTILS) - # build the main application +generate_version_info (wsjtx_VERSION_RESOURCES + NAME wsjtx + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + ) + add_executable (wsjtx MACOSX_BUNDLE ${wsjtx_CXXSRCS} ${wsjtx_GENUISRCS} - wsjtx.rc ${WSJTX_ICON_FILE} ${wsjtx_RESOURCES_RCC} + ${wsjtx_VERSION_RESOURCES} ) if (WSJT_CREATE_WINMAIN) @@ -1424,12 +1405,12 @@ endif (WSJT_CREATE_WINMAIN) set_target_properties (wsjtx PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Darwin/Info.plist.in" - MACOSX_BUNDLE_INFO_STRING "${WSJTX_DESCRIPTION_SUMMARY}" + MACOSX_BUNDLE_INFO_STRING "${PROJECT_DESCRIPTION}" MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}" - MACOSX_BUNDLE_BUNDLE_VERSION ${wsjtx_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING "v${wsjtx_VERSION}" - MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${wsjtx_VERSION}" - MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}" + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} + MACOSX_BUNDLE_SHORT_VERSION_STRING "v${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" + MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${SCS_VERSION_STR}" + MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_BUNDLE_NAME}" MACOSX_BUNDLE_BUNDLE_EXECUTABLE_NAME "${PROJECT_NAME}" MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx" @@ -1437,9 +1418,9 @@ set_target_properties (wsjtx PROPERTIES target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) if (APPLE) - target_link_libraries (wsjtx Qt5::SerialPort wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) + target_link_libraries (wsjtx wsjt_fort) else () - target_link_libraries (wsjtx Qt5::SerialPort wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) + target_link_libraries (wsjtx wsjt_fort_omp) if (OpenMP_C_FLAGS) set_target_properties (wsjtx PROPERTIES COMPILE_FLAGS "${OpenMP_C_FLAGS}" @@ -1455,6 +1436,7 @@ else () ) endif () endif () +target_link_libraries (wsjtx Qt5::SerialPort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES} ${LIBM_LIBRARIES}) # make a library for WSJT-X UDP servers # add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) @@ -1477,9 +1459,21 @@ target_compile_definitions (wsjtx_udp-static PUBLIC UDP_STATIC_DEFINE) target_link_libraries (wsjtx_udp-static Qt5::Network Qt5::Gui) generate_export_header (wsjtx_udp-static BASE_NAME udp) -add_executable (udp_daemon UDPExamples/UDPDaemon.cpp UDPExamples/udp_daemon.rc ${WSJTX_ICON_FILE}) +generate_version_info (udp_daemon_VERSION_RESOURCES + NAME udp_daemon + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol daemon" + ) +add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES}) target_link_libraries (udp_daemon wsjtx_udp-static) +generate_version_info (message_aggregator_VERSION_RESOURCES + NAME message_aggregator + BUNDLE ${PROJECT_BUNDLE_NAME} + ICON ${WSJTX_ICON_FILE} + FILE_DESCRIPTION "Example WSJT-X UDP Message Protocol application" + ) add_resources (message_aggregator_RESOURCES /qss ${message_aggregator_STYLESHEETS}) configure_file (UDPExamples/message_aggregator.qrc.in message_aggregator.qrc @ONLY) qt5_add_resources (message_aggregator_RESOURCES_RCC @@ -1488,9 +1482,8 @@ qt5_add_resources (message_aggregator_RESOURCES_RCC ) add_executable (message_aggregator ${message_aggregator_CXXSRCS} - ${WSJTX_ICON_FILE} - UDPExamples/message_aggregator.rc ${message_aggregator_RESOURCES_RCC} + ${message_aggregator_VERSION_RESOURCES} ) target_link_libraries (message_aggregator Qt5::Widgets wsjtx_udp-static) @@ -1579,7 +1572,6 @@ install (FILES AUTHORS THANKS NEWS - INSTALL BUGS DESTINATION ${CMAKE_INSTALL_DOCDIR} #COMPONENT runtime @@ -1623,13 +1615,16 @@ add_custom_target (revisiontag -D BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -D OUTPUT_DIR=${PROJECT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/CMake/getsvn.cmake - COMMENT "Generating Subversion revision information" VERBATIM + BYPRODUCTS scs_version.h + COMMENT "Getting source control system revision information" ) # explicitly say that the wsjt_qt depends on custom target, this is # done indirectly so that the revisiontag target gets built exactly # once per build -add_dependencies(wsjt_qt revisiontag) +add_dependencies (wsjt_qt revisiontag) +add_dependencies (jt9 revisiontag) +add_dependencies (wsprd revisiontag) # @@ -1828,11 +1823,12 @@ endif (NOT is_debug_build) # # packaging # +set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/package_description.txt") set (CPACK_MONOLITHIC_INSTALL 1) set (CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") -set (CPACK_PACKAGE_VERSION_MAJOR ${WSJTX_VERSION_MAJOR}) -set (CPACK_PACKAGE_VERSION_MINOR ${WSJTX_VERSION_MINOR}) -set (CPACK_PACKAGE_VERSION_PATCH ${WSJTX_VERSION_PATCH}) +set (CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set (CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set (CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) if (WIN32) set (CPACK_GENERATOR "NSIS") @@ -1865,13 +1861,12 @@ else () endif (RPMBUILDER) endif () -set (CPACK_DEBIAN_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION}") set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}") -set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8), libfftw3-single3 (>=3.3), libgomp1 (>=8), libqt5serialport5 (>=5.9), libqt5multimedia5-plugins (>=5.9), libqt5widgets5 (>=5.9), libqt5network5 (>=5.9), libqt5printsupport5 (>=5.9), libqt5sql5-sqlite (>=5.9), libusb-1.0-0 (>=1.0.21)") +set (CPACK_DEBIAN_PACKAGE_DEPENDS "libgfortran5 (>=8.3) | libgfortran4 (>=7.3) | libgfortran3 (>=6.3), libfftw3-single3 (>=3.3), libgomp1 (>=6), libqt5serialport5 (>=5.7), libqt5multimedia5-plugins (>=5.7), libqt5widgets5 (>=5.7), libqt5network5 (>=5.7), libqt5printsupport5 (>=5.7), libqt5sql5-sqlite (>=5.7), libusb-1.0-0 (>=1.0.21), libboost-log1.65.1 (>=1.62.0) | libboost-log1.65.1 (>=1.65.1) | libboost-log1.67.0 (>=1.67.0) | libboost-log1.71.0 (>=1.71.0)") set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set (CPACK_RPM_PACKAGE_ARCHITECTURE ${CMAKE_SYSTEM_PROCESSOR}) -set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 9, libgomp >= 9, fftw-libs-single >= 3.3") +set (CPACK_RPM_PACKAGE_REQUIRES "qt5-qtbase >= 5.9, qt5-qtserialport >= 5.9, qt5-qtmultimedia >= 5.9, qt5-qtsvg >= 5.9, libusbx >= 1.0.22, libgfortran >= 7, libgomp >= 7, fftw-libs-single >= 3.3") set (CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION /usr/share/pixmaps /usr/share/applications /usr/share/man /usr/share/man1) configure_file ("${PROJECT_SOURCE_DIR}/CMakeCPackOptions.cmake.in" diff --git a/UDPExamples/message_aggregator.rc b/UDPExamples/message_aggregator.rc deleted file mode 100644 index faf73f803..000000000 --- a/UDPExamples/message_aggregator.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/wsjtx.ico" diff --git a/UDPExamples/udp_daemon.rc b/UDPExamples/udp_daemon.rc deleted file mode 100644 index faf73f803..000000000 --- a/UDPExamples/udp_daemon.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "../icons/windows-icons/wsjtx.ico" diff --git a/Versions.cmake b/Versions.cmake deleted file mode 100644 index a5345179d..000000000 --- a/Versions.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# Version number components -set (WSJTX_VERSION_MAJOR 2) -set (WSJTX_VERSION_MINOR 3) -set (WSJTX_VERSION_PATCH 0) -set (WSJTX_RC 2) # release candidate number, comment out or zero for development versions -set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build diff --git a/debian/CMakeLists.txt b/debian/CMakeLists.txt index 27656d7fc..07faeb2c7 100644 --- a/debian/CMakeLists.txt +++ b/debian/CMakeLists.txt @@ -13,7 +13,7 @@ math (EXPR __index "${__month_index} - 1") list (GET __months "${__index}" __month) string (REPLACE "[${__month_index}]" "${__month}" ts ${ts}) -set (deb_changelog changelog.Debian) +set (deb_changelog changelog) configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/${deb_changelog}.in" "${CMAKE_CURRENT_BINARY_DIR}/${deb_changelog}" diff --git a/debian/changelog.Debian.in b/debian/changelog.in similarity index 100% rename from debian/changelog.Debian.in rename to debian/changelog.in diff --git a/debian/copyright.in b/debian/copyright.in index 110219a91..b27020a4c 100644 --- a/debian/copyright.in +++ b/debian/copyright.in @@ -1,10 +1,11 @@ -Format-Specification: http://wiki.debian.org/Proposals/CopyrightFormat +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: @CMAKE_PROJECT_NAME@ -Upstream-Maintainer: @PROJECT_CONTACT@ -Upstream-Source: @PROJECT_HOMEPAGE@ +Upstream-Contact: @PROJECT_CONTACT@ +Source: @PROJECT_HOMEPAGE@ Files: * Copyright: @PROJECT_COPYRIGHT@. -License: GPL v3 - The full text of the GPL is distributed in - /usr/share/common-licenses/GPL-3 on Debian systems. +License: GPL-3+ + On Debian systems, the full text of the GNU General Public + License version 3 can be found in the file + `/usr/share/common-licenses/GPL-3'. diff --git a/main.cpp b/main.cpp index 7d5d6103a..4c30f615c 100644 --- a/main.cpp +++ b/main.cpp @@ -132,7 +132,7 @@ int main(int argc, char *argv[]) a.setApplicationVersion (version ()); QCommandLineParser parser; - parser.setApplicationDescription ("\n" PROJECT_SUMMARY_DESCRIPTION); + parser.setApplicationDescription ("\n" PROJECT_DESCRIPTION); auto help_option = parser.addHelpOption (); auto version_option = parser.addVersionOption (); diff --git a/manpages/CMakeLists.txt b/manpages/CMakeLists.txt index 7ab7c7646..2c2fe59ee 100644 --- a/manpages/CMakeLists.txt +++ b/manpages/CMakeLists.txt @@ -1,4 +1,8 @@ set (ASCIIDOC_MANS + man1/fcal.1.txt + man1/fmeasure.1.txt + man1/fmtave.1.txt + man1/fst4sim.1.txt man1/wsjtx.1.txt man1/wsprd.1.txt man1/jt65code.1.txt diff --git a/manpages/man1/fcal.1.txt b/manpages/man1/fcal.1.txt new file mode 100644 index 000000000..d650ece73 --- /dev/null +++ b/manpages/man1/fcal.1.txt @@ -0,0 +1,42 @@ +:doctype: manpage +:man source: AsciiDoc +:man version: {VERSION} +:man manual: WSJT-X Manual += fcal(1) + +== NAME + +fcal - Calculates a best-fit straight line for calibration data + +== SYNOPSIS + +*fcal* ['FILE'] + +== DESCRIPTION + +*fcal* is one of suite of command line tools designed to aid frequency +measurement. These tools are aimed at those taking part in the ARRL +FMT, but are also useful for general frequency measurement and +calibration. They are included within the *WSJT-X* package for use +with the FreqCal mode of WSJT-X. + +The input FILE is normally the output of the *fmtavg*(1) tool, after +adjusting to remove bad sources. + +Refer to https://physics.princeton.edu/pulsar/k1jt/FMT_User.pdf for +detailed instructions. + +== AUTHOR + +Joe Taylor, K1JT. + +== COPYING + +*fcal* is Copyright (C) 2001 - 2019 by Joseph H. Taylor, Jr., K1JT, +with contributions from additional authors. WSJT-X is Open Source +software, licensed under the GNU General Public License (GPLv3). + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. diff --git a/manpages/man1/fmeasure.1.txt b/manpages/man1/fmeasure.1.txt new file mode 100644 index 000000000..d6d2b5169 --- /dev/null +++ b/manpages/man1/fmeasure.1.txt @@ -0,0 +1,43 @@ +:doctype: manpage +:man source: AsciiDoc +:man version: {VERSION} +:man manual: WSJT-X Manual += fmeasure(1) + +== NAME + +fmeasure - Calculates the properly calibrated frequency of a series of test signals + +== SYNOPSIS + +*fmeasure* ['FILE'] + +== DESCRIPTION + +*fmeasure* is one of suite of command line tools designed to aid +frequency measurement. These tools are aimed at those taking part in +the ARRL FMT, but are also useful for general frequency measurement +and calibration. They are included within the *WSJT-X* package for use +with the FreqCal mode of WSJT-X. + +The input FILE is normally the output of the *fmtavg*(1) tool, after +adjusting to remove bad sources. Results are saved in 'fmeasure.out' +and are suitable for entry to the ARRL Frequency Measuring Test (FMT). + +Refer to https://physics.princeton.edu/pulsar/k1jt/FMT_User.pdf for +detailed instructions. + +== AUTHOR + +Joe Taylor, K1JT. + +== COPYING + +*fcal* is Copyright (C) 2001 - 2019 by Joseph H. Taylor, Jr., K1JT, +with contributions from additional authors. WSJT-X is Open Source +software, licensed under the GNU General Public License (GPLv3). + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. diff --git a/manpages/man1/fmtave.1.txt b/manpages/man1/fmtave.1.txt new file mode 100644 index 000000000..6da8f4201 --- /dev/null +++ b/manpages/man1/fmtave.1.txt @@ -0,0 +1,44 @@ +:doctype: manpage +:man source: AsciiDoc +:man version: {VERSION} +:man manual: WSJT-X Manual += fmtave(1) + +== NAME + +fmtave - Averages raw measurement data + +== SYNOPSIS + +*fmtave* ['FILE'] + +== DESCRIPTION + +*fmtave* is one of suite of command line tools designed to aid +frequency measurement. These tools are aimed at those taking part in +the ARRL FMT, but are also useful for general frequency measurement +and calibration. They are included within the *WSJT-X* package for use +with the FreqCal mode of WSJT-X. + +The input FILE is normally the output of a WSJT-X FreqCal run or the +*fmt* tool (not bundled with WSJT-X). Results are saved in +'fmtave.out'.and are suitable for entry to the ARRL Frequency +Measuring Test (FMT). + +Refer to https://physics.princeton.edu/pulsar/k1jt/FMT_User.pdf for +detailed instructions. + +== AUTHOR + +Joe Taylor, K1JT. + +== COPYING + +*fcal* is Copyright (C) 2001 - 2019 by Joseph H. Taylor, Jr., K1JT, +with contributions from additional authors. WSJT-X is Open Source +software, licensed under the GNU General Public License (GPLv3). + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. diff --git a/manpages/man1/fst4sim.1.txt b/manpages/man1/fst4sim.1.txt new file mode 100644 index 000000000..7c4dbaf05 --- /dev/null +++ b/manpages/man1/fst4sim.1.txt @@ -0,0 +1,93 @@ +:doctype: manpage +:man source: AsciiDoc +:man version: {VERSION} +:man manual: WSJT-X Manual += fst4sim(1) + +== NAME + +fst4sim, qra64sim - Generate simulated QRA64, FST4, and FST4W mode signals. + +== SYNOPSIS + +*qra64sim* msg A-E Nsigs fDop DT Nfiles SNR + +*fst4sim* msg TRsec f0 DT h fDop del Nfiles SNR W + +== DESCRIPTION + +*fst4sim* can be used to generate FST4 and FST4W signals with +user-specified message content, mode parameters, and SNR values. + +== ARGS + +*msg*:: + + A valid QRA64, FST4, or FST4W message enclosed in quotation marks. + +*A-E*:: + +QRA64 sub-mode designator. + +*Nsigs*:: + + Number of signals to simulate, distributed even across a 2000 Hz + bandwidth. + +*TRsec*:: + + A valid T/R period duration (s). + +*f0*:: + + Integer signal frequency offset (Hz). + +*DT*:: + + Decimal signal time offset (s). + +*h*:: + + A valid modulation index. + +*fDop*:: + + Decimal Doppler frequency spread (Hz). + +*del*:: + + Decimal Watterson model delay (ms). + +*nfiles*:: + + Number of files to generate. + +*snr*:: + + Add Guassian noise to simulate SNR in 2500 Hz bandwidth. + +*W*:: + + Hint to break ties between ambiguous messages '0' as 77-bit (FST4), + '1' as 50-bit (FST4W). + +Generated files are 12000 Hz sample rate, 16-bit unsigned format, mono +PCM .WAV files suitable for replay using WSJT-X either vie the GUI +*wsjtx*(1) or using the command line slow mode decoder *jt9*(1). Files +are named 000000_nnnnnn.wav (000000_nnnn.wav for QRA64), where +'nnnnnn' or 'nnnn' increments from zero. + +== AUTHOR + +Joe Taylor, K1JT. + +== COPYING + +*fcal* is Copyright (C) 2001 - 2019 by Joseph H. Taylor, Jr., K1JT, +with contributions from additional authors. WSJT-X is Open Source +software, licensed under the GNU General Public License (GPLv3). + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. diff --git a/manpages/man1/jt65code.1.txt b/manpages/man1/jt65code.1.txt index ef3bf74ea..087d1f4cc 100644 --- a/manpages/man1/jt65code.1.txt +++ b/manpages/man1/jt65code.1.txt @@ -6,7 +6,7 @@ == NAME -jt65code, jt9code, jt4code - Weak signal communications encoding support utility. +jt65code, jt9code, jt4code, qra64code, ft8code, msk144code - Weak signal communications encoding support utilities. == SYNOPSIS @@ -22,18 +22,32 @@ jt65code, jt9code, jt4code - Weak signal communications encoding support utility *jt4code* ['OPTIONS'] +*qra64code* "'MESSAGE'" + +*qra64code* ['OPTIONS'] + +*ft8code* "'MESSAGE'" + +*ft8code* ['OPTIONS'] + == OPTIONS *-t*:: - Prints a selection of messages alongside their corresponding - decoded form and types. + + Prints a selection of messages alongside their corresponding decoded + form and types. With *ft8code* prints a selection of short format + messages + +*-T*:: + + As *-T* but for *ft8code* prints long format messages. == DESCRIPTION -*jt65code*, *jt9code* and *jt4code* are utility programs that let you -explore the conversion of user-level messages into channel symbols or -“tone numbers.” These programs can be useful to someone designing a -beacon generator for JT9 or JT65, or for studying behavior of the -error-control codes for each of the protocols. +*jt65code*, *jt9code*, *jt4code*, and *ft8code* are utility programs +that let you explore the conversion of user-level messages into +channel symbols or “tone numbers.” These programs can be useful to +someone designing a beacon generator for JT9 or JT65, or for studying +behavior of the error-control codes for each of the protocols. Channel-symbol values for JT9 run from 0 to 8, with 0 representing the sync tone. The total number of symbols in a transmitted message is @@ -92,10 +106,61 @@ You will discover that every possible JT65 message differs from every other possible JT65 message in at least 52 of the 63 information-carrying channel symbols. -WSJT-X home page:: http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html +..... +$ qra64code "G0XYZ K1ABC FN43" + Message Decoded Err? Type +-------------------------------------------------------------------------- + 1 G0XYZ K1ABC FN43 G0XYZ K1ABC FN43 1: Std Msg + +Packed message, 6-bit symbols 61 36 45 30 3 55 3 2 14 5 33 41 + +Information-carrying channel symbols + 61 36 45 30 3 55 3 2 14 5 33 41 14 28 2 7 58 45 9 43 20 48 29 55 43 24 3 13 18 21 + 40 3 17 28 59 62 2 50 26 24 2 1 2 61 10 9 16 40 1 18 28 30 33 39 60 45 16 21 60 11 + 9 40 14 + +Channel symbols including sync + 20 50 60 0 40 10 30 61 36 45 30 3 55 3 2 14 5 33 41 14 28 2 7 58 45 9 43 20 48 29 + 55 43 24 3 13 18 21 40 3 20 50 60 0 40 10 30 17 28 59 62 2 50 26 24 2 1 2 61 10 9 + 16 40 1 18 28 30 33 39 60 45 16 21 60 11 9 40 14 20 50 60 0 40 10 30 +..... + +..... +$ msk144code "G0XYZ K1ABC FN43" + Message Decoded Err i3.n3 +---------------------------------------------------------------------------------------------------- + 1. G0XYZ K1ABC FN43 G0XYZ K1ABC FN43 1. Standard msg + +Channel symbols +110000110100110001010010011100110010010110000011011001001100001101111010 +110010110111111100001101001111000111101011111011100001110000011101110110 +..... + +..... +$ ft8code "G0XYZ K1ABC FN43" + Message Decoded Err i3.n3 +---------------------------------------------------------------------------------------------------- + 1. G0XYZ K1ABC FN43 G0XYZ K1ABC FN43 1. Standard msg + +Source-encoded message, 77 bits: +00001000111111010001110111010000010011011110111100011010100010100001100111001 + +14-bit CRC: +00110001001011 + +83 Parity bits: +10000110000001010101100000100110100110100000111000101110000110001001110000000110011 + +Channel symbols (79 tones): + Sync Data Sync Data Sync +3140652 03174526450547670460602143205 3140652 64040136505454507064041140042 3140652 +..... + + +WSJT-X home page:: https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html WSJT-X User's Guide:: -http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/wsjtx-main-{VERSION}.html +https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/wsjtx-main-{VERSION}.html == AUTHOR @@ -103,10 +168,10 @@ Joe Taylor, K1JT. == COPYING -*jt65code*, *jt9code* and *jt4code* are Copyright (C) 2001 - 2015 by -Joseph H. Taylor, Jr., K1JT, with contributions from additional -authors. WSJT-X is Open Source software, licensed under the GNU -General Public License (GPLv3). +*jt65code*, *jt9code*, *jt4code*, and *ft8code* are Copyright (C) 2001 +- 2020 by Joseph H. Taylor, Jr., K1JT, with contributions from +additional authors. WSJT-X is Open Source software, licensed under +the GNU General Public License (GPLv3). These programs are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/manpages/man1/wsprd.1.txt b/manpages/man1/wsprd.1.txt index 8a9523508..51c2a5f1a 100644 --- a/manpages/man1/wsprd.1.txt +++ b/manpages/man1/wsprd.1.txt @@ -10,12 +10,12 @@ wsprd - is a decoder for K1JT's Weak Signal Propagation Reporter (WSPR) mode. == SYNOPSIS -*wsprd* ['OPTIONS'] +*wsprd* ['OPTIONS'] ['FILE'] == DESCRIPTION *wsprd* - The program is written in C and is a command-line program that reads -from a .c2 file or .wav file and writes output to the console. It is used by +from a .c2 FILE or .wav FILE and writes output to the console. It is used by WSJT-X for wspr-mode decoding. @@ -42,7 +42,7 @@ WSJT-X for wspr-mode decoding. *-z x*:: x is fano metric table bias, default is 0.42 -The Infile can be either .wav or .c2, for example: +The FILE can be either .wav or .c2, for example: ----- ./wsprd -wf 14.0956 140709_2258.wav diff --git a/package_description.txt b/package_description.txt new file mode 100644 index 000000000..12aae6d6a --- /dev/null +++ b/package_description.txt @@ -0,0 +1,67 @@ +WSJT-X is a computer program designed to facilitate basic amateur +radio communication using very weak signals. The first four letters in +the program name stand for `(W)eak (S)ignal communication by K1(JT),` +while the suffix `-X` indicates that WSJT-X started as an extended and +experimental branch of the program WSJT. +. +WSJT-X Version 2.0 offers twelve different protocols or modes: FST4, +FST4W, FT4, FT8, JT4, JT9, JT65, QRA64, ISCAT, MSK144, WSPR, and Echo. +The first eight are designed for making reliable QSOs under extreme +weak-signal conditions. They use nearly identical message structure +and source encoding. JT65 and QRA64 were designed for EME +(`moonbounce`) on the VHF/UHF bands and have also proven very +effective for worldwide QRP communication on the HF bands. QRA64 has +a number of advantages over JT65, including better performance on the +very weakest signals. We imagine that over time it may replace JT65 +for EME use. JT9 was originally designed for the LF, MF, and lower HF +bands. Its submode JT9A is 2 dB more sensitive than JT65 while using +less than 10% of the bandwidth. FST4, and its quasi-beacon companion +mode FST4W (see below), are designed for LF and MF and offer +significant advantages over JT9 and WSPR on those bands. JT4 offers a +wide variety of tone spacings and has proven highly effective for EME +on microwave bands up to 24 GHz. These four `slow` modes use +one-minute timed sequences of alternating transmission and reception, +so a minimal QSO takes four to six minutes — two or three +transmissions by each station, one sending in odd UTC minutes and the +other even. FT8 is operationally similar but four times faster +(15-second T/R sequences) and less sensitive by a few dB. On the HF +bands, world-wide QSOs are possible with any of these modes using +power levels of a few watts (or even milliwatts) and compromise +antennas. On VHF bands and higher, QSOs are possible (by EME and +other propagation types) at signal levels 10 to 15 dB below those +required for CW. +. +ISCAT, MSK144, and optionally submodes JT9E-H are `fast` protocols +designed to take advantage of brief signal enhancements from ionized +meteor trails, aircraft scatter, and other types of scatter +propagation. These modes use timed sequences of 5, 10, 15, or 30 s +duration. User messages are transmitted repeatedly at high rate (up +to 250 characters per second, for MSK144) to make good use of the +shortest meteor-trail reflections or `pings`. ISCAT uses free-form +messages up to 28 characters long, while MSK144 uses the same +structured messages as the slow modes and optionally an abbreviated +format with hashed callsigns. +. +WSPR (pronounced `whisper`) stands for (W)eak (S)ignal (P)ropagation +(R)eporter. The WSPR protocol was designed for probing potential +propagation paths using low-power transmissions. WSPR messages +normally carry the transmitting station’s callsign, grid locator, and +transmitter power in dBm, and they can be decoded at signal-to-noise +ratios as low as -28 dB in a 2500 Hz bandwidth. WSPR users with +internet access can automatically upload reception reports to a +central database called wsprnet that provides a mapping facility, +archival storage, and many other features. WSPR has a new companion +FST4W which has a similar message content but offers up to 30 minute +transmission periods for greater sensitivity on LF and MF. +. +Echo mode allows you to detect and measure your own station's echoes +from the moon, even if they are far below the audible threshold. +. +WSJT-X provides spectral displays for receiver passbands as wide as 5 +kHz, flexible rig control for nearly all modern radios used by +amateurs, and a wide variety of special aids such as automatic Doppler +tracking for EME QSOs and Echo testing. The program runs equally well +on Windows, Macintosh, and Linux systems, and installation packages +are available for all three platforms. +. +Be sure to read the online WSJT-X User's Guide. diff --git a/qmake_only/scs_version.h b/qmake_only/scs_version.h new file mode 100644 index 000000000..3712dbb51 --- /dev/null +++ b/qmake_only/scs_version.h @@ -0,0 +1,4 @@ +/* This is a dummy file required to make the qmake build compatible + with the CMake build. */ + +#define STRINGIZE__(X) diff --git a/revision_utils.cpp b/revision_utils.cpp index 8108b202c..c80e07993 100644 --- a/revision_utils.cpp +++ b/revision_utils.cpp @@ -30,7 +30,7 @@ QString revision (QString const& scs_rev_string) auto revision_from_scs = revision_extract_number (scs_rev_string); #if defined (CMAKE_BUILD) - QString scs_info {":Rev: " WSJTX_STRINGIZE (SCS_VERSION) " $"}; + QString scs_info {":Rev: " SCS_VERSION_STR " $"}; auto revision_from_scs_info = revision_extract_number (scs_info); if (!revision_from_scs_info.isEmpty ()) @@ -66,14 +66,10 @@ QString revision (QString const& scs_rev_string) QString version (bool include_patch) { #if defined (CMAKE_BUILD) - QString v {WSJTX_STRINGIZE (WSJTX_VERSION_MAJOR) "." WSJTX_STRINGIZE (WSJTX_VERSION_MINOR)}; + QString v {TO_STRING__ (PROJECT_VERSION_MAJOR) "." TO_STRING__ (PROJECT_VERSION_MINOR)}; if (include_patch) { - v += "." WSJTX_STRINGIZE (WSJTX_VERSION_PATCH) -# if defined (WSJTX_RC) - + "-rc" WSJTX_STRINGIZE (WSJTX_RC) -# endif - ; + v += "." TO_STRING__ (PROJECT_VERSION_PATCH) + QString {BUILD_TYPE_REVISION}; } #else QString v {"Not for Release"}; diff --git a/widgets/about.cpp b/widgets/about.cpp index c8b630823..b8e0fab43 100644 --- a/widgets/about.cpp +++ b/widgets/about.cpp @@ -26,7 +26,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) : "VE1SKY, VK3ACF, VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB.

" "WSJT-X is licensed under the terms of Version 3
" "of the GNU General Public License (GPL)

" - "" + "" "" "" "
" diff --git a/wsjtx.rc b/wsjtx.rc deleted file mode 100644 index d54bf4ffa..000000000 --- a/wsjtx.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "icons/windows-icons/wsjtx.ico" diff --git a/wsjtx_config.h.in b/wsjtx_config.h.in index 7da6a4cdd..2ded8e1cf 100644 --- a/wsjtx_config.h.in +++ b/wsjtx_config.h.in @@ -5,19 +5,29 @@ extern "C" { #endif -#define WSJTX_VERSION_MAJOR @WSJTX_VERSION_MAJOR@ -#define WSJTX_VERSION_MINOR @WSJTX_VERSION_MINOR@ -#define WSJTX_VERSION_PATCH @WSJTX_VERSION_PATCH@ +#ifndef TO_STRING__ +#define TO_STRING_IMPL__(x) #x +#define TO_STRING__(x) TO_STRING_IMPL__(x) +#endif + +#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ +#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@ +#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@ +#define PROJECT_VERSION_TWEAK @PROJECT_VERSION_TWEAK@ +#define BUILD_TYPE_REVISION "@BUILD_TYPE_REVISION@" #cmakedefine CMAKE_INSTALL_DATAROOTDIR "@CMAKE_INSTALL_DATAROOTDIR@" #cmakedefine CMAKE_INSTALL_DOCDIR "@CMAKE_INSTALL_DOCDIR@" #cmakedefine CMAKE_INSTALL_DATADIR "@CMAKE_INSTALL_DATADIR@" #cmakedefine CMAKE_PROJECT_NAME "@CMAKE_PROJECT_NAME@" +#cmakedefine PROJECT_VENDOR "@PROJECT_VENDOR@" +#cmakedefine PROJECT_NAME "@PROJECT_NAME@" +#cmakedefine PROJECT_COPYRIGHT "@PROJECT_COPYRIGHT@" #cmakedefine PROJECT_MANUAL "@PROJECT_MANUAL@" #cmakedefine PROJECT_HOMEPAGE "@PROJECT_HOMEPAGE@" #cmakedefine PROJECT_MANUAL_DIRECTORY_URL "@PROJECT_MANUAL_DIRECTORY_URL@" #cmakedefine PROJECT_SAMPLES_URL "@PROJECT_SAMPLES_URL@" -#cmakedefine PROJECT_SUMMARY_DESCRIPTION "@PROJECT_SUMMARY_DESCRIPTION@" +#cmakedefine PROJECT_DESCRIPTION "@PROJECT_DESCRIPTION@" #cmakedefine01 HAVE_HAMLIB_OLD_CACHING #cmakedefine01 HAVE_HAMLIB_CACHING @@ -34,9 +44,6 @@ extern "C" { #cmakedefine01 WSJT_RIG_NONE_CAN_SPLIT #cmakedefine01 WSJT_TRACE_UDP -#define WSJTX_STRINGIZE1(x) #x -#define WSJTX_STRINGIZE(x) WSJTX_STRINGIZE1(x) - /* consistent UNICODE behaviour */ #ifndef UNICODE # undef _UNICODE From 518207da3b73b0f1c962d64cb334fa29ab877624 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Tue, 13 Oct 2020 16:46:38 +0100 Subject: [PATCH 19/19] Various updates to UDP Message Protocol handling for FST4W Corresponding updates to the message_aggregator reference application. --- UDPExamples/ClientWidget.cpp | 4 +-- widgets/mainwindow.cpp | 54 ++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/UDPExamples/ClientWidget.cpp b/UDPExamples/ClientWidget.cpp index 984b64ad9..b2ee03609 100644 --- a/UDPExamples/ClientWidget.cpp +++ b/UDPExamples/ClientWidget.cpp @@ -184,10 +184,10 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod message_line_edit_->setValidator (&message_validator); grid_line_edit_->setValidator (&locator_validator); dx_grid_line_edit_->setValidator (&locator_validator); - tr_period_spin_box_->setRange (5, 30); + tr_period_spin_box_->setRange (5, 1800); tr_period_spin_box_->setSuffix (" s"); rx_df_spin_box_->setRange (200, 5000); - frequency_tolerance_spin_box_->setRange (10, 1000); + frequency_tolerance_spin_box_->setRange (1, 1000); frequency_tolerance_spin_box_->setPrefix ("\u00b1"); frequency_tolerance_spin_box_->setSuffix (" Hz"); diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index e6b410d41..c83449e3b 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -8296,12 +8296,22 @@ void MainWindow::statusUpdate () const if (!ui || m_block_udp_status_updates) return; auto submode = current_submode (); auto ftol = ui->sbFtol->value (); - if (!(ui->sbFtol->isVisible () && ui->sbFtol->isEnabled ())) + if ("FST4W" == m_mode) + { + ftol = ui->sbFST4W_FTol->value (); + } + else if (!(ui->sbFtol->isVisible () && ui->sbFtol->isEnabled ())) { ftol = quint32_max; } auto tr_period = ui->sbTR->value (); - if (!(ui->sbTR->isVisible () && ui->sbTR->isEnabled ())) + auto rx_frequency = ui->RxFreqSpinBox->value (); + if ("FST4W" == m_mode) + { + tr_period = ui->sbTR_FST4W->value (); + rx_frequency = ui->sbFST4W_RxFreq->value (); + } + else if (!(ui->sbTR->isVisible () && ui->sbTR->isEnabled ())) { tr_period = quint32_max; } @@ -8309,7 +8319,7 @@ void MainWindow::statusUpdate () const QString::number (ui->rptSpinBox->value ()), m_modeTx, ui->autoButton->isChecked (), m_transmitting, m_decoderBusy, - ui->RxFreqSpinBox->value (), ui->TxFreqSpinBox->value (), + rx_frequency, ui->TxFreqSpinBox->value (), m_config.my_callsign (), m_config.my_grid (), m_hisGrid, m_tx_watchdog, submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode, @@ -9215,9 +9225,19 @@ void MainWindow::remote_configure (QString const& mode, quint32 frequency_tolera { set_mode (mode); } - if (frequency_tolerance != quint32_max && ui->sbFtol->isVisible ()) + auto is_FST4W = "FST4W" == m_mode; + if (frequency_tolerance != quint32_max && (ui->sbFtol->isVisible () || is_FST4W)) { - ui->sbFtol->setValue (frequency_tolerance); + m_block_udp_status_updates = true; + if (is_FST4W) + { + ui->sbFST4W_FTol->setValue (frequency_tolerance); + } + else + { + ui->sbFtol->setValue (frequency_tolerance); + } + m_block_udp_status_updates = false; } if (submode.size () && ui->sbSubmode->isVisible ()) { @@ -9229,14 +9249,30 @@ void MainWindow::remote_configure (QString const& mode, quint32 frequency_tolera } if (tr_period != quint32_max && ui->sbTR->isVisible ()) { - ui->sbTR->setValue (tr_period); - ui->sbTR->interpretText (); + if (is_FST4W) + { + ui->sbTR_FST4W->setValue (tr_period); + ui->sbTR_FST4W->interpretText (); + } + else + { + ui->sbTR->setValue (tr_period); + ui->sbTR->interpretText (); + } } if (rx_df != quint32_max && ui->RxFreqSpinBox->isVisible ()) { m_block_udp_status_updates = true; - ui->RxFreqSpinBox->setValue (rx_df); - ui->RxFreqSpinBox->interpretText (); + if (is_FST4W) + { + ui->sbFST4W_RxFreq->setValue (rx_df); + ui->sbFST4W_RxFreq->interpretText (); + } + else + { + ui->RxFreqSpinBox->setValue (rx_df); + ui->RxFreqSpinBox->interpretText (); + } m_block_udp_status_updates = false; } if (dx_call.size () && ui->dxCallEntry->isVisible ())