Merge branch 'release-2.3.0'

This commit is contained in:
Bill Somerville 2021-01-04 22:53:38 +00:00
commit 580363c292
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
65 changed files with 2414 additions and 1244 deletions

43
AppVersion/AppVersion.cpp Normal file
View File

@ -0,0 +1,43 @@
//
// wsjtx_app_version - a console application that outputs WSJT-X
// application version
//
// This application is only provided as a simple console application
//
//
#include <cstdlib>
#include <iostream>
#include <exception>
#include <QCoreApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>
#include "revision_utils.hpp"
int main (int argc, char * argv[])
{
QCoreApplication app {argc, argv};
try
{
app.setApplicationName ("WSJT-X");
app.setApplicationVersion (version());
QCommandLineParser parser;
// parser.setApplicationDescription ("\n" PROJECT_DESCRIPTION);
parser.addHelpOption ();
parser.addVersionOption ();
parser.process (app);
return EXIT_SUCCESS;
}
catch (std::exception const& e)
{
std::cerr << "Error: " << e.what () << '\n';
}
catch (...)
{
std::cerr << "Unexpected error\n";
}
return -1;
}

View File

@ -88,17 +88,16 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
//qDebug () << "SoundIn default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
// the Windows MME version of QAudioInput uses 1/5 of the buffer
// size for period size other platforms seem to optimize themselves
#if defined (Q_OS_WIN)
m_stream->setBufferSize (m_stream->format ().bytesForFrames (framesPerBuffer * 5));
#else
Q_UNUSED (framesPerBuffer);
#endif
if (framesPerBuffer > 0)
{
m_stream->setBufferSize (m_stream->format ().bytesForFrames (framesPerBuffer));
}
if (m_sink->initialize (QIODevice::WriteOnly, channel))
{
m_stream->start (sink);
checkStream ();
cummulative_lost_usec_ = -1;
//qDebug () << "SoundIn selected buffer size (bytes):" << m_stream->bufferSize () << "peirod size:" << m_stream->periodSize ();
LOG_DEBUG ("Selected buffer size (bytes): " << m_stream->bufferSize () << " period size: " << m_stream->periodSize ());
}
else
{

View File

@ -7,6 +7,7 @@
#include <qmath.h>
#include <QDebug>
#include "Logger.hpp"
#include "Audio/AudioDevice.hpp"
#include "moc_soundout.cpp"
@ -104,15 +105,13 @@ void SoundOutput::restart (QIODevice * source)
// Windows implementation seems to forget the buffer size after a
// stop.
//qDebug () << "SoundOut default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
if (m_framesBuffered)
if (m_framesBuffered > 0)
{
#if defined (Q_OS_WIN)
m_stream->setBufferSize (m_stream->format().bytesForFrames (m_framesBuffered));
#endif
}
m_stream->setCategory ("production");
m_stream->start (source);
// qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
LOG_DEBUG ("Selected buffer size (bytes): " << m_stream->bufferSize () << " period size: " << m_stream->periodSize ());
}
void SoundOutput::suspend ()

View File

@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 3.9 FATAL_ERROR)
cmake_minimum_required (VERSION 3.7.2 FATAL_ERROR)
if (APPLE)
#
@ -46,9 +46,9 @@ endif ()
project (wsjtx
VERSION 2.3.0.0
DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio"
LANGUAGES C CXX Fortran
)
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
#
# Local CMake modules and support files
@ -70,7 +70,7 @@ message (STATUS "******************************************************")
include (set_build_type)
# RC 0 or omitted is a development build, GA is a General Availability release build
set_build_type (RC 2)
set_build_type (RC 3)
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
#
@ -79,7 +79,7 @@ set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_
set (PROJECT_BUNDLE_NAME "WSJT-X")
set (PROJECT_VENDOR "Joe Taylor, K1JT")
set (PROJECT_CONTACT "Joe Taylor <k1jt@arrl.net>")
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2020 by Joe Taylor, K1JT")
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2021 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 https://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/)
@ -459,6 +459,7 @@ set (wsjt_FSRCS
lib/jtmsg.f90
lib/libration.f90
lib/lorentzian.f90
lib/fst4/lorentzian_fading.f90
lib/lpf1.f90
lib/mixlpf.f90
lib/makepings.f90
@ -562,6 +563,7 @@ set (wsjt_FSRCS
lib/fst4/ldpcsim240_74.f90
lib/fst4/osd240_101.f90
lib/fst4/osd240_74.f90
lib/fst4/fastosd240_74.f90
lib/fst4/get_crc24.f90
lib/fst4/fst4_baseline.f90
)
@ -838,7 +840,7 @@ endif ()
if (WIN32)
set (Boost_USE_STATIC_LIBS OFF)
endif ()
find_package (Boost 1.63 REQUIRED COMPONENTS log_setup log)
find_package (Boost 1.62 REQUIRED COMPONENTS log_setup log)
#
# OpenMP
@ -1053,7 +1055,7 @@ 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)
add_definitions (-DQT5 -DCMAKE_BUILD -DBIGSYM=1 -DBOOST_ALL_DYN_LINK)
if (CMAKE_HOST_UNIX)
add_definitions (-DUNIX)
elseif (CMAKE_HOST_WIN32)
@ -1062,7 +1064,6 @@ endif ()
# build a library of package functionality (without and optionally with OpenMP support)
add_library (wsjt_cxx STATIC ${wsjt_CSRCS} ${wsjt_CXXSRCS})
target_compile_definitions (wsjt_cxx PUBLIC BOOST_LOG_DYN_LINK)
target_link_libraries (wsjt_cxx ${LIBM_LIBRARIES} Boost::log_setup ${LIBM_LIBRARIES})
# build an OpenMP variant of the Fortran library routines
@ -1310,7 +1311,7 @@ target_link_libraries (qcp Qt5::Widgets Qt5::PrintSupport)
# build a library of package Qt functionality
add_library (wsjt_qt STATIC ${wsjt_qt_CXXSRCS} ${wsjt_qt_GENUISRCS} ${GENAXSRCS})
# set wsjtx_udp exports to static variants
target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE BOOST_LOG_DYN_LINK)
target_compile_definitions (wsjt_qt PUBLIC UDP_STATIC_DEFINE)
target_link_libraries (wsjt_qt Boost::log qcp Qt5::Widgets Qt5::Network Qt5::Sql)
target_include_directories (wsjt_qt BEFORE PRIVATE ${hamlib_INCLUDE_DIRS})
if (WIN32)
@ -1458,6 +1459,15 @@ generate_version_info (udp_daemon_VERSION_RESOURCES
add_executable (udp_daemon UDPExamples/UDPDaemon.cpp ${udp_daemon_VERSION_RESOURCES})
target_link_libraries (udp_daemon wsjtx_udp-static)
generate_version_info (wsjtx_app_version_VERSION_RESOURCES
NAME wsjtx_app_version
BUNDLE ${PROJECT_BUNDLE_NAME}
ICON ${WSJTX_ICON_FILE}
FILE_DESCRIPTION "Display WSJT-X Application Version on console"
)
add_executable (wsjtx_app_version AppVersion/AppVersion.cpp ${wsjtx_app_version_VERSION_RESOURCES})
target_link_libraries (wsjtx_app_version wsjt_qt)
generate_version_info (message_aggregator_VERSION_RESOURCES
NAME message_aggregator
BUNDLE ${PROJECT_BUNDLE_NAME}
@ -1517,7 +1527,7 @@ install (TARGETS wsjtx
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wsjtx
# )
install (TARGETS udp_daemon message_aggregator
install (TARGETS udp_daemon message_aggregator wsjtx_app_version
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
)
@ -1574,6 +1584,13 @@ install (FILES
#COMPONENT runtime
)
install (DIRECTORY
example_log_configurations
DESTINATION ${CMAKE_INSTALL_DOCDIR}
FILES_MATCHING REGEX "^.*[^~]$"
#COMPONENT runtime
)
#
# Mac installer files
#
@ -1853,11 +1870,11 @@ else ()
endif ()
set (CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE}")
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_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.62.0 (>=1.62.0) | libboost-log1.65.1 (>=1.65.1) | libboost-log1.67.0 (>=1.67.0) | libboost-log1.71.0 (>=1.71.0) | libboost-log1.74.0 (>=1.74.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 >= 7, libgomp >= 7, 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, boost-log >= 1.62")
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"

View File

@ -812,7 +812,7 @@ bool Configuration::is_dummy_rig () const
bool Configuration::transceiver_online ()
{
LOG_TRACE ("transceiver_online: " << m_->cached_rig_state_);
LOG_TRACE (m_->cached_rig_state_);
return m_->have_rig ();
}
@ -823,37 +823,37 @@ int Configuration::transceiver_resolution () const
void Configuration::transceiver_offline ()
{
LOG_TRACE ("transceiver_offline: " << m_->cached_rig_state_);
LOG_TRACE (m_->cached_rig_state_);
m_->close_rig ();
}
void Configuration::transceiver_frequency (Frequency f)
{
LOG_TRACE ("transceiver_frequency: " << f << m_->cached_rig_state_);
LOG_TRACE (f << ' ' << m_->cached_rig_state_);
m_->transceiver_frequency (f);
}
void Configuration::transceiver_tx_frequency (Frequency f)
{
LOG_TRACE ("transceiver_tx_frequency: " << f << m_->cached_rig_state_);
LOG_TRACE (f << ' ' << m_->cached_rig_state_);
m_->transceiver_tx_frequency (f);
}
void Configuration::transceiver_mode (MODE mode)
{
LOG_TRACE ("transceiver_mode: " << mode << " " << m_->cached_rig_state_);
LOG_TRACE (mode << ' ' << m_->cached_rig_state_);
m_->transceiver_mode (mode);
}
void Configuration::transceiver_ptt (bool on)
{
LOG_TRACE ("transceiver_ptt: " << on << " " << m_->cached_rig_state_);
LOG_TRACE (on << ' ' << m_->cached_rig_state_);
m_->transceiver_ptt (on);
}
void Configuration::sync_transceiver (bool force_signal, bool enforce_mode_and_split)
{
LOG_TRACE ("sync_transceiver: force signal: " << force_signal << " enforce_mode_and_split: " << enforce_mode_and_split << " " << m_->cached_rig_state_);
LOG_TRACE ("force signal: " << force_signal << " enforce_mode_and_split: " << enforce_mode_and_split << ' ' << m_->cached_rig_state_);
m_->sync_transceiver (force_signal);
if (!enforce_mode_and_split)
{
@ -1076,9 +1076,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
});
lotw_users_.set_local_file_path (writeable_data_dir_.absoluteFilePath ("lotw-user-activity.csv"));
// load the dictionary if it exists, fetch and load if it doesn't
lotw_users_.load (ui_->LotW_CSV_URL_line_edit->text ());
//
// validation
//
@ -1239,6 +1236,19 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
audio_output_device_ = next_audio_output_device_;
audio_output_channel_ = next_audio_output_channel_;
bool fetch_if_needed {false};
for (auto const& item : decode_highlighing_model_.items ())
{
if (DecodeHighlightingModel::Highlight::LotW == item.type_)
{
fetch_if_needed = item.enabled_;
break;
}
}
// load the LoTW users dictionary if it exists, fetch and load if it
// doesn't and we need it
lotw_users_.load (ui_->LotW_CSV_URL_line_edit->text (), fetch_if_needed);
transceiver_thread_ = new QThread {this};
transceiver_thread_->start ();
}
@ -2828,7 +2838,7 @@ void Configuration::impl::sync_transceiver (bool /*force_signal*/)
void Configuration::impl::handle_transceiver_update (TransceiverState const& state,
unsigned sequence_number)
{
LOG_TRACE ("handle_transceiver_update: Transceiver State #: " << sequence_number << " " << state);
LOG_TRACE ("#: " << sequence_number << ' ' << state);
// only follow rig on some information, ignore other stuff
cached_rig_state_.online (state.online ());

View File

@ -1,15 +1,33 @@
Notes on WSJT-X Installation for Mac OS X
-----------------------------------------
Important: If you are using the new Mac with the M1 chip then please read
the section marked: BEGIN M1. Otherwise BEGIN INTEL applies.
If you have already downloaded a previous version of WSJT-X then I suggest
you change the name in the Applications folder from WSJT-X to WSJT-X_previous
before proceeding.
If you have installed a previous version of WSJT-X before, then there is no
need to change anything on your system so proceed to NEXT. If you upgrade macOS
it is possible that you might need to re-install the sysctl.conf file.
I recommend that you follow the installation instructions especially if you
are moving from v2.2 to v2.3 of WSJT-X or you have upgraded macOS.
BEGIN:
BEGIN M1:
Double-click on the wsjtx-...-Darwin.dmg file you have downloaded from K1JT's web-site.
Now open a Terminal window by going to Applications->Utilities and clicking on Terminal.
There are two system variables that must be set manually since the M1 Macs do not recognise
automatic parameter settings by means of the sysctl.conf file present in the download.
Type these commands - you will be asked for your password which will not be echoed:
sudo sysctl -w kern.sysv.shmmax=104857600
sudo sysctl -w kern.sysv.shmall=25600
It is important to note that these parameter settings will not survive a reboot. If you
need to reboot your Mac, then these commands must be re-entered. Now proceed to NEXT.
BEGIN INTEL:
Double-click on the wsjtx-...-Darwin.dmg file you have downloaded from K1JT's web-site.
@ -18,7 +36,7 @@ Now open a Terminal window by going to Applications->Utilities and clicking on T
Along with this ReadMe file there is a file: sysctl.conf which must be copied to a
system area by typing this line in the Terminal window and then pressing the Return key.
sudo cp /Volumes/WSJT-X/sysctl.conf /etc
sudo cp /Volumes/WSJT-X/sysctl.conf /etc
you will be asked for your normal password because authorisation is needed to copy this file.
(Your password will not be echoed but press the Return key when completed.)
@ -26,9 +44,9 @@ Now re-boot your Mac. This is necessary to install the changes. After the
reboot you should re-open the Terminal window as before and you can check that the
change has been made by typing:
sysctl -a | grep sysv.shm
sysctl -a | grep sysv.shm
If shmmax is not shown as 14680064 then contact me since WSJT-X will fail to load with
If shmmax is not shown as 104857600 then contact me since WSJT-X will fail to load with
an error message: "Unable to create shared memory segment".
You can now close the Terminal window. It will not be necessary to repeat this procedure
@ -77,23 +95,20 @@ Please email me if you have problems.
--- John G4KLA (g4kla@rmnjmn.co.uk)
Addendum: Information about sysctl.conf and multiple instances of wsjt-x.
Addendum: Information about sysctl.conf and multiple instances of WSJT-X.
WSJT-X makes use of a block of memory which is shared between different parts of
the code. The normal allocation of shared memory on a Mac is insufficient and this
has to be increased. The sysctl.conf file is used for this purpose. You can
use a Mac editor to examine sysctl.conf. (Do not use another editor - the file
would be probably be corrupted.)
would probably be corrupted.)
There are two important parameters that you need to consider. shmmax determines the
amount of shared memory that must be allocated for WSJT-X to operate. This is 14680064 (14MB)
and this is defined in the sysctl.conf file and should not be changed.
It is possible to run two instances of WSJT-X simultaneously. See "Section 16.2
Frequently asked Questions" in the User Guide. If you wish to run more than two instances
simultaneously, the sysctl.conf file needs to be modified. Please email me with your
requirements and I will provide a replacement sysctl.conf to suit.
It is possible to run more than one instance of WSJT-X simultaneously. See
"Section 16.2 Frequently asked Questions" in the User Guide. The second important parameter
shmall=17920 determines how many instances are permitted. This is calculated as:
(shmall x 4096/14680064) = 5.
The sysctl.conf file is configured to permit up to 5 instances of wsjtx to run simultaneously.
If this limitation is acceptable then you can continue to install the sysctl.conf file without making any
alterations. Otherwise you must edit the file to increase shmall according to this calculation.
If two instances of WSJT-X are running, it is likely that you might need additional
audio devices, from two rigs for example. Visit Audio MIDI Setup and create an Aggregate Device
which will allow you to specific more than one interface. I recommend you consult Apple's guide
on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000.

21
INSTALL
View File

@ -23,10 +23,10 @@ Building from Source
====================
On Linux systems some of the prerequisite libraries are available in
the mainstream distribution repositories. They are Qt v5 and FFTW v3.
For MS Windows see the section "Building from Source on MS Windows"
below. For Apple Mac see the section "Building from Source on Apple
Mac".
the mainstream distribution repositories. They are Qt v5, FFTW v3, and
the Boost C++ libraries. For MS Windows see the section "Building
from Source on MS Windows" below. For Apple Mac see the section
"Building from Source on Apple Mac".
Qt v5, preferably v5.9 or later is required to build WSJT-X.
@ -43,12 +43,13 @@ the libfftw library development package. Normally installing the
library development package pulls in all the FFTW v3 libraries
including the single precision variant.
The Hamlib library optionally requires the libusb-1.0-1 library, if
the development version (libusb-1.0-0-dev) is available Hamlib will
configure its custom USB device back end drivers. Most rigs do not
require this so normally you can choose not to install libusb-1.0-dev
but if you have a SoftRock USB or similar SDR that uses a custom USB
interface then it is required.
The Hamlib library requires the readline development package and
optionally requires the libusb-1.0-1 library, if the development
version (libusb-1.0-0-dev) is available Hamlib will configure its
custom USB device back end drivers. Most rigs do not require this so
normally you can choose not to install libusb-1.0-dev but if you have
a SoftRock USB or similar SDR that uses a custom USB interface then it
is required.
The Hamlib library is required. Currently WSJT-X needs to be built
using a forked version of the Hamlib git master. This fork contains

View File

@ -18,14 +18,13 @@
#include <boost/log/utility/setup/settings.hpp>
#include <boost/log/sinks/sync_frontend.hpp>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/sinks/debug_output_backend.hpp>
#include <boost/log/support/date_time.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
#include <fstream>
#include <boost/filesystem/fstream.hpp>
#include <string>
namespace fs = boost::filesystem;
namespace logging = boost::log;
namespace srcs = logging::sources;
namespace sinks = logging::sinks;
@ -129,7 +128,7 @@ namespace Logger
CommonInitialization ci;
}
void init_from_config (std::istream& stream)
void init_from_config (std::wistream& stream)
{
CommonInitialization ci;
try
@ -153,24 +152,24 @@ namespace Logger
logging::core::get ()->set_logging_enabled (false);
}
void add_datafile_log (std::string const& log_file_name)
void add_datafile_log (std::wstring const& log_file_name)
{
// Create a text file sink
boost::shared_ptr<sinks::text_ostream_backend> backend
boost::shared_ptr<sinks::wtext_ostream_backend> backend
(
new sinks::text_ostream_backend()
new sinks::wtext_ostream_backend()
);
backend->add_stream (boost::shared_ptr<std::ostream> (new std::ofstream (log_file_name)));
backend->add_stream (boost::shared_ptr<std::wostream> (new fs::wofstream (log_file_name)));
// Flush after each log record
backend->auto_flush (true);
// Create a sink for the backend
typedef sinks::synchronous_sink<sinks::text_ostream_backend> sink_t;
typedef sinks::synchronous_sink<sinks::wtext_ostream_backend> sink_t;
boost::shared_ptr<sink_t> sink (new sink_t (backend));
// The log output formatter
sink->set_formatter (expr::format ("[%1%][%2%] %3%")
sink->set_formatter (expr::format (L"[%1%][%2%] %3%")
% expr::attr<ptime::ptime> ("TimeStamp")
% logging::trivial::severity
% expr::message

View File

@ -21,14 +21,14 @@ namespace Logger
void init ();
// define logger(s) and sinks from a configuration stream
void init_from_config (std::istream& config_stream);
void init_from_config (std::wistream& config_stream);
// disable logging - useful for unit testing etc.
void disable ();
// add a new file sink for LOG_DATA_* for Severity >= INFO
// this file sink will be used alongside any configured above
void add_data_file_log (std::string const& log_file_name);
void add_data_file_log (std::wstring const& log_file_name);
}
#define LOG_LOG_LOCATION(LOGGER, LEVEL, ARG) \

121
NEWS
View File

@ -10,7 +10,126 @@
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
Copyright 2001 - 2020 by Joe Taylor, K1JT.
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.3.0-rc3
Jan 6, 2021
-------------------------
WSJT-X 2.3.0 Release Candidate 3 adds an improved FST4W decoder and
fixes several defects and regressions discovered since the second
release candidate.
- FST4W: Improve FST4W decoder sensitivity on fading channels and
decrease false decode rate.
FST4W uses 50-bit messages and a 24-bit CRC. The 74-bit
message+CRC is encoded into a 240-bit codeword. Received messages
are decoded by two different decoders: (i) a “belief propagation”
(BP) decoder and (ii) an ordered statistics decoder (OSD). The
ordered statistics decoder has a knob that allows any or all CRC
bits to be treated as additional parity bits rather than as part of
the message+CRC field. Thus, the OSD decoder can decode the
received message as a (240,50+Nc) code, where Nc is any integer
between 0 and 24. In the RC1 and RC2 releases the OSD decoding
attempt treated the code as a (240,64) code (14-bit CRC). This
release uses 2 OSD decoding attempts that treat the received word
as (i) a (240,66) code with 16-bit CRC and code rate 0.308 and (ii)
a (240,50) code with no CRC and code rate 0.208. Codewords returned
by the (240,50) CRC-less decoding attempt are unpacked and the
decode is printed only if it contains a callsign/grid pair that
have been previously decoded by the belief propagation decoder
(which treats the code as a (240,74) code with 24-bit CRC) or the
ordered statistics decoder configured for (240,66) (16-bit
CRC). The callsign/grid memory is stored in file “fst4w_calls.txt”
which resides in the data directory.
- FT8: Fixed a crash triggered by double clicking on the waterfall to
invoke a decode of a signal in the preceding T/R interval.
- FST4W: Do not save .c2 files.
- FST4W: Correct a bug that could cause incorrect operation when
using negative noise blanker (NB) percentage to trigger looping
over a range of NB percentages.
- fst4sim: Added simulation of Lorentzian fading spectrum, invoked by
negative fspread values.
- Color highlighting scheme window fixed in dark mode.
- Reports sent by QSO partners to other stations no longer logged in
error.
- UDP Status(1) message now includes the current Tx message.
- Example diagnostic logging configuration files included.
- Use system localization for date fields in Log QSO dialog.
- Improvements to audio input and output buffer sizes.
- wsprd: Fails gracefully if data directory does not exist.
- wsjtx_app_version: new utility to print application version string.
- Regression causing incorrect working frequency selection when
changing modes repaired.
- Regression with QSO initiation with "Best S&P" repaired.
- Updated installation instructions for macOS covering M1 hardware.
- Improved compatibility is Debian 9 required distribution packages.
- Repair regression with missing time-stamps in the ALL.TXT journal.
- Allow hamlib_settings.json to work with PTT only configurations so
that optional PTT sharing on RTS or DTR can be enabled.
- Several improvements to main window sizing and layout.
- Repair regression with OpenSSL libraries being required when LoTW
highlighting is not enabled.
- Repair a defect that caused 2 by 1 callsigns to be incorrectly
parsed as non-standard.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
Nov 16, 2020
-------------------------
WSJT-X 2.3.0 Release Candidate 2 fixes issues found in RC1 and
includes some new functionality that missed the RC1 cut off deadline.
- Dropped audio samples message box removed, warnings and errors for
these are now sent to the WSJT-X system log.
- FST4W spots to WSPRNet.org will be augmented such that the server
can distinguish the mode being spotted. Spots to WSPRNet.org will
no longer be restricted to WSPR sub-bands.
- A new internal system and data logging facility used to provide
trace, debug, information, warning, error, and fatal error
messages. The verbosity and filtering of messages is user definable
via a configuration file. Without a configuration file a basic log
is written with information, warning and error messages only. Log
files are automatically rotated to limit disk usage.
- Due to some users using inappropriate multicast IP addresses for
their interoperating severs the default behaviour now is to only
send multicast UDP datagrams to the loop-back network interface.
Users who require WSJT-X UDP Message Protocol datagrams to reach
other hosts will now have to configure WSJT-X to send on an
appropriate network interface, and use an appropriately scoped
multicast group address for their server applications. If you are
not sure then 224.0.0.1 (or ff02::1 if IPv6 is desired) is a safe
choice.
Release: WSJT-X 2.3.0-rc1

View File

@ -569,7 +569,8 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con
, bool watchdog_timeout, QString const& sub_mode
, bool fast_mode, quint8 special_op_mode
, quint32 frequency_tolerance, quint32 tr_period
, QString const& configuration_name)
, QString const& configuration_name
, QString const& tx_message)
{
if (m_->server_port_ && !m_->server_.isNull ())
{
@ -578,8 +579,9 @@ void MessageClient::status_update (Frequency f, QString const& mode, QString con
out << f << mode.toUtf8 () << dx_call.toUtf8 () << report.toUtf8 () << tx_mode.toUtf8 ()
<< tx_enabled << transmitting << decoding << rx_df << tx_df << de_call.toUtf8 ()
<< de_grid.toUtf8 () << dx_grid.toUtf8 () << watchdog_timeout << sub_mode.toUtf8 ()
<< fast_mode << special_op_mode << frequency_tolerance << tr_period << configuration_name.toUtf8 ();
TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode << "frequency tolerance:" << frequency_tolerance << "T/R period:" << tr_period << "configuration name:" << configuration_name);
<< fast_mode << special_op_mode << frequency_tolerance << tr_period << configuration_name.toUtf8 ()
<< tx_message.toUtf8 ();
TRACE_UDP ("frequency:" << f << "mode:" << mode << "DX:" << dx_call << "report:" << report << "Tx mode:" << tx_mode << "tx_enabled:" << tx_enabled << "Tx:" << transmitting << "decoding:" << decoding << "Rx df:" << rx_df << "Tx df:" << tx_df << "DE:" << de_call << "DE grid:" << de_grid << "DX grid:" << dx_grid << "w/d t/o:" << watchdog_timeout << "sub_mode:" << sub_mode << "fast mode:" << fast_mode << "spec op mode:" << special_op_mode << "frequency tolerance:" << frequency_tolerance << "T/R period:" << tr_period << "configuration name:" << configuration_name << "Tx message:" << tx_message);
m_->send_message (out, message);
}
}

View File

@ -63,7 +63,8 @@ public:
, quint32 rx_df, quint32 tx_df, QString const& de_call, QString const& de_grid
, QString const& dx_grid, bool watchdog_timeout, QString const& sub_mode
, bool fast_mode, quint8 special_op_mode, quint32 frequency_tolerance
, quint32 tr_period, QString const& configuration_name);
, quint32 tr_period, QString const& configuration_name
, QString const& tx_message);
Q_SLOT void decode (bool is_new, QTime time, qint32 snr, float delta_time, quint32 delta_frequency
, QString const& mode, QString const& message, bool low_confidence
, bool off_air);

View File

@ -160,6 +160,7 @@
* Frequency Tolerance quint32
* T/R Period quint32
* Configuration Name utf8
* Tx Message utf8
*
* WSJT-X sends this status message when various internal state
* changes to allow the server to track the relevant state of each
@ -183,7 +184,8 @@
* when the Tx watchdog is set or reset,
* when the frequency tolerance is changed,
* when the T/R period is changed,
* when the configuration name changes.
* when the configuration name changes,
* when the message being transmitted changes.
*
* The Special operation mode is an enumeration that indicates the
* setting selected in the WSJT-X "Settings->Advanced->Special

View File

@ -22,7 +22,7 @@ namespace Radio
QRegularExpression valid_callsign_regexp {R"(\d[[:alpha:]]|[[:alpha:]]\d)"};
// standard callsign
QRegularExpression strict_standard_callsign_re {R"(^([A-Z][0-9]?|[0-9][A-Z])[0-9][A-Z]{0,3}$)"};
QRegularExpression strict_standard_callsign_re {R"(^([A-Z][0-9]?|[0-9A-Z][A-Z])[0-9][A-Z]{0,3}$)"};
// suffixes that are often used and should not be interpreted as a
// DXCC Entity prefix used as a suffix

View File

@ -10,7 +10,94 @@
Copyright 2001 - 2020 by Joe Taylor, K1JT.
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.3.0-rc3
Jan 6, 2021
-------------------------
WSJT-X 2.3.0 Release Candidate 3 adds an improved FST4W decoder and
fixes several defects and regressions discovered since the second
release candidate.
- FST4W: Improve FST4W decoder sensitivity on fading channels and
decrease false decode rate.
FST4W uses 50-bit messages and a 24-bit CRC. The 74-bit
message+CRC is encoded into a 240-bit codeword. Received messages
are decoded by two different decoders: (i) a “belief propagation”
(BP) decoder and (ii) an ordered statistics decoder (OSD). The
ordered statistics decoder has a knob that allows any or all CRC
bits to be treated as additional parity bits rather than as part of
the message+CRC field. Thus, the OSD decoder can decode the
received message as a (240,50+Nc) code, where Nc is any integer
between 0 and 24. In the RC1 and RC2 releases the OSD decoding
attempt treated the code as a (240,64) code (14-bit CRC). This
release uses 2 OSD decoding attempts that treat the received word
as (i) a (240,66) code with 16-bit CRC and code rate 0.308 and (ii)
a (240,50) code with no CRC and code rate 0.208. Codewords returned
by the (240,50) CRC-less decoding attempt are unpacked and the
decode is printed only if it contains a callsign/grid pair that
have been previously decoded by the belief propagation decoder
(which treats the code as a (240,74) code with 24-bit CRC) or the
ordered statistics decoder configured for (240,66) (16-bit
CRC). The callsign/grid memory is stored in file “fst4w_calls.txt”
which resides in the data directory.
- FT8: Fixed a crash triggered by double clicking on the waterfall to
invoke a decode of a signal in the preceding T/R interval.
- FST4W: Do not save .c2 files.
- FST4W: Correct a bug that could cause incorrect operation when
using negative noise blanker (NB) percentage to trigger looping
over a range of NB percentages.
- fst4sim: Added simulation of Lorentzian fading spectrum, invoked by
negative fspread values.
- Color highlighting scheme window fixed in dark mode.
- Reports sent by QSO partners to other stations no longer logged in
error.
- UDP Status(1) message now includes the current Tx message.
- Example diagnostic logging configuration files included.
- Use system localization for date fields in Log QSO dialog.
- Improvements to audio input and output buffer sizes.
- wsprd: Fails gracefully if data directory does not exist.
- wsjtx_app_version: new utility to print application version string.
- Regression causing incorrect working frequency selection when
changing modes repaired.
- Regression with QSO initiation with "Best S&P" repaired.
- Updated installation instructions for macOS covering M1 hardware.
- Improved compatibility is Debian 9 required distribution packages.
- Repair regression with missing time-stamps in the ALL.TXT journal.
- Allow hamlib_settings.json to work with PTT only configurations so
that optional PTT sharing on RTS or DTR can be enabled.
- Several improvements to main window sizing and layout.
- Repair regression with OpenSSL libraries being required when LoTW
highlighting is not enabled.
- Repair a defect that caused 2 by 1 callsigns to be incorrectly
parsed as non-standard.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
@ -45,6 +132,7 @@ includes some new functionality that missed the RC1 cut off deadline.
choice.
Release: WSJT-X 2.3.0-rc1
Sept 28, 2020
-------------------------

View File

@ -259,53 +259,53 @@ HamlibTransceiver::HamlibTransceiver (logger_type * logger,
// rig_->state.obj = this;
if (!is_dummy_)
//
// user defined Hamlib settings
//
auto settings_file_name = QStandardPaths::locate (QStandardPaths::AppConfigLocation
, "hamlib_settings.json");
if (!settings_file_name.isEmpty ())
{
//
// user defined Hamlib settings
//
auto settings_file_name = QStandardPaths::locate (QStandardPaths::AppConfigLocation
, "hamlib_settings.json");
if (!settings_file_name.isEmpty ())
QFile settings_file {settings_file_name};
qDebug () << "Using Hamlib settings file:" << settings_file_name;
if (settings_file.open (QFile::ReadOnly))
{
QFile settings_file {settings_file_name};
qDebug () << "Using Hamlib settings file:" << settings_file_name;
if (settings_file.open (QFile::ReadOnly))
QJsonParseError status;
auto settings_doc = QJsonDocument::fromJson (settings_file.readAll (), &status);
if (status.error)
{
QJsonParseError status;
auto settings_doc = QJsonDocument::fromJson (settings_file.readAll (), &status);
if (status.error)
{
throw error {tr ("Hamlib settings file error: %1 at character offset %2")
.arg (status.errorString ()).arg (status.offset)};
}
qDebug () << "Hamlib settings JSON:" << settings_doc.toJson ();
if (!settings_doc.isObject ())
{
throw error {tr ("Hamlib settings file error: top level must be a JSON object")};
}
auto const& settings = settings_doc.object ();
throw error {tr ("Hamlib settings file error: %1 at character offset %2")
.arg (status.errorString ()).arg (status.offset)};
}
qDebug () << "Hamlib settings JSON:" << settings_doc.toJson ();
if (!settings_doc.isObject ())
{
throw error {tr ("Hamlib settings file error: top level must be a JSON object")};
}
auto const& settings = settings_doc.object ();
//
// configuration settings
//
auto const& config = settings["config"];
if (!config.isUndefined ())
//
// configuration settings
//
auto const& config = settings["config"];
if (!config.isUndefined ())
{
if (!config.isObject ())
{
if (!config.isObject ())
{
throw error {tr ("Hamlib settings file error: config must be a JSON object")};
}
auto const& config_list = config.toObject ();
for (auto item = config_list.constBegin (); item != config_list.constEnd (); ++item)
{
set_conf (item.key ().toLocal8Bit ().constData ()
, (*item).toVariant ().toString ().toLocal8Bit ().constData ());
}
throw error {tr ("Hamlib settings file error: config must be a JSON object")};
}
auto const& config_list = config.toObject ();
for (auto item = config_list.constBegin (); item != config_list.constEnd (); ++item)
{
set_conf (item.key ().toLocal8Bit ().constData ()
, (*item).toVariant ().toString ().toLocal8Bit ().constData ());
}
}
}
}
if (!is_dummy_)
{
switch (rig_->caps->port_type)
{
case RIG_PORT_SERIAL:

View File

@ -5,7 +5,6 @@
#include <QColor>
#include <QtWidgets>
#include <QAction>
#include <QDebug>
#include "validators/MaidenheadLocatorValidator.hpp"
@ -73,7 +72,7 @@ bool ClientWidget::IdFilterModel::filterAcceptsRow (int source_row
, QModelIndex const& source_parent) const
{
auto source_index_col0 = sourceModel ()->index (source_row, 0, source_parent);
return sourceModel ()->data (source_index_col0).value<ClientKey> () == key_;
return sourceModel ()->data (source_index_col0, Qt::UserRole + 1).value<ClientKey> () == key_;
}
void ClientWidget::IdFilterModel::de_call (QString const& call)
@ -148,6 +147,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod
, mode_line_edit_ {new QLineEdit {this}}
, frequency_tolerance_spin_box_ {new QSpinBox {this}}
, tx_mode_label_ {new QLabel {this}}
, tx_message_label_ {new QLabel {this}}
, submode_line_edit_ {new QLineEdit {this}}
, fast_mode_check_box_ {new QCheckBox {this}}
, tr_period_spin_box_ {new QSpinBox {this}}
@ -303,6 +303,7 @@ ClientWidget::ClientWidget (QAbstractItemModel * decodes_model, QAbstractItemMod
// set up status area
status_bar_->addPermanentWidget (de_label_);
status_bar_->addPermanentWidget (tx_mode_label_);
status_bar_->addPermanentWidget (tx_message_label_);
status_bar_->addPermanentWidget (frequency_label_);
status_bar_->addPermanentWidget (tx_df_label_);
status_bar_->addPermanentWidget (report_label_);
@ -401,7 +402,7 @@ void ClientWidget::update_status (ClientKey const& key, Frequency f, QString con
, QString const& de_call, QString const& de_grid, QString const& dx_grid
, bool watchdog_timeout, QString const& submode, bool fast_mode
, quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period
, QString const& configuration_name)
, QString const& configuration_name, QString const& tx_message)
{
if (key == key_)
{
@ -428,8 +429,8 @@ void ClientWidget::update_status (ClientKey const& key, Frequency f, QString con
update_spin_box (frequency_tolerance_spin_box_, frequency_tolerance
, quint32_max == frequency_tolerance ? QString {"n/a"} : QString {});
update_line_edit (submode_line_edit_, submode, false);
tx_mode_label_->setText (QString {"Tx Mode: %1"}
.arg (tx_mode.isEmpty () || tx_mode == mode ? "" : '(' + tx_mode + ')'));
tx_mode_label_->setText (tx_mode.isEmpty () || tx_mode == mode ? "" : "Tx Mode: (" + tx_mode + ')');
tx_message_label_->setText (tx_message.isEmpty () ? "" : "Tx Msg: " + tx_message.trimmed ());
frequency_label_->setText ("QRG: " + Radio::pretty_frequency_MHz_string (f));
update_line_edit (dx_call_line_edit_, dx_call);
update_line_edit (dx_grid_line_edit_, dx_grid);

View File

@ -52,7 +52,7 @@ public:
, QString const& de_call, QString const& de_grid, QString const& dx_grid
, bool watchdog_timeout, QString const& sub_mode, bool fast_mode
, quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period
, QString const& configuration_name);
, QString const& configuration_name, QString const& tx_message);
Q_SLOT void decode_added (bool is_new, ClientKey const& key, QTime, qint32 snr
, float delta_time, quint32 delta_frequency, QString const& mode
, QString const& message, bool low_confidence, bool off_air);
@ -122,6 +122,7 @@ private:
QLineEdit * mode_line_edit_;
QSpinBox * frequency_tolerance_spin_box_;
QLabel * tx_mode_label_;
QLabel * tx_message_label_;
QLineEdit * submode_line_edit_;
QCheckBox * fast_mode_check_box_;
QSpinBox * tr_period_spin_box_;

View File

@ -243,9 +243,11 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
quint32 frequency_tolerance {quint32_max};
quint32 tr_period {quint32_max};
QByteArray configuration_name;
QByteArray tx_message;
in >> f >> mode >> dx_call >> report >> tx_mode >> tx_enabled >> transmitting >> decoding
>> rx_df >> tx_df >> de_call >> de_grid >> dx_grid >> watchdog_timeout >> sub_mode
>> fast_mode >> special_op_mode >> frequency_tolerance >> tr_period >> configuration_name;
>> fast_mode >> special_op_mode >> frequency_tolerance >> tr_period >> configuration_name
>> tx_message;
if (check_status (in) != Fail)
{
Q_EMIT self_->status_update (client_key, f, QString::fromUtf8 (mode)
@ -256,7 +258,8 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
, QString::fromUtf8 (dx_grid), watchdog_timeout
, QString::fromUtf8 (sub_mode), fast_mode
, special_op_mode, frequency_tolerance, tr_period
, QString::fromUtf8 (configuration_name));
, QString::fromUtf8 (configuration_name)
, QString::fromUtf8 (tx_message));
}
}
break;

View File

@ -97,7 +97,7 @@ public:
, QString const& de_call, QString const& de_grid, QString const& dx_grid
, bool watchdog_timeout, QString const& sub_mode, bool fast_mode
, quint8 special_op_mode, quint32 frequency_tolerance, quint32 tr_period
, QString const& configuration_name);
, QString const& configuration_name, QString const& tx_message);
Q_SIGNAL void client_closed (ClientKey const&);
Q_SIGNAL void decode (bool is_new, ClientKey const&, QTime time, qint32 snr, float delta_time
, quint32 delta_frequency, QString const& mode, QString const& message

View File

@ -59,7 +59,7 @@ public:
, QString const& /*de_call*/, QString const& /*de_grid*/, QString const& /*dx_grid*/
, bool /* watchdog_timeout */, QString const& sub_mode, bool /*fast_mode*/
, quint8 /*special_op_mode*/, quint32 /*frequency_tolerance*/, quint32 /*tr_period*/
, QString const& /*configuration_name*/)
, QString const& /*configuration_name*/, QString const& /*tx_message*/)
{
if (key == key_)
{

View File

@ -10,7 +10,6 @@
#include <boost/log/trivial.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/sinks/async_frontend.hpp>
#include <boost/log/sinks/debug_output_backend.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/expressions/formatters/date_time.hpp>
#include <boost/log/expressions/predicates/channel_severity_filter.hpp>
@ -19,6 +18,7 @@
#include <boost/date_time/gregorian/greg_day.hpp>
#include <boost/container/flat_map.hpp>
#include <QtGlobal>
#include <QDir>
#include <QFile>
#include <QTextStream>
@ -35,7 +35,7 @@ namespace trivial = logging::trivial;
namespace keywords = logging::keywords;
namespace expr = logging::expressions;
namespace sinks = logging::sinks;
namespace ptime = boost::posix_time;
namespace posix_time = boost::posix_time;
namespace gregorian = boost::gregorian;
namespace container = boost::container;
@ -60,12 +60,62 @@ namespace
//throw;
}
};
// Reroute Qt messages to the system logger
void qt_log_handler (QtMsgType type, QMessageLogContext const& context, QString const& msg)
{
// Convert Qt message types to logger severities
auto severity = trivial::trace;
switch (type)
{
case QtDebugMsg: severity = trivial::debug; break;
case QtInfoMsg: severity = trivial::info; break;
case QtWarningMsg: severity = trivial::warning; break;
case QtCriticalMsg: severity = trivial::error; break;
case QtFatalMsg: severity = trivial::fatal; break;
}
// Map non-default Qt categories to logger channels, Qt logger
// context is mapped to the appropriate logger attributes.
auto log = sys::get ();
std::string file;
std::string function;
if (context.file)
{
file = context.file;
}
if (context.function)
{
function = context.function;
}
if (!context.category || !qstrcmp (context.category, "default"))
{
BOOST_LOG_SEV (log, severity)
<< boost::log::add_value ("Line", context.line)
<< boost::log::add_value ("File", file)
<< boost::log::add_value ("Function", function)
<< msg.toStdWString ();
}
else
{
BOOST_LOG_SEV (log, severity)
<< boost::log::add_value ("Line", context.line)
<< boost::log::add_value ("File", file)
<< boost::log::add_value ("Function", function)
<< context.category << ": " << msg.toStdWString ();
}
if (QtFatalMsg == type)
{
// bail out
throw std::runtime_error {"Fatal Qt Error"};
}
}
}
WSJTXLogging::WSJTXLogging ()
{
auto core = logging::core::get ();
// Catch relevant exceptions from logging.
logging::core::get ()->set_exception_handler
core->set_exception_handler
(
logging::make_exception_handler<std::runtime_error, std::logic_error> (exception_handler {})
);
@ -105,8 +155,8 @@ WSJTXLogging::WSJTXLogging ()
pos = match.capturedEnd (0);
}
new_config += config.mid (pos);
std::stringbuf buffer {new_config.toStdString (), std::ios_base::in};
std::istream stream {&buffer};
std::wstringbuf buffer {new_config.toStdWString (), std::ios_base::in};
std::wistream stream {&buffer};
Logger::init_from_config (stream);
LOG_INFO ("Read logging configuration file: " << log_config.fileName ());
}
@ -120,7 +170,6 @@ WSJTXLogging::WSJTXLogging ()
// Default log file location.
QDir app_data {QStandardPaths::writableLocation (QStandardPaths::AppLocalDataLocation)};
Logger::init (); // Basic setup of attributes
auto core = logging::core::get ();
//
// Sink intended for general use that passes everything above
@ -131,7 +180,7 @@ WSJTXLogging::WSJTXLogging ()
(
keywords::auto_flush = false
#if BOOST_VERSION / 100 >= 1070
, keywords::file_name = app_data.absoluteFilePath ("wsjtx_syslog.log").toStdString ()
, keywords::file_name = app_data.absoluteFilePath ("wsjtx_syslog.log").toStdWString ()
, keywords::target_file_name =
#else
, keywords::file_name =
@ -139,7 +188,9 @@ WSJTXLogging::WSJTXLogging ()
app_data.absoluteFilePath ("logs/wsjtx_syslog_%Y-%m.log").toStdString ()
, keywords::time_based_rotation = sinks::file::rotation_at_time_point (gregorian::greg_day (1), 0, 0, 0)
, keywords::open_mode = std::ios_base::out | std::ios_base::app
#if BOOST_VERSION / 100 >= 1063
, keywords::enable_final_rotation = false
#endif
);
sys_sink->locked_backend ()->set_file_collector
@ -149,7 +200,7 @@ WSJTXLogging::WSJTXLogging ()
keywords::max_size = 40 * 1024 * 1024
, keywords::min_free_space = 1024 * 1024 * 1024
, keywords::max_files = 12
, keywords::target = app_data.absoluteFilePath ("logs").toStdString ()
, keywords::target = app_data.absoluteFilePath ("logs").toStdWString ()
)
);
sys_sink->locked_backend ()->scan_for_files ();
@ -166,77 +217,24 @@ WSJTXLogging::WSJTXLogging ()
(
expr::stream
<< "[" << channel
<< "][" << expr::format_date_time<ptime::ptime> ("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
<< "][" << expr::format_date_time<ptime::time_duration> ("Uptime", "%O:%M:%S.%f")
<< "][" << expr::format_date_time<posix_time::ptime> ("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
<< "][" << expr::format_date_time<posix_time::time_duration> ("Uptime", "%O:%M:%S.%f")
<< "][" << trivial::severity
<< "] " << expr::message
);
core->add_sink (sys_sink);
#if !defined (NDEBUG) && defined (Q_OS_WIN)
// auto windbg_sink = boost::make_shared<sinks::synchronous_sink<sinks::debug_output_backend>> ();
// windbg_sink->set_filter (trivial::severity >= trivial::trace && expr::is_debugger_present ());
// core->add_sink (windbg_sink);
#endif
}
// Indicate start of logging
LOG_INFO ("Log Start");
::qInstallMessageHandler (&qt_log_handler);
}
WSJTXLogging::~WSJTXLogging ()
{
LOG_INFO ("Log Finish");
auto lg = logging::core::get ();
lg->flush ();
lg->remove_all_sinks ();
}
// Reroute Qt messages to the system logger
void WSJTXLogging::qt_log_handler (QtMsgType type, QMessageLogContext const& context, QString const& msg)
{
// Convert Qt message types to logger severities
auto severity = trivial::trace;
switch (type)
{
case QtDebugMsg: severity = trivial::debug; break;
case QtInfoMsg: severity = trivial::info; break;
case QtWarningMsg: severity = trivial::warning; break;
case QtCriticalMsg: severity = trivial::error; break;
case QtFatalMsg: severity = trivial::fatal; break;
}
// Map non-default Qt categories to logger channels, Qt logger
// context is mapped to the appropriate logger attributes.
auto log = sys::get ();
std::string file;
std::string function;
if (context.file)
{
file = context.file;
}
if (context.function)
{
function = context.function;
}
if (!context.category || !qstrcmp (context.category, "default"))
{
BOOST_LOG_SEV (log, severity)
<< boost::log::add_value ("Line", context.line)
<< boost::log::add_value ("File", file)
<< boost::log::add_value ("Function", function)
<< msg.toStdString ();
}
else
{
BOOST_LOG_CHANNEL_SEV (log, std::string {context.category}, severity)
<< boost::log::add_value ("Line", context.line)
<< boost::log::add_value ("File", file)
<< boost::log::add_value ("Function", function)
<< msg.toStdString ();
}
if (QtFatalMsg == type)
{
// bail out
throw std::runtime_error {"Fatal Qt Error"};
}
auto core = logging::core::get ();
core->flush ();
core->remove_all_sinks ();
}

View File

@ -1,10 +1,6 @@
#ifndef WSJTX_LOGGING_HPP__
#define WSJTX_LOGGING_HPP__
#include <QtGlobal>
class QString;
//
// Class WSJTXLogging - wraps application specific logging
//
@ -13,14 +9,6 @@ class WSJTXLogging final
public:
explicit WSJTXLogging ();
~WSJTXLogging ();
//
// Install this as the Qt message handler (qInstallMessageHandler)
// to integrate Qt messages. This handler can be installed at any
// time, it does not rely on an instance of WSJTXLogging existing,
// so logging occurring before the logging sinks, filters, and
// formatters, etc, are established can take place.
static void qt_log_handler (QtMsgType type, QMessageLogContext const& context, QString const&);
};
#endif

View File

@ -197,7 +197,7 @@ function (document)
-a data-uri!
-a VERSION_MAJOR=${WSJTX_VERSION_MAJOR}
-a VERSION_MINOR=${WSJTX_VERSION_MINOR}
-a VERSION_PATCH=${WSJTX_VERSION_PATCH}
-a VERSION_PATCH=${WSJTX_VERSION_PATCH}${BUILD_TYPE_REVISION}
-a VERSION=${wsjtx_VERSION}
-D ${CMAKE_CURRENT_BINARY_DIR}
-o ${_docbook_file} ${_source_name}

View File

@ -43,7 +43,7 @@ CMake
-----
Download and install a recent version from the official CMake web
site. A default installation is fine. I am currently using v3.18.3,
site. A default installation is fine. I am currently using v3.18.4,
versions as old as v3.9 should work.
Other tools and libraries without installers
@ -59,8 +59,10 @@ FFTW v3 DFT library
-------------------
The MS Windows builds of FFTW3 can be downloaded from
http://www.fftw.org/install/windows.html and unzipped into C:\Tools.
You only need the 64-bit package.
http://www.fftw.org/install/windows.html. The ZIP archives for this
package have no directory structure so create a directory under C:\
Tools\ called fftw-3.3.5-dll64 and unzip the archive there. You only
need the 64-bit package.
libusb library
--------------

View File

@ -82,12 +82,12 @@ Common steps
Download and extract the latest Boost library sources, at the time of
writing that was
https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.7z
. Extract to some convenient location, I use %HOME%\src .
. Extract to some convenient location, I use %USERPROFILE%\src .
Download and extract the libbacktrace sources from
https://github.com/ianlancetaylor/libbacktrace as follows.
cd %HOME%\src
cd %USERPROFILE%\src
mkdir github.com
cd github.com
mkdir ianlancetaylor
@ -101,8 +101,8 @@ names are unique per architecture and tool-chain. This saves a lot of
space as the boost header files are quite big, and there's no need to
install multiple copies.
Create a new file %HOME%\src\boost_1_74_0\project-config.jam with the
following three lines to specify how Boost.Build finds the
Create a new file %USERPROFILE%\src\boost_1_74_0\project-config.jam
with the following three lines to specify how Boost.Build finds the
libbacktrace library matched to your relevant C++ compliers:
import toolset ;
@ -133,13 +133,15 @@ tool-chain bundled with your Qt binary installation. Verify the
correct compiler is in the PATH. i.e. it identifies (g++ --version) as
i686-posix-dwarf-rev0.
cd %HOME%\src\boost_1_74_0\tools\build
cd %USERPROFILE%\src\boost_1_74_0\tools\build
bootstrap.bat mingw
.\b2 --prefix=C:\Tools\boost-build\MinGW32 install
cd ..\..
C:\Tools\boost-build\MinGW32\bin\b2 -j8 toolset=gcc ^
--build-dir=%HOME%\build\boost ^
--build-type=complete --prefix=C:\Tools\boost install
--build-dir=%USERPROFILE%\build\boost ^
address-model=32 architecture=x86 variant=debug,release ^
link=shared threading=multi ^
--with-log --with-stacktrace --prefix=C:\Tools\boost install
If all is well you should see the following line about a 1/3 of the
way through the initial configuration steps.
@ -156,7 +158,7 @@ warnings can usually be ignored. If successful; you can release some
space by cleaning the build tree:
C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc ^
--build-dir=%HOME%\build\boost ^
--build-dir=%USERPROFILE%\build\boost ^
--build-type=complete clean
64-bit
@ -179,13 +181,16 @@ compilers and the project-config.jam file you created above. With a v7
gcc-8~64. My example matches my 64-bit Qt v5.15.0 with the bundled
MinGW64 v8.1.0.
cd %HOME%\src\boost_1_74_0\tools\build
bootstrap.bat
cd %USERPROFILE%\src\boost_1_74_0\tools\build
bootstrap.bat mingw
.\b2 --prefix=C:\Tools\boost-build\MinGW64 install
cd ..\..
C:\Tools\boost-build\MinGW64\bin\b2 -j8 toolset=gcc-8~64 ^
address-model=64 --build-dir=%HOME%\build\boost ^
--build-type=complete --prefix=C:\Tools\boost install
address-model=64 architecture=x86 variant=debug,release ^
link=shared threading=multi ^
--with-log --with-stacktrace ^
--build-dir=%USERPROFILE%\build\boost ^
--prefix=C:\Tools\boost install
If all is well you should see the following line about a 1/3 of the
way through the initial configuration steps.
@ -202,9 +207,8 @@ warnings can usually be ignored. If successful; you can release some
space by cleaning the build tree:
C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc-8~64 ^
address-model=64 --build-dir=%HOME%\build\boost ^
address-model=64 --build-dir=%USERPROFILE%\build\boost ^
--build-type=complete clean
Run-time Environment
--------------------
@ -226,15 +230,12 @@ configuration tool-chain file:
# ...
set (BOOSTDIR C:/Tools/boost)
set (QTDIR C:/Qt/5.12.9/mingw73_32)
# set (QTDIR C:/Qt/5.15.0/mingw81_32)
set (QTDIR C:/Qt/5.15.2/mingw81_32)
set (FFTWDIR C:/Tools/fftw-3.3.5-dll32)
set (HAMLIBDIR C:/test-install/hamlib/mingw32/debug)
set (LIBUSBDIR C:/Tools/libusb-1.0.23)
set (PYTHONDIR C:/Python27)
set (ASCIIDOCDIR C:/Tools/asciidoc-master)
# where to find required packages
set (CMAKE_PREFIX_PATH ${BOOSTDIR} ${QTDIR} ${FFTWDIR} ${HAMLIBDIR} ${HAMLIBDIR}/bin ${LIBUSBDIR} ${PYTHONDIR} ${ASCIIDOCDIR})
set (CMAKE_PREFIX_PATH ${BOOSTDIR} ${QTDIR} ${FFTWDIR} ${HAMLIBDIR} ${HAMLIBDIR}/bin ${LIBUSBDIR})
# ...

View File

@ -43,7 +43,8 @@ You may also need to execute the following command in a terminal:
....
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
libqt5sql5-sqlite libfftw3-single3 libgomp1 libusb-1.0-0
libqt5sql5-sqlite libfftw3-single3 libgomp1 libboost-all-dev \
libusb-1.0-0
....
Fedora, CentOS, Red Hat, and other rpm-based systems:
@ -75,5 +76,5 @@ You may also need to execute the following command in a terminal:
....
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
qt5-qtserialport libgomp libusbx
qt5-qtserialport libgomp boost libusbx
....

View File

@ -0,0 +1,5 @@
Example WSJT-X Logging Configuration Files
==========================================
Here you will find some typical loggin configuration files. Pick a
suitable one and copy it to the WSJT-X log files directory.

View File

@ -0,0 +1,14 @@
#
# Example logging confguration file to send records to the console terminal
#
[Core]
# Set DisableLogging to true to disable all logging.
DisableLogging="false"
[Sinks.Console]
Destination="Console"
Asynchronous="false"
AutoFlush="true"
Format="[%TimeStamp(format=\"%H:%M:%S.%f\")%][%Channel%:%Severity%] %Message%"
Filter="(%Channel% matches \"SYSLOG\" & %Severity% >= trace) | (%Channel% matches \"RIGCTRL\" & %Severity% >= info)"

View File

@ -0,0 +1,15 @@
#
# Example WSJT-X logging configuration for sending records to the
# attached Windows debugger (e.g. gdb)
#
[Core]
# Set DisableLogging to true to disable all logging.
DisableLogging="false"
[Sinks.Debugger]
Destination="Debugger"
Asynchronous="false"
AutoFlush="true"
Format="[%TimeStamp(format=\"%H:%M:%S.%f\")%][%Channel%][%Severity%] %File%(%Line%) %Function%: %Message%"
Filter="(%Channel% matches \"SYSLOG\" & %Severity% >= debug) | (%Channel% matches \"RIGCTRL\" & %Severity% >= info)"

View File

@ -0,0 +1,25 @@
[Sinks.SYSLOG]
Destination=TextFile
Asynchronous=true
AutoFlush=false
FileName="${AppLocalDataLocation}/wsjtx_syslog.log"
TargetFileName="${AppLocalDataLocation}/logs/wsjtx_syslog_%Y-%m.log"
RotationTimePoint="01 00:00:00"
Append=true
EnableFinalRotation=false
MaxSize=41943040
MinFreeSpace=1073741824
MaxFiles=12
Target="${AppLocalDataLocation}/logs"
ScanForFiles="Matching"
Format="[%Channel%][%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Severity%] %Message%"
Filter="%Severity% >= info"
[Sinks.RIGCTRL]
Destination=TextFile
Asynchronous=true
AutoFlush=true
FileName="${DesktopLocation}/WSJT-X_RigControl.log"
Append=true
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Channel%:%Severity%] %Message%"
Filter="%Channel% matches \"RIGCTRL\" | %Severity% >= info"

View File

@ -0,0 +1,14 @@
[Sinks.SYSLOG]
Destination="TextFile"
Asynchronous="true"
AutoFlush="true"
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Channel%][%Severity%] %File%(%Line%) %Function%: %Message%"
RotationTimePoint="11:42:00"
Target="${AppLocalDataLocation}/logs"
FileName="${AppLocalDataLocation}/wsjtx_syslog.log"
TargetFileName="${AppLocalDataLocation}/logs/wsjtx_syslog_%Y-%m_%3N.log"
Append="true"
EnableFinalRotation="false"
ScanForFiles="Matching"
MaxSize=1073741824
MaxFiles="10"

View File

@ -25,6 +25,8 @@ subroutine decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw,ntype,nharder
include "ldpc_240_74_parity.f90"
maxiterations=30
if(Keff.eq.50) maxiterations=1
nosd=0
if(maxosd.gt.3) maxosd=3
if(maxosd.eq.0) then ! osd with channel llrs
@ -36,6 +38,8 @@ subroutine decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw,ntype,nharder
nosd=0
endif
if(maxosd.eq.0) goto 73
toc=0
tov=0
tanhtoc=0
@ -133,9 +137,11 @@ subroutine decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw,ntype,nharder
enddo ! bp iterations
73 continue
do i=1,nosd
zn=zsave(:,i)
call osd240_74(zn,Keff,apmask,norder,message74,cw,nharderror,dminosd)
! call osd240_74(zn,Keff,apmask,norder,message74,cw,nharderror,dminosd)
call fastosd240_74(zn,Keff,apmask,norder,message74,cw,nharderror,dminosd)
if(nharderror.gt.0) then
hdec=0
where(llr .ge. 0) hdec=1

291
lib/fst4/fastosd240_74.f90 Normal file
View File

@ -0,0 +1,291 @@
subroutine fastosd240_74(llr,k,apmask,ndeep,message74,cw,nhardmin,dmin)
!
! An ordered-statistics decoder for the (240,74) code.
! Message payload is 50 bits. Any or all of a 24-bit CRC can be
! used for detecting incorrect codewords. The remaining CRC bits are
! cascaded with the LDPC code for the purpose of improving the
! distance spectrum of the code.
!
! If p1 (0.le.p1.le.24) is the number of CRC24 bits that are
! to be used for bad codeword detection, then the argument k should
! be set to 77+p1.
!
! Valid values for k are in the range [50,74].
!
character*24 c24
integer, parameter:: N=240
integer*1 apmask(N),apmaskr(N)
integer*1, allocatable, save :: gen(:,:)
integer*1, allocatable :: genmrb(:,:),g2(:,:)
integer*1, allocatable :: temp(:),temprow(:),m0(:),me(:),mi(:)
integer indices(N),indices2(N),nxor(N)
integer*1 cw(N),ce(N),c0(N),hdec(N)
integer*1, allocatable :: decoded(:)
integer*1 message74(74)
integer*1, allocatable :: sp(:)
integer indx(N),ksave
real llr(N),rx(N),absrx(N)
logical first
data first/.true./,ksave/64/
save first,ksave
allocate( genmrb(k,N), g2(N,k) )
allocate( temp(k), temprow(n), m0(k), me(k), mi(k) )
allocate( decoded(k) )
if( first .or. k.ne.ksave) then ! fill the generator matrix
!
! Create generator matrix for partial CRC cascaded with LDPC code.
!
! Let p2=74-k and p1+p2=24.
!
! The last p2 bits of the CRC24 are cascaded with the LDPC code.
!
! The first p1=k-50 CRC24 bits will be used for error detection.
!
if( allocated(gen) ) deallocate(gen)
allocate( gen(k,N) )
gen=0
do i=1,k
message74=0
message74(i)=1
if(i.le.50) then
call get_crc24(message74,74,ncrc24)
write(c24,'(b24.24)') ncrc24
read(c24,'(24i1)') message74(51:74)
message74(51:k)=0
endif
call encode240_74(message74,cw)
gen(i,:)=cw
enddo
first=.false.
ksave=k
endif
! Use best k elements from the sorted list for the first basis. For the 2nd basis replace
! the nswap lowest quality symbols with the best nswap elements from the parity symbols.
nswap=20
do ibasis=1,2
rx=llr
apmaskr=apmask
! Hard decisions on the received word.
hdec=0
where(rx .ge. 0) hdec=1
! Use magnitude of received symbols as a measure of reliability.
absrx=abs(llr)
call indexx(absrx,N,indx)
! Re-order the columns of the generator matrix in order of decreasing reliability.
do i=1,N
genmrb(1:k,i)=gen(1:k,indx(N+1-i))
indices(i)=indx(N+1-i)
enddo
if(ibasis.eq.2) then
do i=k-nswap+1,k
temp(1:k)=genmrb(1:k,i)
genmrb(1:k,i)=genmrb(1:k,i+nswap)
genmrb(1:k,i+nswap)=temp(1:k)
itmp=indices(i)
indices(i)=indices(i+nswap)
indices(i+nswap)=itmp
enddo
endif
! Do gaussian elimination to create a generator matrix with the most reliable
! received bits in positions 1:k in order of decreasing reliability (more or less).
icol=1
indices2=0
nskipped=0
do id=1,k
iflag=0
do while(iflag.eq.0)
if(genmrb(id,icol).ne.1) then
do j=id+1,k
if(genmrb(j,icol).eq.1) then
temprow=genmrb(id,:)
genmrb(id,:)=genmrb(j,:)
genmrb(j,:)=temprow
iflag=1
endif
enddo
if(iflag.eq.0) then ! skip this column
nskipped=nskipped+1
indices2(k+nskipped)=icol ! put icol where skipped columns go
icol=icol+1 ! look at the next column
endif
else
iflag=1
endif
enddo
indices2(id)=icol
do j=1,k
if(id.ne.j .and. genmrb(j,icol).eq.1) then
genmrb(j,:)=ieor(genmrb(id,:),genmrb(j,:))
endif
enddo
icol=icol+1
enddo
do i=k+nskipped+1,240
indices2(i)=i
enddo
genmrb(1:k,:)=genmrb(1:k,indices2)
indices=indices(indices2)
!************************************
g2=transpose(genmrb)
! The hard decisions for the k MRB bits define the order 0 message, m0.
! Encode m0 using the modified generator matrix to find the "order 0" codeword.
! Flip various combinations of bits in m0 and re-encode to generate a list of
! codewords. Return the member of the list that has the smallest Euclidean
! distance to the received word.
hdec=hdec(indices) ! hard decisions from received symbols
m0=hdec(1:k) ! zero'th order message
absrx=abs(llr)
absrx=absrx(indices)
rx=rx(indices)
apmaskr=apmaskr(indices)
call mrbencode74(m0,c0,g2,N,k)
nxor=ieor(c0,hdec)
nhardmin=sum(nxor)
dmin=sum(nxor*absrx)
np=32
if(ibasis.eq.1) allocate(sp(np))
cw=c0
ntotal=0
nrejected=0
if(ndeep.eq.0) goto 998 ! norder=0
if(ndeep.gt.4) ndeep=4
if( ndeep.eq. 1) then
nord=1
xlambda=0.0
nsyncmax=np
elseif(ndeep.eq.2) then
nord=2
xlambda=0.0
nsyncmax=np
elseif(ndeep.eq.3) then
nord=3
xlambda=4.0
nsyncmax=11
elseif(ndeep.eq.4) then
nord=4
xlambda=3.4
nsyndmax=12
endif
s1=sum(absrx(1:k))
s2=sum(absrx(k+1:N))
rho=s1/(s1+xlambda*s2)
rhodmin=rho*dmin
nerr64=-1
do iorder=1,nord
!beta=0.0
!if(iorder.ge.3) beta=0.4
!spnc_order=sum(absrx(k-iorder+1:k))+beta*(N-k)
!if(dmin.lt.spnc_order) cycle
mi(1:k-iorder)=0
mi(k-iorder+1:k)=1
iflag=k-iorder+1
do while(iflag .ge.0)
ntotal=ntotal+1
me=ieor(m0,mi)
d1=sum(mi(1:k)*absrx(1:k))
if(d1.gt.rhodmin) exit
call partial_syndrome(me,sp,np,g2,N,K)
nwhsp=sum(ieor(sp(1:np),hdec(k:k+np-1)))
if(nwhsp.le.nsyndmax) then
call mrbencode74(me,ce,g2,N,k)
nxor=ieor(ce,hdec)
dd=sum(nxor*absrx(1:N))
if( dd .lt. dmin ) then
dmin=dd
rhodmin=rho*dmin
cw=ce
nhardmin=sum(nxor)
nwhspmin=nwhsp
nerr64=sum(nxor(1:K))
endif
endif
! Get the next test error pattern, iflag will go negative
! when the last pattern with weight iorder has been generated.
call nextpat74(mi,k,iorder,iflag)
enddo
enddo
998 continue
! Re-order the codeword to [message bits][parity bits] format.
cw(indices)=cw
hdec(indices)=hdec
message74=cw(1:74)
call get_crc24(message74,74,nbadcrc)
if(nbadcrc.eq.0) exit
nhardmin=-nhardmin
enddo ! basis loop
return
end subroutine fastosd240_74
subroutine mrbencode74(me,codeword,g2,N,K)
integer*1 me(K),codeword(N),g2(N,K)
! fast encoding for low-weight test patterns
codeword=0
do i=1,K
if( me(i) .eq. 1 ) then
codeword=ieor(codeword,g2(1:N,i))
endif
enddo
return
end subroutine mrbencode74
subroutine partial_syndrome(me,sp,np,g2,N,K)
integer*1 me(K),sp(np),g2(N,K)
! compute partial syndrome
sp=0
do i=1,K
if( me(i) .eq. 1 ) then
sp=ieor(sp,g2(K:K+np-1,i))
endif
enddo
return
end subroutine partial_syndrome
subroutine nextpat74(mi,k,iorder,iflag)
integer*1 mi(k),ms(k)
! generate the next test error pattern
ind=-1
do i=1,k-1
if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i
enddo
if( ind .lt. 0 ) then ! no more patterns of this order
iflag=ind
return
endif
ms=0
ms(1:ind-1)=mi(1:ind-1)
ms(ind)=1
ms(ind+1)=0
if( ind+1 .lt. k ) then
nz=iorder-sum(ms)
ms(k-nz+1:k)=1
endif
mi=ms
do i=1,k ! iflag will point to the lowest-index 1 in mi
if(mi(i).eq.1) then
iflag=i
exit
endif
enddo
return
end subroutine nextpat74

View File

@ -19,10 +19,10 @@ program fst4sim
! Get command-line argument(s)
nargs=iargc()
if(nargs.ne.10) then
print*,'Need 10 arguments, got ',nargs
print*,'Usage: fst4sim "message" TRsec f0 DT h fdop del nfiles snr W'
print*,'Examples: fst4sim "K1JT K9AN EN50" 60 1500 0.0 1 0.1 1.0 10 -15 F'
if(nargs.ne.9) then
print*,'Need 9 arguments, got ',nargs
print*,'Usage: fst4sim "message" TRsec f0 DT fdop del nfiles snr W'
print*,'Examples: fst4sim "K1JT K9AN EN50" 60 1500 0.0 0.1 1.0 10 -15 F'
print*,'W (T or F) argument is hint to encoder to use WSPR message when there is abiguity'
go to 999
endif
@ -34,16 +34,14 @@ program fst4sim
call getarg(4,arg)
read(arg,*) xdt !Time offset from nominal (s)
call getarg(5,arg)
read(arg,*) hmod !Modulation index, h
call getarg(6,arg)
read(arg,*) fspread !Watterson frequency spread (Hz)
call getarg(7,arg)
call getarg(6,arg)
read(arg,*) delay !Watterson delay (ms)
call getarg(8,arg)
call getarg(7,arg)
read(arg,*) nfiles !Number of files
call getarg(9,arg)
call getarg(8,arg)
read(arg,*) snrdb !SNR_2500
call getarg(10,arg)
call getarg(9,arg)
read(arg,*) wspr_hint !0:break ties as 77-bit 1:break ties as 50-bit
nfiles=abs(nfiles)
@ -89,8 +87,8 @@ program fst4sim
call genfst4(msg37,0,msgsent37,msgbits,itone,iwspr)
write(*,*)
write(*,'(a9,a37,a3,L2,a7,i2)') 'Message: ',msgsent37,'W:',wspr_hint,' iwspr:',iwspr
write(*,1000) f00,xdt,hmod,txt,snrdb
1000 format('f0:',f9.3,' DT:',f6.2,' hmod:',i6,' TxT:',f6.1,' SNR:',f6.1)
write(*,1000) f00,xdt,txt,snrdb
1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1)
write(*,*)
if(i3.eq.1) then
write(*,*) ' mycall hiscall hisgrid'
@ -106,7 +104,8 @@ program fst4sim
! call sgran()
fsample=12000.0
fsample=12000.0
hmod=1
icmplx=1
f0=f00+1.5*hmod*baud
call gen_fst4wave(itone,NN,nsps,nwave,fsample,hmod,f0,icmplx,c0,wave)
@ -118,7 +117,8 @@ program fst4sim
do ifile=1,nfiles
c=c0
if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c,nwave,NZ,fs,delay,fspread)
if(fspread.gt.0.0 .or. delay.ne.0.0) call watterson(c,nwave,NZ,fs,delay,fspread)
if(fspread.lt.0.0) call lorentzian_fading(c,nwave,fs,-fspread)
c=sig*c
wave=real(c)
if(snrdb.lt.90) then

View File

@ -101,7 +101,7 @@ write(*,'(24i1)') msgbits(51:74)
llr=2.0*rxdata/(ss*ss)
apmask=0
dmin=0.0
maxosd=0
maxosd=2
call decode240_74(llr, Keff, maxosd, norder, apmask, message74, cw, ntype, nharderror, dmin)
if(nharderror.ge.0) then
n2err=0

View File

@ -0,0 +1,43 @@
subroutine lorentzian_fading(c,npts,fs,fspread)
!
! npts is the total length of the simulated data vector
!
complex c(0:npts-1)
complex cspread(0:npts-1)
complex z
twopi=8.0*atan(1.0)
df=fs/npts
nh=npts/2
cspread(0)=1.0
cspread(nh)=0.
b=6.0
do i=1,nh
f=i*df
x=b*f/fspread
z=0.
a=0.
if(x.lt.3.0) then
a=sqrt(1.111/(1.0+x*x)-0.1)
phi1=twopi*rran()
z=a*cmplx(cos(phi1),sin(phi1))
endif
cspread(i)=z
z=0.
if(x.lt.3.0) then
phi2=twopi*rran()
z=a*cmplx(cos(phi2),sin(phi2))
endif
cspread(npts-i)=z
enddo
call four2a(cspread,npts,1,1,1)
s=sum(abs(cspread)**2)
avep=s/npts
fac=sqrt(1.0/avep)
cspread=fac*cspread
c=cspread*c
return
end subroutine lorentzian_fading

View File

@ -33,15 +33,17 @@ contains
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lagain,lapcqonly,mycall, &
hiscall,iwspr)
use prog_args
use timer_module, only: timer
use packjt77
use, intrinsic :: iso_c_binding
include 'fst4/fst4_params.f90'
parameter (MAXCAND=100)
parameter (MAXCAND=100,MAXWCALLS=100)
class(fst4_decoder), intent(inout) :: this
procedure(fst4_decode_callback) :: callback
character*37 decodes(100)
character*37 msg,msgsent
character*20 wcalls(MAXWCALLS), wpart
character*77 c77
character*12 mycall,hiscall
character*12 mycall0,hiscall0
@ -56,8 +58,7 @@ contains
logical lagain,lapcqonly
integer itone(NN)
integer hmod
integer ipct(0:7)
integer*1 apmask(240),cw(240)
integer*1 apmask(240),cw(240),hdec(240)
integer*1 message101(101),message74(74),message77(77)
integer*1 rvec(77)
integer apbits(240)
@ -66,11 +67,12 @@ contains
integer mcq(29),mrrr(19),m73(19),mrr73(19)
logical badsync,unpk77_success,single_decode
logical first,nohiscall,lwspr,ex
logical first,nohiscall,lwspr
logical new_callsign,plotspec_exists,wcalls_exists,do_k50_decode
logical decdata_exists
integer*2 iwave(30*60*12000)
data ipct/0,8,14,4,12,2,10,6/
data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/
data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/
data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/
@ -80,6 +82,7 @@ contains
0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/
data first/.true./,hmod/1/
save first,apbits,nappasses,naptypes,mycall0,hiscall0
save wcalls,nwcalls
this%callback => callback
dxcall13=hiscall ! initialize for use in packjt77
@ -88,6 +91,20 @@ contains
if(iwspr.ne.0.and.iwspr.ne.1) return
if(first) then
! read the fst4_calls.txt file
inquire(file=trim(data_dir)//'/fst4w_calls.txt',exist=wcalls_exists)
if( wcalls_exists ) then
open(42,file=trim(data_dir)//'/fst4w_calls.txt',status='unknown')
do i=1,MAXWCALLS
wcalls(i)=''
read(42,fmt='(a)',end=2867) wcalls(i)
wcalls(i)=adjustl(wcalls(i))
if(len(trim(wcalls(i))).eq.0) exit
enddo
2867 nwcalls=i-1
close(42)
endif
mcq=2*mod(mcq+rvec(1:29),2)-1
mrrr=2*mod(mrrr+rvec(59:77),2)-1
m73=2*mod(m73+rvec(59:77),2)-1
@ -213,17 +230,22 @@ contains
allocate( cframe(0:160*nss-1) )
jittermax=2
do_k50_decode=.false.
if(ndepth.eq.3) then
nblock=4
jittermax=2
do_k50_decode=.true.
elseif(ndepth.eq.2) then
nblock=3
jittermax=0
nblock=4
jittermax=2
do_k50_decode=.false.
elseif(ndepth.eq.1) then
nblock=1
nblock=4
jittermax=0
do_k50_decode=.false.
endif
! Noise blanker setup
ndropmax=1
single_decode=iand(nexp_decode,32).ne.0
npct=0
@ -239,33 +261,40 @@ contains
inb2=1 !Try NB = 0, 1, 2,... 20%
else
inb1=0 !Fixed NB value, 0 to 25%
ipct(0)=npct
endif
! nfa,nfb: define the noise-baseline analysis window
! fa, fb: define the signal search window
! We usually make nfa<fa and nfb>fb so that noise baseline analysis
! window extends outside of the [fa,fb] window where we think the signals are.
!
if(iwspr.eq.1) then !FST4W
!300 Hz wide noise-fit window
nfa=max(100,nint(nfqso+1.5*baud-150))
nfb=min(4800,nint(nfqso+1.5*baud+150))
nfa=max(100,nfqso-ntol-100)
nfb=min(4800,nfqso+ntol+100)
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
fb=min(4800,nint(nfqso+1.5*baud+ntol))
else if(single_decode) then
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
else
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
else if(iwspr.eq.0) then
if(single_decode) then
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
else
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
endif
endif
ndecodes=0
decodes=' '
new_callsign=.false.
do inb=0,inb1,inb2
if(nb.lt.0) npct=inb
if(nb.lt.0) npct=inb ! we are looping over blanker settings
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
! The big fft is done once and is used for calculating the smoothed spectrum
@ -275,23 +304,22 @@ contains
nsyncoh=8
minsync=1.20
if(ntrperiod.eq.15) minsync=1.15
! Get first approximation of candidate frequencies
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
minsync,ncand,candidates0)
minsync,ncand,candidates0)
isbest=0
fc2=0.
do icand=1,ncand
fc0=candidates0(icand,1)
if(iwspr.eq.0 .and. nb.lt.0 .and. npct.ne.0 .and. &
abs(fc0-(nfqso+1.5*baud)).gt.ntol) cycle
abs(fc0-(nfqso+1.5*baud)).gt.ntol) cycle ! blanker loop only near nfqso
detmet=candidates0(icand,2)
! Downconvert and downsample a slice of the spectrum centered on the
! rough estimate of the candidates frequency.
! Output array c2 is complex baseband sampled at 12000/ndown Sa/sec.
! The size of the downsampled c2 array is nfft2=nfft1/ndown
call timer('dwnsmpl ',0)
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
call timer('dwnsmpl ',1)
@ -330,9 +358,9 @@ contains
endif
enddo
ncand=ic
! If FST4 and Single Decode is not checked, then find candidates within
! 20 Hz of nfqso and put them at the top of the list
! If FST4 mode and Single Decode is not checked, then find candidates
! within 20 Hz of nfqso and put them at the top of the list
if(iwspr.eq.0 .and. .not.single_decode) then
nclose=count(abs(candidates0(:,3)-(nfqso+1.5*baud)).le.20)
k=0
@ -368,12 +396,13 @@ contains
if(ijitter.eq.1) ioffset=1
if(ijitter.eq.2) ioffset=-1
is0=isbest+ioffset
if(is0.lt.0) cycle
cframe=c2(is0:is0+160*nss-1)
iend=is0+160*nss-1
if( is0.lt.0 .or. iend.gt.(nfft2-1) ) cycle
cframe=c2(is0:iend)
bitmetrics=0
call timer('bitmetrc',0)
call get_fst4_bitmetrics(cframe,nss,nblock,nhicoh,bitmetrics, &
s4,nsync_qual,badsync)
s4,nsync_qual,badsync)
call timer('bitmetrc',1)
if(badsync) cycle
@ -384,10 +413,10 @@ contains
llrs(181:240,il)=bitmetrics(245:304, il)
enddo
apmag=maxval(abs(llrs(:,1)))*1.1
apmag=maxval(abs(llrs(:,4)))*1.1
ntmax=nblock+nappasses(nQSOProgress)
if(lapcqonly) ntmax=nblock+1
if(ndepth.eq.1) ntmax=nblock
if(ndepth.eq.1) ntmax=nblock ! no ap for ndepth=1
apmask=0
if(iwspr.eq.1) then ! 50-bit msgs, no ap decoding
@ -405,7 +434,7 @@ contains
iaptype=0
endif
if(itry.gt.nblock) then ! do ap passes
if(itry.gt.nblock .and. iwspr.eq.0) then ! do ap passes
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
iaptype=naptypes(nQSOProgress,itry-nblock)
if(lapcqonly) iaptype=1
@ -428,7 +457,7 @@ contains
apmask(1:58)=1
llr(1:58)=apmag*apbits(1:58)
endif
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype .eq.6) then
apmask=0
apmask(1:77)=1
@ -438,7 +467,7 @@ contains
if(iaptype.eq.6) llr(59:77)=apmag*mrr73(1:19)
endif
endif
dmin=0.0
nharderrors=-1
unpk77_success=.false.
@ -448,83 +477,142 @@ contains
norder=3
call timer('d240_101',0)
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
cw,ntype,nharderrors,dmin)
cw,ntype,nharderrors,dmin)
call timer('d240_101',1)
elseif(iwspr.eq.1) then
maxosd=2
call timer('d240_74 ',0)
Keff=64
norder=4
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
ntype,nharderrors,dmin)
call timer('d240_74 ',1)
endif
if(nharderrors .ge.0) then
if(count(cw.eq.1).eq.0) then
nharderrors=-nharderrors
cycle
endif
if(iwspr.eq.0) then
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
call unpack77(c77,1,msg,unpk77_success)
else
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
call unpack77(c77,1,msg,unpk77_success)
elseif(iwspr.eq.1) then
! Try decoding with Keff=66
maxosd=2
call timer('d240_74 ',0)
Keff=66
norder=3
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
ntype,nharderrors,dmin)
call timer('d240_74 ',1)
if(nharderrors.lt.0) goto 3465
if(count(cw.eq.1).eq.0) then
nharderrors=-nharderrors
cycle
endif
write(c77,'(50i1)') message74(1:50)
c77(51:77)='000000000000000000000110000'
call unpack77(c77,1,msg,unpk77_success)
if(unpk77_success .and. do_k50_decode) then
! If decode was obtained with Keff=66, save call/grid in fst4w_calls.txt if not there already.
i1=index(msg,' ')
i2=i1+index(msg(i1+1:),' ')
wpart=trim(msg(1:i2))
! Only save callsigns/grids from type 1 messages
if(index(wpart,'/').eq.0 .and. index(wpart,'<').eq.0) then
ifound=0
do i=1,nwcalls
if(index(wcalls(i),wpart).ne.0) ifound=1
enddo
if(ifound.eq.0) then ! This is a new callsign
new_callsign=.true.
if(nwcalls.lt.MAXWCALLS) then
nwcalls=nwcalls+1
wcalls(nwcalls)=wpart
else
wcalls(1:nwcalls-1)=wcalls(2:nwcalls)
wcalls(nwcalls)=wpart
endif
endif
endif
endif
3465 continue
! If no decode then try Keff=50
iaptype=0
if( .not. unpk77_success .and. do_k50_decode ) then
maxosd=1
call timer('d240_74 ',0)
Keff=50
norder=4
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
ntype,nharderrors,dmin)
call timer('d240_74 ',1)
if(count(cw.eq.1).eq.0) then
nharderrors=-nharderrors
cycle
endif
write(c77,'(50i1)') message74(1:50)
c77(51:77)='000000000000000000000110000'
call unpack77(c77,1,msg,unpk77_success)
! No CRC in this mode, so only accept the decode if call/grid have been seen before
if(unpk77_success) then
unpk77_success=.false.
do i=1,nwcalls
if(index(msg,trim(wcalls(i))).gt.0) then
unpk77_success=.true.
endif
enddo
endif
endif
if(unpk77_success) then
idupe=0
do i=1,ndecodes
if(decodes(i).eq.msg) idupe=1
enddo
if(idupe.eq.1) goto 800
ndecodes=ndecodes+1
decodes(ndecodes)=msg
if(iwspr.eq.0) then
call get_fst4_tones_from_bits(message101,itone,0)
else
call get_fst4_tones_from_bits(message74,itone,1)
endif
inquire(file='plotspec',exist=ex)
fmid=-999.0
call timer('dopsprd ',0)
if(ex) then
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
isbest,fc_synced,fmid,w50)
endif
call timer('dopsprd ',1)
xsig=0
do i=1,NN
xsig=xsig+s4(itone(i),i)
enddo
base=candidates(icand,5)
arg=600.0*(xsig/base)-1.0
if(arg.gt.0.0) then
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
if(ntrperiod.eq. 15) xsnr=xsnr+2
if(ntrperiod.eq. 30) xsnr=xsnr+1
if(ntrperiod.eq. 900) xsnr=xsnr+1
if(ntrperiod.eq.1800) xsnr=xsnr+2
else
xsnr=-99.9
endif
endif
if(nharderrors .ge.0 .and. unpk77_success) then
idupe=0
do i=1,ndecodes
if(decodes(i).eq.msg) idupe=1
enddo
if(idupe.eq.1) goto 800
ndecodes=ndecodes+1
decodes(ndecodes)=msg
if(iwspr.eq.0) then
call get_fst4_tones_from_bits(message101,itone,0)
else
cycle
call get_fst4_tones_from_bits(message74,itone,1)
endif
inquire(file='plotspec',exist=plotspec_exists)
fmid=-999.0
call timer('dopsprd ',0)
if(plotspec_exists) then
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
isbest,fc_synced,fmid,w50)
endif
call timer('dopsprd ',1)
xsig=0
do i=1,NN
xsig=xsig+s4(itone(i),i)
enddo
base=candidates(icand,5)
arg=600.0*(xsig/base)-1.0
if(arg.gt.0.0) then
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
if(ntrperiod.eq. 15) xsnr=xsnr+2
if(ntrperiod.eq. 30) xsnr=xsnr+1
if(ntrperiod.eq. 900) xsnr=xsnr+1
if(ntrperiod.eq.1800) xsnr=xsnr+2
else
xsnr=-99.9
endif
nsnr=nint(xsnr)
qual=0.
qual=0.0
fsig=fc_synced - 1.5*baud
if(ex) then
inquire(file=trim(data_dir)//'/decdata',exist=decdata_exists)
if(decdata_exists) then
hdec=0
where(llrs(:,1).ge.0.0) hdec=1
nhp=count(hdec.ne.cw) ! # hard errors wrt N=1 soft symbols
hd=sum(ieor(hdec,cw)*abs(llrs(:,1))) ! weighted distance wrt N=1 symbols
open(21,file=trim(data_dir)//'/fst4_decodes.dat',status='unknown',position='append')
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
ijitter,ntype,nsync_qual,nharderrors,dmin, &
sync,xsnr,xdt,fsig,w50,trim(msg)
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
flush(21)
ijitter,npct,ntype,Keff,nsync_qual,nharderrors,dmin,nhp,hd, &
sync,xsnr,xdt,fsig,w50,trim(msg)
3021 format(i6.6,i4,6i3,3i4,f6.1,i4,f6.1,f9.2,f6.1,f6.2,f7.1,f7.3,1x,a)
close(21)
endif
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
iaptype,qual,ntrperiod,lwspr,fmid,w50)
iaptype,qual,ntrperiod,lwspr,fmid,w50)
if(iwspr.eq.0 .and. nb.lt.0) go to 900
goto 800
endif
@ -532,9 +620,17 @@ contains
enddo ! istart jitter
800 enddo !candidate list
enddo ! noise blanker loop
if(new_callsign .and. do_k50_decode) then ! re-write the fst4w_calls.txt file
open(42,file=trim(data_dir)//'/fst4w_calls.txt',status='unknown')
do i=1,nwcalls
write(42,'(a20)') trim(wcalls(i))
enddo
close(42)
endif
900 return
end subroutine decode
end subroutine decode
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
@ -726,8 +822,8 @@ contains
do i=ina,inb !Compute CCF of s() and 4 tones
s2(i)=s(i-hmod*3) + s(i-hmod) +s(i+hmod) +s(i+hmod*3)
enddo
npct=30
call fst4_baseline(s2,nnw,ina+hmod*3,inb-hmod*3,npct,sbase)
npctile=30
call fst4_baseline(s2,nnw,ina+hmod*3,inb-hmod*3,npctile,sbase)
if(any(sbase(ina:inb).le.0.0)) return
s2(ina:inb)=s2(ina:inb)/sbase(ina:inb) !Normalize wrt noise level
@ -902,6 +998,6 @@ contains
enddo
return
end subroutine dopspread
end subroutine dopspread
end module fst4_decode

View File

@ -35,8 +35,19 @@ subroutine get_spectrum_baseline(dd,nfa,nfb,sbase)
savg=savg + s(1:NH1,j) !Average spectrum
enddo
if(nfa.lt.100) nfa=100
if(nfb.gt.4910) nfb=4910
nwin=nfb-nfa
if(nfa.lt.100) then
nfa=100
if(nwin.lt.100) then ! nagain
nfb=nfa+nwin
endif
endif
if(nfb.gt.4910) then
nfb=4910
if(nwin.lt.100) then
nfa=nfb-nwin
endif
endif
call baseline(savg,nfa,nfb,sbase)
return

View File

@ -118,7 +118,7 @@ contains
dd1=dd
go to 900
endif
if(nzhsym.eq.50 .and. ndec_early.ge.1) then
if(nzhsym.eq.50 .and. ndec_early.ge.1 .and. .not.nagain) then
n=47*3456
dd(1:n)=dd1(1:n)
dd(n+1:)=iwave(n+1:)
@ -131,9 +131,10 @@ contains
endif
ifa=nfa
ifb=nfb
if(nagain) then
ifa=nfqso-10
ifb=nfqso+10
if(nzhsym.eq.50 .and. nagain) then
dd=iwave
ifa=nfqso-20
ifb=nfqso+20
endif
! For now:

View File

@ -26,3 +26,9 @@ float gran_()
iset++;
return v2*fac;
}
/* Generates evenly distributed numbers between 0 and 1. */
float rran_()
{
return (float)rand()/(float)RAND_MAX;
}

View File

@ -71,7 +71,7 @@ unsigned long readc2file(char *ptr_to_infile, float *idat, float *qdat,
float *buffer;
double dfreq;
int i,ntrmin;
char *c2file[15];
char c2file[15];
size_t nr;
FILE* fp;
@ -875,10 +875,12 @@ int main(int argc, char *argv[])
}
}
if( stackdecoder ) {
stack=calloc(stacksize,sizeof(struct snode));
if( access(data_dir, R_OK | W_OK)) {
fprintf(stderr, "Error: inaccessible data directory: '%s'\n", data_dir);
usage();
return EXIT_FAILURE;
}
if( optind+1 > argc) {
usage();
return 1;
@ -886,6 +888,10 @@ int main(int argc, char *argv[])
ptr_to_infile=argv[optind];
}
if( stackdecoder ) {
stack=calloc(stacksize,sizeof(struct snode));
}
// setup metric table
for(i=0; i<256; i++) {
mettab[0][i]=round( 10*(metric_tables[2][i]-bias) );

View File

@ -76,7 +76,13 @@ namespace
switch (static_cast<QMetaType::Type> (v.type ()))
{
case QMetaType::QByteArray:
os << "0x" << v.toByteArray ().toHex (':').toStdString ();
os << "0x"
#if QT_VERSION >= QT_VERSION_CHECK (5, 9, 0)
<< v.toByteArray ().toHex (':').toStdString ()
#else
<< v.toByteArray ().toHex ().toStdString ()
#endif
;
break;
case QMetaType::QBitArray:
@ -98,7 +104,6 @@ namespace
int main(int argc, char *argv[])
{
::qInstallMessageHandler (&WSJTXLogging::qt_log_handler);
init_random_seed ();
// make the Qt type magic happen
@ -205,7 +210,9 @@ int main(int argc, char *argv[])
multiple = true;
}
// now we have the application name we can open the settings
// now we have the application name we can open the logging and settings
WSJTXLogging lg;
LOG_INFO (program_title (revision ()) << " - Program startup");
MultiSettings multi_settings {parser.value (cfg_option)};
// find the temporary files path
@ -241,9 +248,6 @@ int main(int argc, char *argv[])
}
}
WSJTXLogging lg;
LOG_INFO (program_title (revision ()) << " - Program startup");
// load UI translations
L10nLoader l10n {&a, locale, parser.value (lang_option)};

View File

@ -580,6 +580,7 @@ auto FrequencyList_v2::impl::frequency_list (FrequencyItems frequency_list) -> F
return frequency_list;
}
// add a frequency returning the new model index
QModelIndex FrequencyList_v2::impl::add (Item f)
{
// Any Frequency that isn't in the list may be added

View File

@ -634,7 +634,8 @@ Format:
<location filename="../Configuration.cpp" line="2835"/>
<source>Not found</source>
<comment>audio device missing</comment>
<translation type="unfinished"></translation>
<translatorcomment>falta un dispositiu d&apos;àudio</translatorcomment>
<translation>No trobat</translation>
</message>
</context>
<context>
@ -2712,12 +2713,12 @@ Si no està marcat, pots veure els resultats de la calibració.</translation>
<message>
<location filename="../widgets/mainwindow.ui" line="1297"/>
<source>F High </source>
<translation type="unfinished"></translation>
<translation>F Alt </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1388"/>
<source>F Low </source>
<translation type="unfinished"></translation>
<translation>F Baixa </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1410"/>
@ -2964,12 +2965,12 @@ La llista es pot mantenir a la configuració (F2).</translation>
<message>
<location filename="../widgets/mainwindow.ui" line="3390"/>
<source>SWL Mode</source>
<translation type="unfinished"></translation>
<translation>Mode SWL</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="3393"/>
<source>Hide lower panel controls to maximize deocde windows</source>
<translation type="unfinished"></translation>
<translation>Amaga els controls del panell inferior per a maximitzar les finestres de descodificació</translation>
</message>
<message>
<source>Calling CQ </source>
@ -3868,7 +3869,7 @@ La llista es pot mantenir a la configuració (F2).</translation>
<message>
<location filename="../widgets/mainwindow.cpp" line="492"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation type="unfinished"></translation>
<translation>Mostres caigudes excessives - %1 (%2 sec) fotogrames d&apos;àudio caiguts en el període inicial %3</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="526"/>
@ -3893,7 +3894,7 @@ La llista es pot mantenir a la configuració (F2).</translation>
<message>
<location filename="../widgets/mainwindow.cpp" line="790"/>
<source>Enumerating audio devices</source>
<translation type="unfinished"></translation>
<translation>Enumeració de dispositius dàudio</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="805"/>
@ -4079,9 +4080,9 @@ La llista es pot mantenir a la configuració (F2).</translation>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation>Si fas un ús raonable de qualsevol part de WSJT-X segons els termes de la Llicència Pública General de GNU, has de mostrar de manera destacada el següent avís de copyright en el teu treball derivat:
&quot;Els algoritmes, codi font, aspecte de WSJT-X i programes relacionats i les especificacions de protocol per als modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 són Copyright (C) 2001-2020 per un o més dels següents autors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q i altres membres del grup de desenvolupament de WSJT. &quot;</translation>
&quot;Els algoritmes, codi font, aspecte de WSJT-X i programes relacionats i les especificacions de protocol per als modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 són Copyright (C) 2001-2021 per un o més dels següents autors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q i altres membres del grup de desenvolupament de WSJT. &quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2846"/>

View File

@ -20,8 +20,8 @@
<location filename="../widgets/AbstractLogWindow.cpp" line="65"/>
<source>Are you sure you want to delete the %n selected QSO(s) from the log?</source>
<translation>
<numerusform>Er du sikker at du vil slette de %n valgte QSO(er) fra loggen?</numerusform>
<numerusform></numerusform>
<numerusform>Sikker du vil slette de %n valgte QSO(er) fra loggen?</numerusform>
<numerusform>Er du sikker du vil slette de %n valgte QSO(s) fra loggen?</numerusform>
</translation>
</message>
</context>
@ -247,7 +247,7 @@
<message>
<location filename="../widgets/CabrilloLogWindow.ui" line="20"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Right-click here for available actions.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt; &lt;p&gt; Højreklik her for tilgængelige muligheder. &lt;/p&gt; &lt;/body&gt; &lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; Højreklik her for tilgængelige muligheder.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../widgets/CabrilloLogWindow.ui" line="23"/>
@ -318,7 +318,7 @@
<message>
<location filename="../widgets/colorhighlighting.ui" line="150"/>
<source>New Call</source>
<translation>Ny kaldesignal</translation>
<translation>Nyt kaldesignal</translation>
</message>
<message>
<location filename="../widgets/colorhighlighting.ui" line="157"/>
@ -626,7 +626,7 @@ Format:
<location filename="../Configuration.cpp" line="2835"/>
<source>Not found</source>
<comment>audio device missing</comment>
<translation type="unfinished"></translation>
<translation>Audio device mangler</translation>
</message>
</context>
<context>
@ -2197,7 +2197,7 @@ Fejl(%2): %3</translation>
<message>
<location filename="../widgets/mainwindow.ui" line="495"/>
<source>&amp;Decode</source>
<translation>&amp;Dekod</translation>
<translation>&amp;Dekode</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="511"/>
@ -2492,7 +2492,7 @@ Gul er for lavt</translation>
<location filename="../widgets/mainwindow.ui" line="1337"/>
<location filename="../widgets/mainwindow.ui" line="2992"/>
<source>Fast</source>
<translation>Fast</translation>
<translation>Hurtig</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1344"/>
@ -2711,12 +2711,12 @@ Når den ikke er markeret, kan du se kalibreringsresultaterne.</translation>
<message>
<location filename="../widgets/mainwindow.ui" line="1297"/>
<source>F High </source>
<translation type="unfinished"></translation>
<translation>F Høj </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1388"/>
<source>F Low </source>
<translation type="unfinished"></translation>
<translation>F Lav </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1410"/>
@ -2964,12 +2964,12 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<message>
<location filename="../widgets/mainwindow.ui" line="3390"/>
<source>SWL Mode</source>
<translation type="unfinished"></translation>
<translation>SWL Mode</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="3393"/>
<source>Hide lower panel controls to maximize deocde windows</source>
<translation type="unfinished"></translation>
<translation>Skjul nederste del af Control Panel for at maksimere dekoder vinduet</translation>
</message>
<message>
<source>Calling CQ </source>
@ -3864,7 +3864,8 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<message>
<location filename="../widgets/mainwindow.cpp" line="492"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation type="unfinished"></translation>
<translatorcomment>For store tabte prøver -% 1 (% 2 sek) lydrammer faldt i perioden startende med% 3</translatorcomment>
<translation>For stort tab i - %1 (%2 sec) audio frames stoppet i periode startende %3</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="526"/>
@ -3889,7 +3890,7 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<message>
<location filename="../widgets/mainwindow.cpp" line="790"/>
<source>Enumerating audio devices</source>
<translation type="unfinished"></translation>
<translation>Opsumering af audio enheder</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="805"/>
@ -4075,9 +4076,9 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation>Hvis du gør brug af nogen del af WSJT-X under betingelserne i GNU General Public License, skal du vise følgende copyright-meddelelse fremtrædende i din egen udgave:
&quot;Algoritmerne, kildekoden, udseendet og funktionen af WSJT-X og relaterede programmer og protokolspecifikationer for Mode FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 er Copyright (C) 2001-2020 af en eller flere af følgende forfattere: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; og andre medlemmer af WSJT Development Group. &quot;</translation>
&quot;Algoritmerne, kildekoden, udseendet og funktionen af WSJT-X og relaterede programmer og protokolspecifikationer for Mode FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 er Copyright (C) 2001-2021 af en eller flere af følgende forfattere: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; og andre medlemmer af WSJT Development Group. &quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2846"/>
@ -4147,7 +4148,57 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Alt+Z &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Clear hung decoder status&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</source>
<extracomment>Keyboard shortcuts help window contents</extracomment>
<translation type="unfinished"></translation>
<translatorcomment>Hjælpetekst til Tastetur genveje</translatorcomment>
<translation>&lt;tabelcelleafstand = 1&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Esc &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Stop Tx, afbryd QSO, ryd kø ved næste kald &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F1 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Online brugervejledning (Alt: transmitter Tx6) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + F1 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Meddelelse om ophavsret &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F1 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Om WSJT-X &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F2 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Åbn indstillingsvinduet (Alt: send Tx2) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F3 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Vis tastaturgenveje (Alt: transmitter Tx3) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F4 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Ryd DX Call, DX Grid, Tx meddelelser 1-4 (Alt: send Tx4) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + F4 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Afslutningsprogram &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F5 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Vis specielle musekommandoer (Alt: transmitter Tx5) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F6 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Åbn næste fil i biblioteket (Alt: skift &quot;Call 1st&quot;) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + F6 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Dekod alle resterende filer i biblioteket &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F7 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Vis vindue for gennemsnitsmeddelelse &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Rx-frekvensen ned 1 Hz &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt identiske Rx- og Tx-frekvenser ned 1 Hz &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Tx-frekvensen 60 Hz ned (FT8) eller 90 Hz (FT4) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + Shift + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt kaldefrekvensen 2000 Hz ned &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Rx-frekvensen 1 Hz op &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt identiske Rx- og Tx-frekvenser 1 Hz op &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt identiske Rx- og Tx-frekvenser ned 1 Hz &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Tx-frekvensen ned 60 Hz (FT8) eller 90 Hz (FT4) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + Shift + F11 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt kaldefrekvensen ned 2000 Hz &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Rx-frekvensen op 1 Hz &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt identiske Rx- og Tx-frekvenser 1 Hz op &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt Tx-frekvensen 60 Hz op (FT8) eller 90 Hz (FT4) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + Shift + F12 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Flyt kaldefrekvensen 2000 Hz op&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + 1-6 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Indstil NU transmission til dette nummer på fane 1 &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctl + 1-6 &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Indstil næste transmission til dette nummer på fane 1 &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + B &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Skift status &quot;Bedste S + P&quot; &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + C &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Skift afkrydsningsfelt &quot;Kald 1st&quot; &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + D &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Dekod igen ved QSO-frekvens &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + D &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Fuld Dekodning (begge vinduer) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + E &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Aktiver TX lige / 1. &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Shift + E &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Deaktiver TX lige / 1. &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + E &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Sætning&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + F &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Rediger fri tekstmeddelelsesfelt &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + G &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Generer standardmeddelelser &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + H &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Stop Tx &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + L &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Opslag af kaldesignal i database, generer standardbeskeder &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + M &lt;/b&gt;&lt;/td&gt;&lt;td&gt; Skærm&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + N &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Aktivér Tx &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + O &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Åbn en .wav-fil &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + O &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Skift operatør &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + Q &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Log QSO &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Ctrl + R &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Indstil Tx4-besked til RRR (ikke i FT4) &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + R &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Indstil Tx4-besked til RR73 &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + S &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Stop overvågning &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + T &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Skift Tune status &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;&lt;td&gt; &lt;b&gt; Alt + Z &lt;/b&gt;&lt;/td&gt; &lt;td&gt; Ryd fyldt buffer dekoderstatus &lt;/td&gt; &lt;/tr&gt;
&lt;/tabel&gt;</translation>
</message>
<message>
<source>&lt;table cellspacing=1&gt;
@ -5527,7 +5578,7 @@ Fejl(%2): %3</translation>
<message>
<location filename="../Configuration.ui" line="400"/>
<source>Monitor returns to last used frequency</source>
<translation>Montor til seneste brugte frekvens</translation>
<translation>Monitor til seneste brugte frekvens</translation>
</message>
<message>
<location filename="../Configuration.ui" line="407"/>
@ -5622,7 +5673,7 @@ den stille periode, når dekodningen er udført.</translation>
<location filename="../Configuration.ui" line="581"/>
<location filename="../Configuration.ui" line="584"/>
<source>Serial Port Parameters</source>
<translation>Seriek Port Parametre</translation>
<translation>Seriel Port Parametre</translation>
</message>
<message>
<location filename="../Configuration.ui" line="595"/>
@ -5723,7 +5774,7 @@ den stille periode, når dekodningen er udført.</translation>
<location filename="../Configuration.ui" line="729"/>
<location filename="../Configuration.ui" line="780"/>
<source>Default</source>
<translation>Deafult</translation>
<translation>Default</translation>
</message>
<message>
<location filename="../Configuration.ui" line="742"/>

View File

@ -3831,7 +3831,7 @@ list. The list can be maintained in Settings (F2).</source>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>

View File

@ -3831,7 +3831,7 @@ list. The list can be maintained in Settings (F2).</source>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>

View File

@ -2904,13 +2904,13 @@ Amarillo cuando esta muy bajo.</translation>
<location filename="../widgets/mainwindow.ui" line="1586"/>
<source>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</source>
<translatorcomment>Marca a TX en minutos o secuencias de números pares, a partir de 0; desmarca las secuencias impares.</translatorcomment>
<translation>Marcar para transmitir en secuencias o minutos pares, comenzando por 0; desmarca para transmitir en las secuencias o minutos impares.</translation>
<translation type="unfinished">Marcar para transmitir en secuencias o minutos pares, comenzando por 0; desmarca para transmitir en las secuencias o minutos impares.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1589"/>
<source>Tx even/1st</source>
<translatorcomment>Alternar periodo TX Par/Impar</translatorcomment>
<translation>TX segundo par</translation>
<translation type="unfinished">Tx primer par/1ro</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1481"/>
@ -4411,13 +4411,13 @@ Error al cargar datos de usuarios de LotW</translatorcomment>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translatorcomment>Si haces un uso justo de cualquier parte de WSJT-X bajo los términos de la Licencia Pública General de GNU, debes mostrar el siguiente aviso de copyright de manera destacada en trabajo derivado:
&quot;Los algoritmos, el código fuente, la apariencia de WSJT-X y los programas relacionados, y las especificaciones del protocolo para los modos FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 son Copyright (C) 2001-2020 por uno o más de los siguientes autores: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q y otros miembros del Grupo de Desarrollo WSJT &quot;.</translatorcomment>
&quot;Los algoritmos, el código fuente, la apariencia de WSJT-X y los programas relacionados, y las especificaciones del protocolo para los modos FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 son Copyright (C) 2001-2021 por uno o más de los siguientes autores: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q y otros miembros del Grupo de Desarrollo WSJT &quot;.</translatorcomment>
<translation>Si haces un uso justo de cualquier parte de WSJT-X bajo los términos de la Licencia Pública General de GNU, debes mostrar el siguiente aviso de derechos de autor (copyright) de manera destacada en tu trabajo derivado:
&quot;Los algoritmos, el código fuente, la apariencia y comportamiento del WSJT-X y los programas relacionados, y las especificaciones del protocolo para los modos FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 son Copyright (C) 2001-2020 por uno o más de los siguientes autores: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q y otros miembros del Grupo de Desarrollo WSJT &quot;.</translation>
&quot;Los algoritmos, el código fuente, la apariencia y comportamiento del WSJT-X y los programas relacionados, y las especificaciones del protocolo para los modos FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 son Copyright (C) 2001-2021 por uno o más de los siguientes autores: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q y otros miembros del Grupo de Desarrollo WSJT &quot;.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2846"/>

View File

@ -4063,10 +4063,10 @@ elenco. L&apos;elenco può essere gestito in Impostazioni (F2).</translation>
<location filename="../widgets/mainwindow.cpp" line="2544"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation>Se si utilizza in modo equo qualsiasi parte di WSJT-X in base ai termini della GNU General Public License, è necessario visualizzare in modo evidente la seguente nota sul copyright nell&apos;opera derivata:
&quot;Gli algoritmi, il codice sorgente, l&apos;aspetto di WSJT-X e dei relativi programmi e le specifiche del protocollo per le modalità FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 sono Copyright (C) 2001-2020 di uno o più dei seguenti autori: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q e altri membri del WSJT Development Group. &quot;</translation>
&quot;Gli algoritmi, il codice sorgente, l&apos;aspetto di WSJT-X e dei relativi programmi e le specifiche del protocollo per le modalità FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 sono Copyright (C) 2001-2021 di uno o più dei seguenti autori: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q e altri membri del WSJT Development Group. &quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2812"/>

View File

@ -625,7 +625,7 @@ Format:
<location filename="../Configuration.cpp" line="2835"/>
<source>Not found</source>
<comment>audio device missing</comment>
<translation type="unfinished"></translation>
<translation></translation>
</message>
</context>
<context>
@ -2703,12 +2703,12 @@ When not checked you can view the calibration results.</source>
<message>
<location filename="../widgets/mainwindow.ui" line="1297"/>
<source>F High </source>
<translation type="unfinished"></translation>
<translation>F </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1388"/>
<source>F Low </source>
<translation type="unfinished"></translation>
<translation>F </translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1410"/>
@ -2962,12 +2962,12 @@ ENTERを押してテキストを登録リストに追加.
<message>
<location filename="../widgets/mainwindow.ui" line="3390"/>
<source>SWL Mode</source>
<translation type="unfinished"></translation>
<translation>SWLモード</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="3393"/>
<source>Hide lower panel controls to maximize deocde windows</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<source>Calling CQ </source>
@ -3825,7 +3825,7 @@ ENTERを押してテキストを登録リストに追加.
<message>
<location filename="../widgets/mainwindow.cpp" line="492"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation type="unfinished"></translation>
<translation> - %3%1(%2</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="526"/>
@ -3850,7 +3850,7 @@ ENTERを押してテキストを登録リストに追加.
<message>
<location filename="../widgets/mainwindow.cpp" line="790"/>
<source>Enumerating audio devices</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="805"/>
@ -4032,7 +4032,7 @@ ENTERを押してテキストを登録リストに追加.
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation></translation>
</message>
<message>

View File

@ -388,7 +388,7 @@
<message>
<location filename="../Configuration.cpp" line="1009"/>
<source>path: &quot;%1%</source>
<translation>: &quot;%1%</translation>
<translation>: &quot;%1%</translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1020"/>
@ -504,7 +504,12 @@ Format:
<translation> ARRL RTTY Roundup </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2169"/>
<location filename="../Configuration.cpp" line="1870"/>
<source>Pending DNS lookup, please try again later</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2213"/>
<source>Reset Decode Highlighting</source>
<translation></translation>
</message>
@ -519,7 +524,17 @@ Format:
<translation>WSJT-X </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2357"/>
<location filename="../Configuration.cpp" line="2425"/>
<source>UDP server DNS lookup failed</source>
<translation>UDP服务器域名系统查找失败</translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2449"/>
<source>MAC-ambiguous multicast groups addresses not supported</source>
<translation>访</translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2467"/>
<source>Load Working Frequencies</source>
<translation></translation>
</message>
@ -2670,12 +2685,12 @@ Not available to nonstandard callsign holders.</source>
<message>
<location filename="../widgets/mainwindow.ui" line="1269"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Submode determines tone spacing; A is narrowest.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;調; A .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;; A .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1272"/>
<source>Submode determines tone spacing; A is narrowest.</source>
<translation>調; A .</translation>
<translation>; A .</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="1278"/>
@ -3664,12 +3679,12 @@ list. The list can be maintained in Settings (F2).</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="487"/>
<location filename="../widgets/mainwindow.cpp" line="492"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation> - %1 (%2 sec) %3</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="521"/>
<location filename="../widgets/mainwindow.cpp" line="526"/>
<source>Error Scanning ADIF Log</source>
<translation> ADIF </translation>
</message>
@ -3870,16 +3885,16 @@ list. The list can be maintained in Settings (F2).</source>
<translation>&quot;fmt.all&quot; &quot;fmt.bak&quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2551"/>
<location filename="../widgets/mainwindow.cpp" line="2571"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation> GNU 使 WSJT-X , :
&quot;WSJT-X , , , FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 (C) 2001-2019 由以下一个或多个作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; WSJT .&quot;</translation>
&quot;WSJT-X , , , FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 (C) 2001-2021 由以下一个或多个作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; WSJT .&quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<location filename="../widgets/mainwindow.cpp" line="2846"/>
<source>No data read from disk. Wrong file format?</source>
<translation>. ?</translation>
</message>
@ -3899,42 +3914,7 @@ list. The list can be maintained in Settings (F2).</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2949"/>
<source>Special Mouse Commands</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3295"/>
<source>No more files to open.</source>
<translation>.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3659"/>
<source>Spotting to PSK Reporter unavailable</source>
<translation>PSK Reporter</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3817"/>
<source>Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m.</source>
<translation>. WSJT-X WSPR 30.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3821"/>
<source>WSPR Guard Band</source>
<translation>WSPR保护波段</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3834"/>
<source>Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands.</source>
<translation>. WSJT-X FT8 .</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3838"/>
<source>Fox Mode warning</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2866"/>
<location filename="../widgets/mainwindow.cpp" line="2893"/>
<source>&lt;table cellspacing=1&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Esc &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Stop Tx, abort QSO, clear next-call queue&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F1 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Online User&apos;s Guide (Alt: transmit Tx6)&lt;/td&gt;&lt;/tr&gt;
@ -4028,7 +4008,12 @@ list. The list can be maintained in Settings (F2).</source>
&lt;/table&gt;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2924"/>
<location filename="../widgets/mainwindow.cpp" line="2949"/>
<source>Special Mouse Commands</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2951"/>
<source>&lt;table cellpadding=5&gt;
&lt;tr&gt;
&lt;th align=&quot;right&quot;&gt;Click on&lt;/th&gt;
@ -4092,6 +4077,36 @@ list. The list can be maintained in Settings (F2).</source>
&lt;/tr&gt;
&lt;/table&gt;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3295"/>
<source>No more files to open.</source>
<translation>.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3659"/>
<source>Spotting to PSK Reporter unavailable</source>
<translation> Pskreporter </translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3817"/>
<source>Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m.</source>
<translation>. WSJT-X 30m WSPR .</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3821"/>
<source>WSPR Guard Band</source>
<translation>WSPR </translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3834"/>
<source>Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands.</source>
<translation>. WSJT-X在标准的FT8子带中不会以狐狸模式工作.</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3838"/>
<source>Fox Mode warning</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4443"/>
<source>Last Tx: %1</source>
@ -5409,6 +5424,11 @@ quiet period when decoding is done.</source>
<source>Data bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="669"/>
<source>Data Bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="675"/>
<source>D&amp;efault</source>
@ -5434,6 +5454,11 @@ quiet period when decoding is done.</source>
<source>Stop bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="723"/>
<source>Stop Bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="729"/>
<location filename="../Configuration.ui" line="780"/>
@ -5615,7 +5640,7 @@ or bandwidth is selected).</source>
<location filename="../Configuration.ui" line="1088"/>
<location filename="../Configuration.ui" line="1322"/>
<source>None</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="1098"/>
@ -5748,7 +5773,32 @@ transmitting periods.</source>
.</translation>
</message>
<message>
<location filename="../Configuration.ui" line="2400"/>
<location filename="../Configuration.ui" line="1888"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be sent.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;WSJT-X应该向其发送更新的UDP服务器的服务端口号. .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1898"/>
<source>Outgoing interfaces:</source>
<translation>:</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1908"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When sending updates to a multicast group address it is necessary to specify which network interface(s) to send them to. If the loop-back interface is multicast capable then at least that one will be selected.&lt;/p&gt;&lt;p&gt;For most users the loop-back interface is all that is needed, that will allow multiple other applications on the same machine to interoperate with WSJT-X. If applications running on other hosts are to receive status updates then a suitable network interface should be used.&lt;/p&gt;&lt;p&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;. .&lt;/p&gt;&lt;p&gt;, WSJT-X. 使.&lt;/p&gt;&lt;p&gt;Linux.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1915"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;. 1 .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1928"/>
<source>Multicast TTL:</source>
<translation> TTL:</translation>
</message>
<message>
<location filename="../Configuration.ui" line="2434"/>
<source>Days since last upload</source>
<translation></translation>
</message>
@ -5808,7 +5858,7 @@ both here.</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="1370"/>
<location filename="../Configuration.ui" line="1427"/>
<source>Ou&amp;tput:</source>
<translation>(&amp;t):</translation>
</message>
@ -6525,7 +6575,7 @@ Right click for insert and delete options.</source>
<message>
<location filename="../Configuration.ui" line="2914"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;調. 使 4 LF/MF .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;. 使 4 LF/MF .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="2917"/>

View File

@ -504,7 +504,12 @@ Format:
<translation> ARRL RTTY Roundup </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2169"/>
<location filename="../Configuration.cpp" line="1870"/>
<source>Pending DNS lookup, please try again later</source>
<translation> DNS , </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2213"/>
<source>Reset Decode Highlighting</source>
<translation></translation>
</message>
@ -519,7 +524,17 @@ Format:
<translation>WSJT-X </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2357"/>
<location filename="../Configuration.cpp" line="2425"/>
<source>UDP server DNS lookup failed</source>
<translation>UDP DNS </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2449"/>
<source>MAC-ambiguous multicast groups addresses not supported</source>
<translation>MAC </translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2467"/>
<source>Load Working Frequencies</source>
<translation></translation>
</message>
@ -1956,7 +1971,7 @@ Error: %2 - %3</source>
<message>
<location filename="../widgets/logqso.cpp" line="43"/>
<source>Satellite</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../widgets/logqso.cpp" line="44"/>
@ -2434,7 +2449,7 @@ Yellow when too low</source>
<message>
<location filename="../widgets/mainwindow.ui" line="636"/>
<source>If orange or red there has been a rig control failure, click to reset and read the dial frequency. S implies split mode.</source>
<translation>线, . S .</translation>
<translation>, . S .</translation>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="665"/>
@ -3873,13 +3888,13 @@ list. The list can be maintained in Settings (F2).</source>
<location filename="../widgets/mainwindow.cpp" line="2551"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation> GNU 使 WSJT-X , :
&quot;WSJT-X , , , FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 (C) 2001-2019 由以下一個或多個作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; WSJT .&quot;</translation>
&quot;WSJT-X , , , FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 (C) 2001-2021 由以下一個或多個作者: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; WSJT .&quot;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<location filename="../widgets/mainwindow.cpp" line="2846"/>
<source>No data read from disk. Wrong file format?</source>
<translation>. ?</translation>
</message>
@ -3899,7 +3914,7 @@ list. The list can be maintained in Settings (F2).</source>
<translation></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2866"/>
<location filename="../widgets/mainwindow.cpp" line="2893"/>
<source>&lt;table cellspacing=1&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Esc &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Stop Tx, abort QSO, clear next-call queue&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F1 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Online User&apos;s Guide (Alt: transmit Tx6)&lt;/td&gt;&lt;/tr&gt;
@ -3993,7 +4008,7 @@ list. The list can be maintained in Settings (F2).</source>
&lt;/table&gt;</translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2922"/>
<location filename="../widgets/mainwindow.cpp" line="2949"/>
<source>Special Mouse Commands</source>
<translation></translation>
</message>
@ -5410,6 +5425,11 @@ quiet period when decoding is done.</source>
<source>Data bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="669"/>
<source>Data Bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="675"/>
<source>D&amp;efault</source>
@ -5435,6 +5455,11 @@ quiet period when decoding is done.</source>
<source>Stop bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="723"/>
<source>Stop Bits</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="729"/>
<location filename="../Configuration.ui" line="780"/>
@ -5465,7 +5490,7 @@ quiet period when decoding is done.</source>
<message>
<location filename="../Configuration.ui" line="793"/>
<source>&amp;None</source>
<translation>(&amp;N)</translation>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="806"/>
@ -5749,7 +5774,32 @@ transmitting periods.</source>
.</translation>
</message>
<message>
<location filename="../Configuration.ui" line="2400"/>
<location filename="../Configuration.ui" line="1888"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter the service port number of the UDP server that WSJT-X should send updates to. If this is zero no updates will be sent.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; WSJT-X UDP . .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1898"/>
<source>Outgoing interfaces:</source>
<translation>:</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1908"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When sending updates to a multicast group address it is necessary to specify which network interface(s) to send them to. If the loop-back interface is multicast capable then at least that one will be selected.&lt;/p&gt;&lt;p&gt;For most users the loop-back interface is all that is needed, that will allow multiple other applications on the same machine to interoperate with WSJT-X. If applications running on other hosts are to receive status updates then a suitable network interface should be used.&lt;/p&gt;&lt;p&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;. .&lt;/p&gt;&lt;p&gt;, WSJT-X . 使.&lt;/p&gt;&lt;p&gt; Linux .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1915"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Sets the number or router hops that multicast datagrams are allowed to make. Almost everyone should set this to 1 to keep outgoing multicast traffic withn the local subnet.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;. 1 .&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1928"/>
<source>Multicast TTL:</source>
<translation> TTL TTL:</translation>
</message>
<message>
<location filename="../Configuration.ui" line="2434"/>
<source>Days since last upload</source>
<translation></translation>
</message>
@ -5809,7 +5859,7 @@ both here.</source>
<translation></translation>
</message>
<message>
<location filename="../Configuration.ui" line="1370"/>
<location filename="../Configuration.ui" line="1427"/>
<source>Ou&amp;tput:</source>
<translation>(&amp;t):</translation>
</message>
@ -6001,7 +6051,7 @@ and DX Grid fields when a 73 or free text message is sent.</source>
<message>
<location filename="../Configuration.ui" line="1801"/>
<source>Log automatically (contesting only)</source>
<translation> ()</translation>
<translation> ()</translation>
</message>
<message>
<location filename="../Configuration.ui" line="1818"/>

View File

@ -0,0 +1,92 @@
#ifndef MULTI_GEOMETRY_WIDGET_HPP__
#define MULTI_GEOMETRY_WIDGET_HPP__
#include <cstddef>
#include <utility>
#include <array>
#include <QWidget>
#include <QByteArray>
#include <QEvent>
//
// Class MultiGeometryWidget<N, Widget> - Decorate a QWidget type with
// switchable geometries
//
// The abstract base class imbues a Qt Widget type with N alternative
// geometries. Sub-classes can initialise the currently selected
// geometry and the initial geometries using geometries. To switch
// geometry call select_geometry(n) which saves the current geometry
// and switches to the n'th saved geometry.
//
template<std::size_t N, typename Widget=QWidget>
class MultiGeometryWidget
: public Widget
{
public:
template<typename... Args>
explicit MultiGeometryWidget (Args&&... args)
: Widget {std::forward<Args> (args)...}
, current_geometry_ {0}
{
}
void geometries (std::size_t current
, std::array<QByteArray, N> const& the_geometries = std::array<QByteArray, N> {})
{
Q_ASSERT (current < the_geometries.size ());
saved_geometries_ = the_geometries;
current_geometry_ = current;
Widget::restoreGeometry (saved_geometries_[current_geometry_]);
}
std::array<QByteArray, N> const& geometries () const {return saved_geometries_;}
std::size_t current () {return current_geometry_;}
// Call this to select a new geometry denoted by the 'n' argument,
// any actual layout changes should be made in the implementation of
// the change_layout operation below.
void select_geometry (std::size_t n)
{
Q_ASSERT (n < N);
auto geometry = Widget::saveGeometry ();
change_layout (n);
saved_geometries_[current_geometry_] = geometry;
current_geometry_ = n;
// Defer restoration of the window geometry until the layour
// request event has been processed, this is necessary otherwise
// the final geometry may be affected by widgets not shown in the
// new layout.
desired_geometry_ = saved_geometries_[n];
}
protected:
virtual ~MultiGeometryWidget () {}
private:
// Override this operation to implement any layout changes for the
// geometry specified by the argument 'n'.
virtual void change_layout (std::size_t n) = 0;
bool event (QEvent * e) override
{
auto ret = Widget::event (e);
if (QEvent::LayoutRequest == e->type ()
&& desired_geometry_.size ())
{
// Restore the new desired geometry and flag that we have done
// so by clearing the desired_geometry_ member variable.
QByteArray geometry;
std::swap (geometry, desired_geometry_);
Widget::restoreGeometry (geometry);
}
return ret;
}
std::size_t current_geometry_;
std::array<QByteArray, N> saved_geometries_;
QByteArray desired_geometry_;
};
#endif

View File

@ -18,12 +18,12 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
+ " " + revision ()}.simplified () + "</h2><br />"
"WSJT-X implements a number of digital modes designed for <br />"
"weak-signal Amateur Radio communication. <br /><br />"
"&copy; 2001-2020 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
"&copy; 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
"and Steve Franke, K9AN. <br /><br />"
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
"DF2ET, DJ0OT, G3WDG, G4KLA, IV3NWV, IW3RAB, KA1GT, K3WYC,<br />"
"KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,<br />"
"VE1SKY, VK3ACF, VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB.<br /><br />"
"VE1SKY, VK3ACF, VK4BDJ, VK7MO, W3DJS, W4TI, W4TV, and W9MDB.<br /><br />"
"WSJT-X is licensed under the terms of Version 3 <br />"
"of the GNU General Public License (GPL) <br /><br />"
"<a href=" TO_STRING__ (PROJECT_HOMEPAGE) ">"

View File

@ -1,7 +1,7 @@
#include "colorhighlighting.h"
#include <QApplication>
#include <QDebug>
#include <QString>
#include "SettingsGroup.hpp"
#include "models/DecodeHighlightingModel.hpp"
@ -113,16 +113,16 @@ void ColorHighlighting::set_items (DecodeHighlightingModel const& highlighting_m
default:
continue;
}
auto palette = example->parentWidget ()->palette ();
auto style_sheet = example->parentWidget ()->styleSheet ();
if (Qt::NoBrush != item.background_.style ())
{
palette.setColor (QPalette::Window, item.background_.color ());
style_sheet += QString {"; background-color: #%1"}.arg (item.background_.color ().rgb (), 8, 16, QLatin1Char {'0'});
}
if (Qt::NoBrush != item.foreground_.style ())
{
palette.setColor (QPalette::WindowText, item.foreground_.color ());
style_sheet += QString {"; color: #%1"}.arg (item.foreground_.color ().rgb (), 8, 16, QLatin1Char {'0'});
}
example->setPalette (palette);
example->setStyleSheet (style_sheet);
example->setEnabled (item.enabled_);
label->setText (DecodeHighlightingModel::highlight_name (item.type_));
label->setEnabled (item.enabled_);

View File

@ -15,6 +15,7 @@
#include <QScrollBar>
#include "Configuration.hpp"
#include "Decoder/decodedtext.h"
#include "Network/LotWUsers.hpp"
#include "models/DecodeHighlightingModel.hpp"
#include "logbook/logbook.h"

View File

@ -8,11 +8,10 @@
#include <QPair>
#include <QString>
#include "Decoder/decodedtext.h"
class QAction;
class Configuration;
class LogBook;
class DecodedText;
class DisplayText
: public QTextEdit

View File

@ -1,5 +1,6 @@
#include "logqso.h"
#include <QLocale>
#include <QString>
#include <QSettings>
#include <QStandardPaths>
@ -61,6 +62,9 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings
ui->comboBoxPropMode->addItem (prop_mode.name_, prop_mode.id_);
}
loadSettings ();
auto date_time_format = QLocale {}.dateFormat (QLocale::ShortFormat) + " hh:mm:ss";
ui->start_date_time->setDisplayFormat (date_time_format);
ui->end_date_time->setDisplayFormat (date_time_format);
ui->grid->setValidator (new MaidenheadLocatorValidator {this});
}

View File

@ -211,8 +211,8 @@ namespace
QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
auto quint32_max = std::numeric_limits<quint32>::max ();
constexpr int N_WIDGETS {36};
constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz
constexpr int tx_audio_buffer_size {48000 / 5}; // audio frames at 48000 Hz
constexpr int default_rx_audio_buffer_frames {-1}; // lets Qt decide
constexpr int default_tx_audio_buffer_frames {-1}; // lets Qt decide
bool message_is_73 (int type, QStringList const& msg_parts)
{
@ -236,7 +236,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
MultiSettings * multi_settings, QSharedMemory *shdmem,
unsigned downSampleFactor,
QSplashScreen * splash, QProcessEnvironment const& env, QWidget *parent) :
QMainWindow(parent),
MultiGeometryWidget {parent},
m_env {env},
m_network_manager {this},
m_valid {true},
@ -265,6 +265,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_soundInput {new SoundInput},
m_modulator {new Modulator {TX_SAMPLE_RATE, NTMAX}},
m_soundOutput {new SoundOutput},
m_rx_audio_buffer_frames {0},
m_tx_audio_buffer_frames {0},
m_msErase {0},
m_secBandChanged {0},
m_freqNominal {0},
@ -455,6 +457,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
m_modulator->moveToThread (&m_audioThread);
m_soundInput->moveToThread (&m_audioThread);
m_detector->moveToThread (&m_audioThread);
bool ok;
auto buffer_size = env.value ("WSJT_RX_AUDIO_BUFFER_FRAMES", "0").toInt (&ok);
m_rx_audio_buffer_frames = ok && buffer_size ? buffer_size : default_rx_audio_buffer_frames;
buffer_size = env.value ("WSJT_TX_AUDIO_BUFFER_FRAMES", "0").toInt (&ok);
m_tx_audio_buffer_frames = ok && buffer_size ? buffer_size : default_tx_audio_buffer_frames;
// hook up sound output stream slots & signals and disposal
connect (this, &MainWindow::initializeAudioOutputStream, m_soundOutput, &SoundOutput::setFormat);
@ -935,14 +942,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
if (!m_config.audio_input_device ().isNull ())
{
Q_EMIT startAudioInputStream (m_config.audio_input_device ()
, rx_chunk_size * m_downSampleFactor
, m_rx_audio_buffer_frames
, m_detector, m_downSampleFactor, m_config.audio_input_channel ());
}
if (!m_config.audio_output_device ().isNull ())
{
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
, tx_audio_buffer_size);
, m_tx_audio_buffer_frames);
}
Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
@ -1022,10 +1029,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
}
ui->pbBestSP->setVisible(m_mode=="FT4");
if(!ui->cbMenus->isChecked()) {
ui->cbMenus->setChecked(true);
ui->cbMenus->setChecked(false);
}
// this must be the last statement of constructor
if (!m_valid) throw std::runtime_error {"Fatal initialization exception"};
}
@ -1035,9 +1039,9 @@ void MainWindow::not_GA_warning_message ()
MessageBox::critical_message (this,
"This is a pre-release version of WSJT-X 2.3.0 made\n"
"available for testing purposes. By design it will\n"
"be nonfunctional after 0000 UTC on Jan 19, 2021.");
"be nonfunctional after 0000 UTC on Jan 26, 2021.");
auto now = QDateTime::currentDateTimeUtc ();
if (now >= QDateTime {{2021, 1, 19}, {0, 0}, Qt::UTC}) {
if (now >= QDateTime {{2021, 1, 26}, {0, 0}, Qt::UTC}) {
Q_EMIT finished ();
}
}
@ -1094,8 +1098,33 @@ MainWindow::~MainWindow()
void MainWindow::writeSettings()
{
m_settings->beginGroup("MainWindow");
m_settings->setValue ("geometry", saveGeometry ());
m_settings->setValue ("geometryNoControls", m_geometryNoControls);
if (ui->actionSWL_Mode->isChecked ())
{
m_settings->setValue ("SWLView", true);
m_settings->setValue ("ShowMenus", ui->cbMenus->isChecked ());
m_settings->setValue ("geometry", geometries ()[0]);
m_settings->setValue ("SWLModeGeometry", saveGeometry ());
m_settings->setValue ("geometryNoControls", geometries ()[2]);
}
else
{
if (ui->cbMenus->isChecked())
{
m_settings->setValue ("SWLView", ui->actionSWL_Mode->isChecked ());
m_settings->setValue ("ShowMenus", true);
m_settings->setValue ("geometry", saveGeometry ());
m_settings->setValue ("SWLModeGeometry", geometries ()[1]);
m_settings->setValue ("geometryNoControls", geometries ()[2]);
}
else
{
m_settings->setValue ("SWLView", ui->actionSWL_Mode->isChecked ());
m_settings->setValue ("ShowMenus", false);
m_settings->setValue ("geometry", geometries ()[0]);
m_settings->setValue ("SWLModeGeometry", geometries ()[1]);
m_settings->setValue ("geometryNoControls", saveGeometry ());
}
}
m_settings->setValue ("state", saveState ());
m_settings->setValue("MRUdir", m_path);
m_settings->setValue("TxFirst",m_txFirst);
@ -1105,7 +1134,6 @@ void MainWindow::writeSettings()
m_settings->setValue ("MsgAvgDisplayed", m_msgAvgWidget && m_msgAvgWidget->isVisible ());
m_settings->setValue ("FoxLogDisplayed", m_foxLogWindow && m_foxLogWindow->isVisible ());
m_settings->setValue ("ContestLogDisplayed", m_contestLogWindow && m_contestLogWindow->isVisible ());
m_settings->setValue("ShowMenus",ui->cbMenus->isChecked());
m_settings->setValue("CallFirst",ui->cbFirst->isChecked());
m_settings->setValue("HoundSort",ui->comboBoxHoundSort->currentIndex());
m_settings->setValue("FoxNlist",ui->sbNlist->value());
@ -1159,9 +1187,8 @@ void MainWindow::writeSettings()
m_settings->setValue("pwrBandTuneMemory",m_pwrBandTuneMemory);
m_settings->setValue ("FT8AP", ui->actionEnable_AP_FT8->isChecked ());
m_settings->setValue ("JT65AP", ui->actionEnable_AP_JT65->isChecked ());
m_settings->setValue("SplitterState",ui->splitter->saveState());
m_settings->setValue("SplitterState",ui->decodes_splitter->saveState());
m_settings->setValue("Blanker",ui->sbNB->value());
m_settings->setValue ("SWLView", ui->actionSWL_Mode->isChecked ());
{
QList<QVariant> coeffs; // suitable for QSettings
@ -1180,8 +1207,17 @@ void MainWindow::readSettings()
ui->cbAutoSeq->setVisible(false);
ui->cbFirst->setVisible(false);
m_settings->beginGroup("MainWindow");
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
m_geometryNoControls = m_settings->value ("geometryNoControls",saveGeometry()).toByteArray();
std::array<QByteArray, 3> the_geometries;
the_geometries[0] = m_settings->value ("geometry", saveGeometry ()).toByteArray ();
the_geometries[1] = m_settings->value ("SWLModeGeometry", saveGeometry ()).toByteArray ();
the_geometries[2] = m_settings->value ("geometryNoControls", saveGeometry ()).toByteArray ();
auto SWL_mode = m_settings->value ("SWLView", false).toBool ();
auto show_menus = m_settings->value ("ShowMenus", true).toBool ();
ui->actionSWL_Mode->setChecked (SWL_mode);
ui->cbMenus->setChecked (show_menus);
auto current_view_mode = SWL_mode ? 1 : show_menus ? 0 : 2;
change_layout (current_view_mode);
geometries (current_view_mode, the_geometries);
restoreState (m_settings->value ("state", saveState ()).toByteArray ());
ui->dxCallEntry->setText (m_settings->value ("DXcall", QString {}).toString ());
ui->dxGridEntry->setText (m_settings->value ("DXgrid", QString {}).toString ());
@ -1191,7 +1227,6 @@ void MainWindow::readSettings()
auto displayMsgAvg = m_settings->value ("MsgAvgDisplayed", false).toBool ();
auto displayFoxLog = m_settings->value ("FoxLogDisplayed", false).toBool ();
auto displayContestLog = m_settings->value ("ContestLogDisplayed", false).toBool ();
ui->cbMenus->setChecked(m_settings->value("ShowMenus",true).toBool());
ui->cbFirst->setChecked(m_settings->value("CallFirst",true).toBool());
ui->comboBoxHoundSort->setCurrentIndex(m_settings->value("HoundSort",3).toInt());
ui->sbNlist->setValue(m_settings->value("FoxNlist",12).toInt());
@ -1265,10 +1300,8 @@ void MainWindow::readSettings()
m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash();
ui->actionEnable_AP_FT8->setChecked (m_settings->value ("FT8AP", false).toBool());
ui->actionEnable_AP_JT65->setChecked (m_settings->value ("JT65AP", false).toBool());
ui->splitter->restoreState(m_settings->value("SplitterState").toByteArray());
ui->decodes_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<QVariant> {0., 0., 0., 0., 0.}).toList ();
@ -1567,7 +1600,7 @@ void MainWindow::dataSink(qint64 frames)
m_saveWAVWatcher.setFuture (QtConcurrent::run (std::bind (&MainWindow::save_wave_file,
this, m_fnameWE, &dec_data.d2[0], samples, m_config.my_callsign(),
m_config.my_grid(), m_mode, m_nSubMode, m_freqNominal, m_hisCall, m_hisGrid)));
if (m_mode=="WSPR" or m_mode=="FST4W") {
if (m_mode=="WSPR") {
QString c2name_string {m_fnameWE + ".c2"};
int len1=c2name_string.length();
char c2name[80];
@ -1821,7 +1854,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
if(m_config.restart_audio_input () && !m_config.audio_input_device ().isNull ()) {
Q_EMIT startAudioInputStream (m_config.audio_input_device ()
, rx_chunk_size * m_downSampleFactor
, m_rx_audio_buffer_frames
, m_detector, m_downSampleFactor
, m_config.audio_input_channel ());
}
@ -1829,7 +1862,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
if(m_config.restart_audio_output () && !m_config.audio_output_device ().isNull ()) {
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
, tx_audio_buffer_size);
, m_tx_audio_buffer_frames);
}
displayDialFrequency ();
@ -2561,44 +2594,59 @@ void MainWindow::on_actionCopyright_Notice_triggered()
"\"The algorithms, source code, look-and-feel of WSJT-X and related "
"programs, and protocol specifications for the modes FSK441, FT8, JT4, "
"JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) "
"2001-2020 by one or more of the following authors: Joseph Taylor, "
"2001-2021 by one or more of the following authors: Joseph Taylor, "
"K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, "
"IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; "
"Philip Karn, KA9Q; and other members of the WSJT Development Group.\"");
MessageBox::warning_message(this, message);
}
// Implement the MultiGeometryWidget::change_layout() operation.
void MainWindow::change_layout (std::size_t n)
{
switch (n)
{
case 1: // SWL view
ui->menuBar->show ();
ui->lower_panel_widget->hide ();
trim_view (false); // ensure we can switch back
break;
case 2: // hide menus view
ui->menuBar->hide ();
ui->lower_panel_widget->show ();
trim_view (true);
break;
default: // normal view
ui->menuBar->setVisible (ui->cbMenus->isChecked ());
ui->lower_panel_widget->show ();
trim_view (!ui->cbMenus->isChecked ());
break;
}
}
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
}
select_geometry (checked ? 1 : ui->cbMenus->isChecked () ? 0 : 2);
}
// This allows the window to shrink by removing certain things
// and reducing space used by controls
void MainWindow::hideMenus(bool checked)
void MainWindow::trim_view (bool checked)
{
int spacing = checked ? 1 : 6;
if (checked) {
statusBar ()->removeWidget (&auto_tx_label);
minimumSize().setHeight(450);
minimumSize().setWidth(700);
restoreGeometry(m_geometryNoControls);
updateGeometry();
} else {
m_geometryNoControls = saveGeometry();
statusBar ()->addWidget(&auto_tx_label);
minimumSize().setHeight(520);
minimumSize().setWidth(770);
}
ui->menuBar->setVisible(!checked);
if(m_mode!="FreqCal" and m_mode!="WSPR" and m_mode!="FST4W") {
if (m_mode != "FreqCal" && m_mode != "WSPR" && m_mode != "FST4W") {
ui->lh_decodes_title_label->setVisible(!checked);
ui->rh_decodes_title_label->setVisible(!checked);
}
ui->lh_decodes_headings_label->setVisible(!checked);
ui->rh_decodes_headings_label->setVisible(!checked);
ui->gridLayout_5->layout()->setSpacing(spacing);
ui->horizontalLayout_2->layout()->setSpacing(spacing);
ui->horizontalLayout_5->layout()->setSpacing(spacing);
@ -3025,8 +3073,8 @@ void MainWindow::decode() //decode()
dec_data.params.nutc=dec_data.params.nutc/100;
}
if(dec_data.params.nagain==0 && dec_data.params.newdat==1 && (!m_diskData)) {
auto t_start = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc (), m_TRperiod * 1.e3);
auto t = t_start.time ();
m_dateTimeSeqStart = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc (), m_TRperiod * 1.e3);
auto t = m_dateTimeSeqStart.time ();
dec_data.params.nutc = t.hour () * 100 + t.minute ();
if (m_TRperiod < 60.)
{
@ -3400,19 +3448,21 @@ void MainWindow::readFromStdout() //readFromStdout
ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(),
haveFSpread, fSpread);
if(m_bBestSPArmed and m_mode=="FT4") {
if(m_bBestSPArmed && m_mode=="FT4" && CALLING == m_QSOProgress) {
QString messagePriority=ui->decodedTextBrowser->CQPriority();
if(messagePriority!="") {
if(messagePriority=="New Call on Band"
and m_BestCQpriority!="New Call on Band"
and m_BestCQpriority!="New Multiplier") {
m_BestCQpriority="New Call on Band";
m_bDoubleClicked = true;
processMessage(decodedtext0);
}
if(messagePriority=="New DXCC"
and m_BestCQpriority!="New DXCC"
and m_BestCQpriority!="New Multiplier") {
m_BestCQpriority="New DXCC";
m_bDoubleClicked = true;
processMessage(decodedtext0);
}
}
@ -3521,7 +3571,16 @@ void MainWindow::readFromStdout() //readFromStdout
decodedtext.deCallAndGrid(/*out*/deCall,grid);
{
auto t = Radio::base_callsign (ui->dxCallEntry->text ());
if ((t == deCall || ui->dxCallEntry->text () == deCall || !t.size ()) && rpt.size ()) m_rptRcvd = rpt;
auto const& dx_call = decodedtext.call ();
if (rpt.size () // report in message
&& (m_baseCall == Radio::base_callsign (dx_call) // for us
|| "DE" == dx_call) // probably for us
&& (t == deCall // DX station base call is QSO partner
|| ui->dxCallEntry->text () == deCall // DX station full call is QSO partner
|| !t.size ())) // not in QSO
{
m_rptRcvd = rpt;
}
}
// extract details and send to PSKreporter
int nsec=QDateTime::currentMSecsSinceEpoch()/1000-m_secBandChanged;
@ -4085,7 +4144,14 @@ void MainWindow::guiUpdate()
}
}
m_currentMessage = QString::fromLatin1(msgsent);
{
auto temp = m_currentMessage;
m_currentMessage = QString::fromLatin1(msgsent);
if (m_currentMessage != temp) // check if tx message changed
{
statusUpdate ();
}
}
m_bCallingCQ = CALLING == m_QSOProgress
|| m_currentMessage.contains (QRegularExpression {"^(CQ|QRZ) "});
if(m_mode=="FT8" or m_mode=="FT4") {
@ -5918,7 +5984,11 @@ void MainWindow::displayWidgets(qint64 n)
if(i==31) ui->cbRxAll->setVisible(b);
if(i==32) ui->cbCQonly->setVisible(b);
if(i==33) ui->sbTR_FST4W->setVisible(b);
if(i==34) ui->sbF_Low->setVisible(b);
if (34 == i) // adjust the stacked widget
{
ui->opt_controls_stack->setCurrentIndex (b ? 1 : 0);
ui->sbF_Low->setVisible(b);
}
if(i==35) ui->sbF_High->setVisible(b);
j=j>>1;
}
@ -7562,10 +7632,6 @@ void MainWindow::on_sbTR_valueChanged(int value)
progressBar.setMaximum (value);
}
if(m_mode=="FST4") chk_FST4_freq_range();
if(m_monitoring) {
on_stopButton_clicked();
on_monitorButton_clicked(true);
}
if(m_transmitting) {
on_stopTxButton_clicked();
}
@ -8348,7 +8414,8 @@ void MainWindow::statusUpdate () const
m_hisGrid, m_tx_watchdog,
submode != QChar::Null ? QString {submode} : QString {}, m_bFastMode,
static_cast<quint8> (m_config.special_op_id ()),
ftol, tr_period, m_multi_settings->configuration_name ());
ftol, tr_period, m_multi_settings->configuration_name (),
m_currentMessage);
}
void MainWindow::childEvent (QChildEvent * e)
@ -8431,7 +8498,7 @@ void MainWindow::update_watchdog_label ()
void MainWindow::on_cbMenus_toggled(bool b)
{
hideMenus(!b);
select_geometry (!b ? 2 : ui->actionSWL_Mode->isChecked () ? 1 : 0);
}
void MainWindow::on_cbCQonly_toggled(bool)

View File

@ -26,6 +26,7 @@
#include <QFuture>
#include <QFutureWatcher>
#include "MultiGeometryWidget.hpp"
#include "NonInheritingProcess.hpp"
#include "Audio/AudioDevice.hpp"
#include "commons.h"
@ -94,7 +95,8 @@ class MultiSettings;
class EqualizationToolsDialog;
class DecodedText;
class MainWindow : public QMainWindow
class MainWindow
: public MultiGeometryWidget<3, QMainWindow>
{
Q_OBJECT;
@ -130,7 +132,8 @@ public slots:
void msgAvgDecode2();
void fastPick(int x0, int x1, int y);
protected:
private:
void change_layout (std::size_t) override;
void keyPressEvent (QKeyEvent *) override;
void closeEvent(QCloseEvent *) override;
void childEvent(QChildEvent *) override;
@ -353,7 +356,7 @@ private:
void astroUpdate ();
void writeAllTxt(QString message);
void auto_sequence (DecodedText const& message, unsigned start_tolerance, unsigned stop_tolerance);
void hideMenus(bool b);
void trim_view (bool b);
void foxTest();
void setColorHighlighting();
void chkFT4();
@ -401,6 +404,8 @@ private:
SoundInput * m_soundInput;
Modulator * m_modulator;
SoundOutput * m_soundOutput;
int m_rx_audio_buffer_frames;
int m_tx_audio_buffer_frames;
QThread m_audioThread;
qint64 m_msErase;

File diff suppressed because it is too large Load Diff

View File

@ -13,12 +13,6 @@
#include "SettingsGroup.hpp"
#include "moc_widegraph.cpp"
namespace
{
auto user_defined = QObject::tr ("User Defined");
float swide[MAX_SCREENSIZE];
}
WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
QDialog(parent),
ui(new Ui::WideGraph),
@ -26,7 +20,8 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
m_palettes_path {":/Palettes"},
m_tr0 {0.0},
m_n {0},
m_bHaveTransmitted {false}
m_bHaveTransmitted {false},
m_user_defined {tr ("User Defined")}
{
ui->setupUi(this);
@ -103,8 +98,8 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
if(t==m_waterfallPalette) ui->paletteComboBox->setCurrentIndex(index);
index++;
}
ui->paletteComboBox->addItem (user_defined);
if (user_defined == m_waterfallPalette) ui->paletteComboBox->setCurrentIndex(index);
ui->paletteComboBox->addItem (m_user_defined);
if (m_user_defined == m_waterfallPalette) ui->paletteComboBox->setCurrentIndex(index);
readPalette ();
}
@ -147,7 +142,7 @@ void WideGraph::saveSettings() //saveS
void WideGraph::drawRed(int ia, int ib)
{
ui->widePlot->drawRed(ia,ib,swide);
ui->widePlot->drawRed(ia,ib,m_swide);
}
void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dataSink2
@ -181,8 +176,8 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat
ss += sp;
smax=qMax(smax,sp);
}
// swide[j]=nbpp*smax;
swide[j]=nbpp*ss;
// m_swide[j]=nbpp*smax;
m_swide[j]=nbpp*ss;
}
// Time according to this computer
@ -192,7 +187,7 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat
float flagValue=1.0e30;
if(m_bHaveTransmitted) flagValue=2.0e30;
for(int i=0; i<MAX_SCREENSIZE; i++) {
swide[i] = flagValue;
m_swide[i] = flagValue;
}
for(int i=0; i<NSMAX; i++) {
splot[i] = flagValue;
@ -200,7 +195,7 @@ void WideGraph::dataSink2(float s[], float df3, int ihsym, int ndiskdata) //dat
m_bHaveTransmitted=false;
}
m_tr0=tr;
ui->widePlot->draw(swide,true,false);
ui->widePlot->draw(m_swide,true,false);
}
}
@ -238,7 +233,7 @@ void WideGraph::keyPressEvent(QKeyEvent *e) //F1
void WideGraph::setRxFreq(int n) //setRxFreq
{
ui->widePlot->setRxFreq(n);
ui->widePlot->draw(swide,false,false);
ui->widePlot->draw(m_swide,false,false);
}
int WideGraph::rxFreq() //rxFreq
@ -384,7 +379,7 @@ void WideGraph::readPalette () //readPalette
{
try
{
if (user_defined == m_waterfallPalette)
if (m_user_defined == m_waterfallPalette)
{
ui->widePlot->setColours (WFPalette {m_userPalette}.interpolate ());
}
@ -437,7 +432,7 @@ void WideGraph::on_adjust_palette_push_button_clicked (bool) //Adjust Palette
{
if (m_userPalette.design ())
{
m_waterfallPalette = user_defined;
m_waterfallPalette = m_user_defined;
ui->paletteComboBox->setCurrentText (m_waterfallPalette);
readPalette ();
}
@ -479,8 +474,8 @@ void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2
{
ui->widePlot->setPlot2dGain(value);
if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
ui->widePlot->draw(m_swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(m_swide,false,true);
}
}
@ -488,8 +483,8 @@ void WideGraph::on_zero2dSlider_valueChanged(int value) //Zero2
{
ui->widePlot->setPlot2dZero(value);
if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
ui->widePlot->draw(m_swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(m_swide,false,true);
}
}

View File

@ -117,6 +117,8 @@ private:
QString m_mode;
QString m_modeTx;
QString m_waterfallPalette;
float m_swide[MAX_SCREENSIZE];
QString m_user_defined;
};
#endif // WIDEGRAPH_H

View File

@ -20,15 +20,15 @@ AutoFlush="false"
# Line Formats available: TimeStamp, Uptime, Severity, LineID (counter), ProcessID, ThreadID, Line, File, Function
# TimeStamp and Uptime support boost date time format:
# http://www.boost.org/doc/libs/1_60_0/doc/html/date_time/date_time_io.html#date_time.format_flags
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Severity%] %File%(%Line%) %Function%: %Message%"
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Channel%][%Severity%] %File%(%Line%) %Function%: %Message%"
# Target directory in which rotated files will be stored.
Target="${AppLocalDataLocation}/old_logs"
Target="${AppLocalDataLocation}/logs"
# FileName pattern to use. %N is a counter for files.
FileName="${AppLocalDataLocation}/wsjtx_syslog.log"
TargetFileName="${AppLocalDataLocation}/old_logs/wsjtx_syslog_%Y-%m-%d_%H-%M-%S.%N.log"
TargetFileName="${AppLocalDataLocation}/old_logs/wsjtx_syslog_%Y-%m_%2N.log"
# RotationSize in bytes, File size, in bytes, upon which file rotation will be performed.
# Time based rotation also available via RotationInterval and RotationTimePoint see boost log docs.
RotationSize="1048576"
RotationSize="5242880" # 5 Mbyte
# If Append is true then do not start a new log file for each session
Append="true"
# EnableFinalRotation will rotate on close, make this false if using Append true
@ -36,10 +36,10 @@ EnableFinalRotation="false"
# Matching used so that only files matching FileName pattern are deleted.
ScanForFiles="Matching"
# MaxSize - Total size of files in the target directory in bytes upon which the oldest file will be deleted.
#MaxSize=100485760
MaxSize="1073741824" # 1 Gbyte total
# MinFreeSpace - Minimum free space in the Target directory in bytes. Above this value oldest file is deleted.
#MinFreeSpace=1485760
MaxFiles="10"
MinFreeSpace="42949672960" # 40 Gbyte
MaxFiles="50"
# Specify level of log, options are: trace, debug, info, warning, error, fatal
# Since Channel not part of filter all log output will be included.
# If only SYSLOG logging desired, change to: Filter="%Severity% >= trace & %Channel% matches \"SYSLOG\""
@ -58,20 +58,20 @@ Append="true"
# http://www.boost.org/doc/libs/1_60_0/doc/html/date_time/date_time_io.html#date_time.format_flags
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Uptime(format=\"%O:%M:%S.%f\")%][%Severity%] %Message%"
# Target directory in which rotated files will be stored.
Target="${AppLocalDataLocation}/old_logs"
Target="${AppLocalDataLocation}/logs"
# FileName pattern to use. %N is a counter for files.
FileName="${AppLocalDataLocation}/wsjtx_datalog.log"
TargetFileName="wsjtx_datalog_%5N.log"
# RotationSize in bytes, File size, in bytes, upon which file rotation will be performed.
# Time based rotation also available via RotationInterval and RotationTimePoint see boost log docs.
RotationSize="1048576"
RotationSize="5242880"
EnableFinalRotation="false"
# Matching used so that only files matching FileName pattern are deleted.
ScanForFiles="Matching"
# MaxSize - Total size of files in the target directory in bytes upon which the oldest file will be deleted.
#MaxSize=100485760
MaxSize="1073741824"
# MinFreeSpace - Minimum free space in the Target directory in bytes. Above this value oldest file is deleted.
#MinFreeSpace=1485760
MinFreeSpace="42949672960"
MaxFiles="10"
# Specify level of log, options are: trace, debug, info, warning, error, fatal
# Specify Channel otherwise all log output will be included.