Cleanup old files, documentation, samples, and other remnants
@ -44,14 +44,13 @@ if (CPACK_GENERATOR MATCHES "NSIS")
|
|||||||
set (CPACK_PACKAGE_ICON "@PROJECT_SOURCE_DIR@/icons/windows-icons\\installer_logo.bmp")
|
set (CPACK_PACKAGE_ICON "@PROJECT_SOURCE_DIR@/icons/windows-icons\\installer_logo.bmp")
|
||||||
# tell cpack to create links to the doc files
|
# tell cpack to create links to the doc files
|
||||||
set (CPACK_NSIS_MENU_LINKS
|
set (CPACK_NSIS_MENU_LINKS
|
||||||
"@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@" "@PROJECT_NAME@ Documentation"
|
|
||||||
"@PROJECT_HOMEPAGE@" "@PROJECT_NAME@ Web Site"
|
"@PROJECT_HOMEPAGE@" "@PROJECT_NAME@ Web Site"
|
||||||
)
|
)
|
||||||
# Use the icon from wsjtx for add-remove programs
|
# Use the icon from wsjtx for add-remove programs
|
||||||
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\ft8call.exe")
|
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\ft8call.exe")
|
||||||
|
|
||||||
set (CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
set (CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
|
||||||
set (CPACK_NSIS_HELP_LINK "@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@")
|
set (CPACK_NSIS_HELP_LINK "@PROJECT_HOMEPAGE@")
|
||||||
set (CPACK_NSIS_URL_INFO_ABOUT "@PROJECT_HOMEPAGE@")
|
set (CPACK_NSIS_URL_INFO_ABOUT "@PROJECT_HOMEPAGE@")
|
||||||
set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
|
set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
|
||||||
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "ft8call.exe")
|
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "ft8call.exe")
|
||||||
|
140
CMakeLists.txt
@ -49,76 +49,11 @@ set (PROJECT_NAME "FT8Call")
|
|||||||
set (PROJECT_VENDOR "Jordan Sherer, KN4CRD")
|
set (PROJECT_VENDOR "Jordan Sherer, KN4CRD")
|
||||||
set (PROJECT_CONTACT "Jordan Sherer <kn4crd@gmail.com>")
|
set (PROJECT_CONTACT "Jordan Sherer <kn4crd@gmail.com>")
|
||||||
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2018 by Joe Taylor, K1JT, (C) 2018 by Jordan Sherer, KN4CRD")
|
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2018 by Joe Taylor, K1JT, (C) 2018 by Jordan Sherer, KN4CRD")
|
||||||
set (PROJECT_HOMEPAGE http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html)
|
set (PROJECT_HOMEPAGE https://groups.io/g/ft8call)
|
||||||
set (PROJECT_MANUAL wsjtx-main)
|
|
||||||
set (PROJECT_MANUAL_DIRECTORY_URL http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/)
|
|
||||||
set (PROJECT_SAMPLES_URL http://downloads.sourceforge.net/project/wsjt/)
|
|
||||||
set (PROJECT_SAMPLES_UPLOAD_DEST frs.sourceforge.net:/home/frs/project/wsjt/)
|
|
||||||
set (PROJECT_SUMMARY_DESCRIPTION "${PROJECT_NAME} - Digital Modes for Weak Signal Communicaitons in Amateur Radio.")
|
set (PROJECT_SUMMARY_DESCRIPTION "${PROJECT_NAME} - Digital Modes for Weak Signal Communicaitons in Amateur Radio.")
|
||||||
set (PROJECT_DESCRIPTION "${PROJECT_SUMMARY_DESCRIPTION}
|
set (PROJECT_DESCRIPTION "${PROJECT_SUMMARY_DESCRIPTION}
|
||||||
${PROJECT_NAME} is a computer program designed to facilitate basic amateur
|
${PROJECT_NAME} is a computer program designed to facilitate amateur
|
||||||
radio communication using very weak signals. The first four letters in
|
radio communication using very weak signals.")
|
||||||
the program name stand for `(W)eak (S)ignal communication by
|
|
||||||
K1(JT),` while the suffix `-X` indicates that ${PROJECT_NAME} started as
|
|
||||||
an extended and experimental branch of the program
|
|
||||||
WSJT.
|
|
||||||
.
|
|
||||||
${PROJECT_NAME} Version 1.8 offers nine different protocols or modes: FT8,
|
|
||||||
JT4, JT9, JT65, QRA64, ISCAT, MSK144, WSPR, and Echo.
|
|
||||||
The first five are designed for making reliable QSOs under extreme
|
|
||||||
weak-signal conditions. They use nearly identical message structure
|
|
||||||
and source encoding. JT65 and QRA64 were designed for EME
|
|
||||||
(`moonbounce`) on the VHF/UHF bands and have also proven very
|
|
||||||
effective for worldwide QRP communication on the HF bands. QRA64 has
|
|
||||||
a number of advantages over JT65, including better performance on the
|
|
||||||
very weakest signals. We imagine that over time it may replace JT65
|
|
||||||
for EME use. JT9 was originally designed for the LF, MF, and lower HF
|
|
||||||
bands. Its submode JT9A is 2 dB more sensitive than JT65 while using
|
|
||||||
less than 10% of the bandwidth. JT4 offers a wide variety of tone
|
|
||||||
spacings and has proven highly effective for EME on microwave bands up
|
|
||||||
to 24 GHz. These four `slow` modes use one-minute timed sequences
|
|
||||||
of alternating transmission and reception, so a minimal QSO takes four
|
|
||||||
to six minutes — two or three transmissions by each station, one
|
|
||||||
sending in odd UTC minutes and the other even. FT8 is operationally
|
|
||||||
similar but four times faster (15-second T/R sequences) and less
|
|
||||||
sensitive by a few dB. On the HF bands, world-wide QSOs are possible
|
|
||||||
with any of these modes using power levels of a few watts (or even
|
|
||||||
milliwatts) and compromise antennas. On VHF bands and higher, QSOs
|
|
||||||
are possible (by EME and other propagation types) at signal levels 10
|
|
||||||
to 15 dB below those required for CW.
|
|
||||||
.
|
|
||||||
ISCAT, MSK144, and optionally submodes JT9E-H are `fast`
|
|
||||||
protocols designed to take advantage of brief signal enhancements from
|
|
||||||
ionized meteor trails, aircraft scatter, and other types of scatter
|
|
||||||
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
|
|
||||||
duration. User messages are transmitted repeatedly at high rate (up
|
|
||||||
to 250 characters per second, for MSK144) to make good use of the
|
|
||||||
shortest meteor-trail reflections or `pings`. ISCAT uses free-form
|
|
||||||
messages up to 28 characters long, while MSK144 uses the same
|
|
||||||
structured messages as the slow modes and optionally an abbreviated
|
|
||||||
format with hashed callsigns.
|
|
||||||
.
|
|
||||||
WSPR (pronounced `whisper`) stands for (W)eak (S)ignal
|
|
||||||
(P)ropagation (R)eporter. The WSPR protocol was designed for probing
|
|
||||||
potential propagation paths using low-power transmissions. WSPR
|
|
||||||
messages normally carry the transmitting station’s callsign, grid
|
|
||||||
locator, and transmitter power in dBm, and they can be decoded at
|
|
||||||
signal-to-noise ratios as low as -28 dB in a 2500 Hz bandwidth. WSPR
|
|
||||||
users with internet access can automatically upload reception
|
|
||||||
reports to a central database called wsprnet that provides a mapping
|
|
||||||
facility, archival storage, and many other features.
|
|
||||||
.
|
|
||||||
Echo mode allows you to detect and measure your own station's echoes
|
|
||||||
from the moon, even if they are far below the audible threshold.
|
|
||||||
.
|
|
||||||
${PROJECT_NAME} provides spectral displays for receiver passbands as wide as
|
|
||||||
5 kHz, flexible rig control for nearly all modern radios used by
|
|
||||||
amateurs, and a wide variety of special aids such as automatic Doppler
|
|
||||||
tracking for EME QSOs and Echo testing. The program runs equally well
|
|
||||||
on Windows, Macintosh, and Linux systems, and installation packages
|
|
||||||
are available for all three platforms.
|
|
||||||
.
|
|
||||||
Be sure to read the online ${PROJECT_NAME} User's Guide.")
|
|
||||||
|
|
||||||
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH})
|
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake/Modules ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
@ -159,8 +94,7 @@ option (WSJT_TRACE_CAT "Debugging option that turns on CAT diagnostics.")
|
|||||||
option (WSJT_TRACE_CAT_POLLS "Debugging option that turns on CAT diagnostics during polling.")
|
option (WSJT_TRACE_CAT_POLLS "Debugging option that turns on CAT diagnostics during polling.")
|
||||||
option (WSJT_HAMLIB_TRACE "Debugging option that turns on minimal Hamlib internal diagnostics.")
|
option (WSJT_HAMLIB_TRACE "Debugging option that turns on minimal Hamlib internal diagnostics.")
|
||||||
option (WSJT_SOFT_KEYING "Apply a ramp to CW keying envelope to reduce transients." ON)
|
option (WSJT_SOFT_KEYING "Apply a ramp to CW keying envelope to reduce transients." ON)
|
||||||
option (WSJT_SKIP_MANPAGES "Skip *nix manpage generation.")
|
option (WSJT_SKIP_MANPAGES "Skip *nix manpage generation." ON)
|
||||||
option (WSJT_GENERATE_DOCS "Generate documentation files." ON)
|
|
||||||
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
|
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION (WSJT_HAMLIB_VERBOSE_TRACE "Debugging option that turns on full Hamlib internal diagnostics." OFF WSJT_HAMLIB_TRACE OFF)
|
CMAKE_DEPENDENT_OPTION (WSJT_HAMLIB_VERBOSE_TRACE "Debugging option that turns on full Hamlib internal diagnostics." OFF WSJT_HAMLIB_TRACE OFF)
|
||||||
@ -169,7 +103,7 @@ CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in
|
|||||||
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
|
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
|
||||||
is_debug_build OFF)
|
is_debug_build OFF)
|
||||||
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
|
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
|
||||||
"The wsjtx target is normally built as GUI executable with a WinMain entry point on Windows,
|
"The target is normally built as GUI executable with a WinMain entry point on Windows,
|
||||||
if you want a console application instead then set this option to OFF.
|
if you want a console application instead then set this option to OFF.
|
||||||
|
|
||||||
If you just want to see the debug output from the application then the easiest way is to
|
If you just want to see the debug output from the application then the easiest way is to
|
||||||
@ -249,11 +183,6 @@ set (wsjt_qt_CXXSRCS
|
|||||||
HintedSpinBox.cpp
|
HintedSpinBox.cpp
|
||||||
RestrictedSpinBox.cpp
|
RestrictedSpinBox.cpp
|
||||||
HelpTextWindow.cpp
|
HelpTextWindow.cpp
|
||||||
SampleDownloader.cpp
|
|
||||||
SampleDownloader/DirectoryDelegate.cpp
|
|
||||||
SampleDownloader/Directory.cpp
|
|
||||||
SampleDownloader/FileNode.cpp
|
|
||||||
SampleDownloader/RemoteFile.cpp
|
|
||||||
DisplayManual.cpp
|
DisplayManual.cpp
|
||||||
MultiSettings.cpp
|
MultiSettings.cpp
|
||||||
MaidenheadLocatorValidator.cpp
|
MaidenheadLocatorValidator.cpp
|
||||||
@ -268,12 +197,12 @@ set (wsjt_qtmm_CXXSRCS
|
|||||||
Audio/BWFFile.cpp
|
Audio/BWFFile.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set (jt9_FSRCS
|
set (js8_FSRCS
|
||||||
lib/jt9.f90
|
lib/jt9.f90
|
||||||
lib/jt9a.f90
|
lib/jt9a.f90
|
||||||
)
|
)
|
||||||
|
|
||||||
set (jt9_CXXSRCS
|
set (js8_CXXSRCS
|
||||||
lib/ipcomm.cpp
|
lib/ipcomm.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -685,7 +614,7 @@ set (all_CXXSRCS
|
|||||||
${wsjt_CXXSRCS}
|
${wsjt_CXXSRCS}
|
||||||
${wsjt_qt_CXXSRCS}
|
${wsjt_qt_CXXSRCS}
|
||||||
${wsjt_qtmm_CXXSRCS}
|
${wsjt_qtmm_CXXSRCS}
|
||||||
${jt9_CXXSRCS}
|
${js8_CXXSRCS}
|
||||||
${wsjtx_CXXSRCS}
|
${wsjtx_CXXSRCS}
|
||||||
${qcp_CXXSRCS}
|
${qcp_CXXSRCS}
|
||||||
)
|
)
|
||||||
@ -698,9 +627,6 @@ set (all_C_and_CXXSRCS
|
|||||||
)
|
)
|
||||||
|
|
||||||
set (TOP_LEVEL_RESOURCES
|
set (TOP_LEVEL_RESOURCES
|
||||||
shortcuts.txt
|
|
||||||
mouse_commands.txt
|
|
||||||
prefixes.txt
|
|
||||||
cty.dat
|
cty.dat
|
||||||
icons/Darwin/FT8Call.iconset/icon_128x128.png
|
icons/Darwin/FT8Call.iconset/icon_128x128.png
|
||||||
contrib/gpl-v3-logo.svg
|
contrib/gpl-v3-logo.svg
|
||||||
@ -869,14 +795,6 @@ if (WIN32)
|
|||||||
find_package (Qt5AxContainer REQUIRED)
|
find_package (Qt5AxContainer REQUIRED)
|
||||||
endif (WIN32)
|
endif (WIN32)
|
||||||
|
|
||||||
#
|
|
||||||
# sub-directories
|
|
||||||
#
|
|
||||||
add_subdirectory (samples)
|
|
||||||
if (WSJT_GENERATE_DOCS)
|
|
||||||
add_subdirectory (doc)
|
|
||||||
endif (WSJT_GENERATE_DOCS)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Library building setup
|
# Library building setup
|
||||||
@ -1124,7 +1042,7 @@ if (${OPENMP_FOUND} OR APPLE)
|
|||||||
if (APPLE)
|
if (APPLE)
|
||||||
# On Mac we don't have working OpenMP support in the C/C++
|
# On Mac we don't have working OpenMP support in the C/C++
|
||||||
# compilers so we have to manually set the correct flags to get
|
# compilers so we have to manually set the correct flags to get
|
||||||
# OpenMP support in jt9.
|
# OpenMP support in js8.
|
||||||
target_compile_options (wsjt_fort_omp
|
target_compile_options (wsjt_fort_omp
|
||||||
PRIVATE
|
PRIVATE
|
||||||
$<$<COMPILE_LANGUAGE:Fortran>:-fopenmp> # assumes GNU style Fortran compiler
|
$<$<COMPILE_LANGUAGE:Fortran>:-fopenmp> # assumes GNU style Fortran compiler
|
||||||
@ -1153,42 +1071,42 @@ target_link_libraries (wsjt_qtmm Qt5::Multimedia)
|
|||||||
add_executable (ldpcsim174 lib/ft8/ldpcsim174.f90 wsjtx.rc)
|
add_executable (ldpcsim174 lib/ft8/ldpcsim174.f90 wsjtx.rc)
|
||||||
target_link_libraries (ldpcsim174 wsjt_fort wsjt_cxx)
|
target_link_libraries (ldpcsim174 wsjt_fort wsjt_cxx)
|
||||||
|
|
||||||
add_executable (jt9 ${jt9_FSRCS} ${jt9_CXXSRCS} wsjtx.rc)
|
add_executable (js8 ${js8_FSRCS} ${js8_CXXSRCS} wsjtx.rc)
|
||||||
if (${OPENMP_FOUND} OR APPLE)
|
if (${OPENMP_FOUND} OR APPLE)
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
# On Mac we don't have working OpenMP support in the C/C++
|
# On Mac we don't have working OpenMP support in the C/C++
|
||||||
# compilers so we have to manually set the correct linking flags
|
# compilers so we have to manually set the correct linking flags
|
||||||
# and libraries to get OpenMP support in jt9.
|
# and libraries to get OpenMP support in js8.
|
||||||
set_target_properties (jt9
|
set_target_properties (js8
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
|
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
|
||||||
LINK_LIBRARIES "gomp;gcc_s.1" # assume GNU libgcc OpenMP
|
LINK_LIBRARIES "gomp;gcc_s.1" # assume GNU libgcc OpenMP
|
||||||
)
|
)
|
||||||
target_compile_options (jt9
|
target_compile_options (js8
|
||||||
PRIVATE
|
PRIVATE
|
||||||
$<$<COMPILE_LANGUAGE:Fortran>:-fopenmp> # assumes GNU style Fortran compiler
|
$<$<COMPILE_LANGUAGE:Fortran>:-fopenmp> # assumes GNU style Fortran compiler
|
||||||
)
|
)
|
||||||
else (APPLE)
|
else (APPLE)
|
||||||
if (OpenMP_C_FLAGS)
|
if (OpenMP_C_FLAGS)
|
||||||
set_target_properties (jt9
|
set_target_properties (js8
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
|
||||||
LINK_FLAGS "${OpenMP_C_FLAGS}"
|
LINK_FLAGS "${OpenMP_C_FLAGS}"
|
||||||
)
|
)
|
||||||
endif ()
|
endif ()
|
||||||
set_target_properties (jt9
|
set_target_properties (js8
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
|
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
|
||||||
)
|
)
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# set_target_properties (jt9 PROPERTIES
|
# set_target_properties (js8 PROPERTIES
|
||||||
# LINK_FLAGS -Wl,--stack,16777216
|
# LINK_FLAGS -Wl,--stack,16777216
|
||||||
# )
|
# )
|
||||||
endif ()
|
endif ()
|
||||||
target_link_libraries (jt9 wsjt_fort_omp wsjt_cxx Qt5::Core)
|
target_link_libraries (js8 wsjt_fort_omp wsjt_cxx Qt5::Core)
|
||||||
else (${OPENMP_FOUND} OR APPLE)
|
else (${OPENMP_FOUND} OR APPLE)
|
||||||
target_link_libraries (jt9 wsjt_fort wsjt_cxx Qt5::Core)
|
target_link_libraries (js8 wsjt_fort wsjt_cxx Qt5::Core)
|
||||||
endif (${OPENMP_FOUND} OR APPLE)
|
endif (${OPENMP_FOUND} OR APPLE)
|
||||||
|
|
||||||
# build the main application
|
# build the main application
|
||||||
@ -1239,16 +1157,16 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
qt5_use_modules (ft8call SerialPort) # not sure why the interface link library syntax above doesn't work
|
qt5_use_modules (ft8call SerialPort) # not sure why the interface link library syntax above doesn't work
|
||||||
|
|
||||||
if (UNIX)
|
# if (UNIX)
|
||||||
if (NOT WSJT_SKIP_MANPAGES)
|
# if (NOT WSJT_SKIP_MANPAGES)
|
||||||
add_subdirectory (manpages)
|
# add_subdirectory (manpages)
|
||||||
add_dependencies (ft8call manpages)
|
# add_dependencies (ft8call manpages)
|
||||||
endif (NOT WSJT_SKIP_MANPAGES)
|
# endif (NOT WSJT_SKIP_MANPAGES)
|
||||||
if (NOT APPLE)
|
# if (NOT APPLE)
|
||||||
add_subdirectory (debian)
|
# add_subdirectory (debian)
|
||||||
add_dependencies (ft8call debian)
|
# add_dependencies (ft8call debian)
|
||||||
endif (NOT APPLE)
|
# endif (NOT APPLE)
|
||||||
endif (UNIX)
|
# endif (UNIX)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1259,7 +1177,7 @@ install (TARGETS ft8call
|
|||||||
BUNDLE DESTINATION . COMPONENT runtime
|
BUNDLE DESTINATION . COMPONENT runtime
|
||||||
)
|
)
|
||||||
|
|
||||||
install (TARGETS jt9 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
|
install (TARGETS js8 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
|
||||||
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
|
BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,410 +0,0 @@
|
|||||||
__ __ ______ _____ ________ __ __
|
|
||||||
| \ _ | \ / \ | \| \ | \ | \
|
|
||||||
| $$ / \ | $$| $$$$$$\ \$$$$$ \$$$$$$$$ | $$ | $$
|
|
||||||
| $$/ $\| $$| $$___\$$ | $$ | $$ ______ \$$\/ $$
|
|
||||||
| $$ $$$\ $$ \$$ \ __ | $$ | $$| \ >$$ $$
|
|
||||||
| $$ $$\$$\$$ _\$$$$$$\| \ | $$ | $$ \$$$$$$/ $$$$\
|
|
||||||
| $$$$ \$$$$| \__| $$| $$__| $$ | $$ | $$ \$$\
|
|
||||||
| $$$ \$$$ \$$ $$ \$$ $$ | $$ | $$ | $$
|
|
||||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Copyright 2001 - 2018 by Joe Taylor, K1JT.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.1
|
|
||||||
June 1, 2018
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
This critical bug fix release repairs an unintended restriction in the FT8
|
|
||||||
DXpedition mode. It supersedes v1.9.0 and must be used for DXpedition Fox
|
|
||||||
operators.
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0
|
|
||||||
May 28, 2018
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
Changes from WSJT-X Version 1.9.0-rc4 include the following:
|
|
||||||
- Display in the right text window of MSK144 messages addressed to
|
|
||||||
"MyCall" has been restored.
|
|
||||||
|
|
||||||
- Fox is not allowed to transmit in any of the default FT8 sub-bands.
|
|
||||||
|
|
||||||
- Fox can now work Hounds using compound callsigns.
|
|
||||||
|
|
||||||
- Fox can now transmit free-text messages (and any standard FT8 message)
|
|
||||||
by using Tab 1 or Tab 2.
|
|
||||||
|
|
||||||
- Added a checkbox to enable more frequent programmed CQs by Fox.
|
|
||||||
Default is OFF.
|
|
||||||
|
|
||||||
- Alt+N keyboard shortcut has been restored.
|
|
||||||
|
|
||||||
- MacOS program crash on unexpected decode request has been fixed.
|
|
||||||
|
|
||||||
|
|
||||||
- Several minor bug fixes and added convenience features.
|
|
||||||
|
|
||||||
- Hamlib, support for TRXManger added.
|
|
||||||
|
|
||||||
- Hamlib, improved support for flrig.
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0-rc4
|
|
||||||
April 30, 2018
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Changes from WSJT-X Version 1.9.0-rc3 include the following:
|
|
||||||
|
|
||||||
- Corrected a number of flaws in Fox and Hound behavior, FT8
|
|
||||||
DXpedition Mode
|
|
||||||
|
|
||||||
- Decoded CQ calls where a prefix has been used as a suffix should
|
|
||||||
have the DXCC entity name assigned correctly in almost all cases
|
|
||||||
|
|
||||||
- Improved AFC capability for the wider JT65 sub-modes to help with
|
|
||||||
drifting signals
|
|
||||||
|
|
||||||
- Better support for macOS using hi-DPI Retina displays
|
|
||||||
|
|
||||||
- New UDP message that allows external applications to highlight
|
|
||||||
decoded callsigns
|
|
||||||
|
|
||||||
- Main-screen geometry and state of the "splitter" setting between its
|
|
||||||
two text windows is now properly restored after program restart.
|
|
||||||
|
|
||||||
- New simulator jt49sim[.exe] replaces jt4sim and jt9sim
|
|
||||||
|
|
||||||
- Correct S/N measurements for the JT9 slow/wide submodes
|
|
||||||
|
|
||||||
- Other minor bug fixes
|
|
||||||
|
|
||||||
- Updated copy of cty.dat
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0-rc3
|
|
||||||
March 18, 2018
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Changes from WSJT-X Version 1.9.0-rc2 include the following:
|
|
||||||
|
|
||||||
- Corrected a number of flaws in Fox behavior, FT8 DXpedition Mode
|
|
||||||
|
|
||||||
- Allow Hounds to use compound callsigns
|
|
||||||
|
|
||||||
- Write debugging information to FoxQSO.txt.
|
|
||||||
|
|
||||||
- Fix the "Blue Decode Button" bug
|
|
||||||
|
|
||||||
- Allow partial processing of incoming UDP Reply messages so that
|
|
||||||
non-CQ/QRZ decodes can be processed. The processing is the same as
|
|
||||||
double-clicking the same decoded message within WSJT-X except that
|
|
||||||
"Enable Tx" will not be enabled.
|
|
||||||
|
|
||||||
- Send DX grid locator to wsjt_status.txt, for use by applications like
|
|
||||||
PstRotatorAZ
|
|
||||||
|
|
||||||
- Correct the display of DXCC status of KG4 calls
|
|
||||||
|
|
||||||
- Updated copy of cty.dat
|
|
||||||
|
|
||||||
- Updates to documentation
|
|
||||||
|
|
||||||
- Other minor bug fixes
|
|
||||||
|
|
||||||
- This release contains updated Hamlib functionality including changes
|
|
||||||
to the Yaesu FT-817 back end that allows the uBITx kit transceiver
|
|
||||||
to be CAT controlled by WSJT-X.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.9.0-rc2
|
|
||||||
February 26, 2018
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Changes from WSJT-X Version 1.8.0 include the following:
|
|
||||||
|
|
||||||
- New FT8 DXpedition Mode to facilitate high QSO rates in pileup
|
|
||||||
situations
|
|
||||||
|
|
||||||
- Decoding improvements for JT65 mode, including a priori (AP)
|
|
||||||
decoding when VHF/UHF/Microwave features are enabled
|
|
||||||
|
|
||||||
- Optional Auto-Sequencing in JT4, JT9, and JT65 when
|
|
||||||
VHF/UHF/Microwave features are enabled
|
|
||||||
|
|
||||||
- Better suppression of low-confidence false decodes generated by AP
|
|
||||||
decoding in FT8 mode
|
|
||||||
|
|
||||||
- Improved decoding performance for WSPR mode, especially effective at
|
|
||||||
LF and MF
|
|
||||||
|
|
||||||
- Minor adjustments to auto-sequencing behavior
|
|
||||||
|
|
||||||
- More flexible Doppler control features for EME
|
|
||||||
|
|
||||||
- Improved waterfall sensitivity for very weak signals
|
|
||||||
|
|
||||||
- Automatic real-time forwarding of logged information to N1MM Logger+
|
|
||||||
|
|
||||||
- Expanded and improved UDP messages sent to companion programs
|
|
||||||
|
|
||||||
- Bug fixes and other minor tweaks to user interface
|
|
||||||
|
|
||||||
A primary purpose of this beta release is to allow field testing of
|
|
||||||
FT8 DXpedition Mode. Instructions for this mode are posted here:
|
|
||||||
|
|
||||||
http://physics.princeton.edu/pulsar/k1jt/FT8_DXpedition_Mode.pdf
|
|
||||||
|
|
||||||
Contacts in FT8 DXpedition Mode must use WSJT-X v1.9.0 at both ends of
|
|
||||||
the QSO. Please report any anomalous behavior to email list
|
|
||||||
wsjt-devel@lists.sourceforge.net. You must be a subscriber in order
|
|
||||||
to post there.
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0
|
|
||||||
October 27, 2017
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
This is the full General Availability release of WSJT-X Version 1.8.0.
|
|
||||||
|
|
||||||
Changes from WSJT-X Version 1.8.0-rc3 are very minor:
|
|
||||||
|
|
||||||
- Right-click on the Wide Graph now pops up a Context Menu. Select
|
|
||||||
the item *Set Rx & Tx Offset* to complete a one-handed setting of
|
|
||||||
both red and green frequency markers.
|
|
||||||
|
|
||||||
- Several clarifications and additions to Tool Tips and the User Guide.
|
|
||||||
|
|
||||||
|
|
||||||
We recommend that all users should upgrade to WSJT-X Version 1.8.0.
|
|
||||||
|
|
||||||
If you upgrade from v1.8.0-rc1 it may be necessary to do a one-time
|
|
||||||
reset of the default list of suggested operating frequencies. Go to
|
|
||||||
*File->Settings->Frequencies*, right click on the table and select
|
|
||||||
*Reset*.
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0-rc3
|
|
||||||
October 16, 2017
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Most (but not all) changes since Version 1.8.0-rc2 involve user
|
|
||||||
control of the increasingly popular FT8 mode. The "RC3" release also
|
|
||||||
includes minor bug fixes and updates to the WSJT-X User Guide.
|
|
||||||
|
|
||||||
The following list includes all of the more important changes:
|
|
||||||
|
|
||||||
- New optimization of GUI for simplex and split behavior in FT8 mode.
|
|
||||||
|
|
||||||
1. Checkbox "Lock Tx Freq" on main window is relabeled "Hold Tx Freq".
|
|
||||||
|
|
||||||
2. Double-clicking on decoded messages that do not contain your own
|
|
||||||
call moves both Rx and Tx frequencies. If the first callsign is
|
|
||||||
your own call, only Rx freq moves.
|
|
||||||
|
|
||||||
3. Double-clicking on decoded messages moves the Rx frequency. If
|
|
||||||
"Hold Tx Freq" is checked, Tx frequency is moved only if CTRL was
|
|
||||||
held down.
|
|
||||||
|
|
||||||
4. Clicking on the waterfall moves Rx and Tx frequencies as
|
|
||||||
before: Rx only on a simple click, Tx only on SHIFT-click, and
|
|
||||||
both on CTRL-click. This happens even if "Hold Tx Freq" is
|
|
||||||
checked.
|
|
||||||
|
|
||||||
- Add a semi-automated "FreqCal" procedure: see *Solve for calibration
|
|
||||||
parameters* on the Tools menu.
|
|
||||||
|
|
||||||
- Improv auto-sequencing behavior: stop and on-frequency
|
|
||||||
transmission if a called station comes back to someone else.
|
|
||||||
|
|
||||||
- Improve S/N estimation in some situations involving QRM.
|
|
||||||
|
|
||||||
- Fix an initialization issue with user-modified application fonts.
|
|
||||||
|
|
||||||
- Fix an issue with Tx5 message generation with Type 2 compound calls.
|
|
||||||
|
|
||||||
- Enhance and improve the ADIF parser of logbook records. Update
|
|
||||||
the band limits as per ADIF 3.0.6 specification.
|
|
||||||
|
|
||||||
- Increase the FT8 DT range to +/- 2.5 s.
|
|
||||||
|
|
||||||
- Do not allow window manager events to close the astronomical data
|
|
||||||
window.
|
|
||||||
|
|
||||||
- Add an "Erase" item to the context (right-click) menu for decoded
|
|
||||||
text.
|
|
||||||
|
|
||||||
- Extend UDP messages with an "off air" boolean field indicating that
|
|
||||||
the decode was derived from a .WAV file playback rather than an on air
|
|
||||||
reception.
|
|
||||||
|
|
||||||
- Extend reference applications to use the new off air decode message
|
|
||||||
field.
|
|
||||||
|
|
||||||
- Improve performance of FT8 decoder, especially for overlapping
|
|
||||||
signals.
|
|
||||||
|
|
||||||
- Allow specialized use of "x2 Tone Spacing" in FT8 and slow JT9
|
|
||||||
modes.
|
|
||||||
|
|
||||||
- Move "NA VHF Contest Mode" checkbox to main screen. Query the
|
|
||||||
operator if d > 10000 km.
|
|
||||||
|
|
||||||
- Adjust UI to improve portability with font size changes and between
|
|
||||||
platforms.
|
|
||||||
|
|
||||||
- Extend UDP Reply message to support keyboard modifiers. This allows
|
|
||||||
UDP servers to emulate keyboard modified double-clicks on decoded
|
|
||||||
messages, e.g. ALT+double-click for replying to a CQ or QRZ call
|
|
||||||
without changing ones Tx frequency offset.
|
|
||||||
|
|
||||||
- Update the cty.dat file (21st Sept 2017).
|
|
||||||
|
|
||||||
- Ensure that Fast Graph is properly initialized.
|
|
||||||
|
|
||||||
- Better handling of worked before and country name display. Appended
|
|
||||||
text is added at a fixed column unless the message overlaps in which
|
|
||||||
case the appended information floats to the right.
|
|
||||||
|
|
||||||
- Restore printing of MSK144 decode quality information.
|
|
||||||
|
|
||||||
- Display Echo Graph automatically when Echo mode is started.
|
|
||||||
|
|
||||||
- Fix a bug that prevented double-click on a JT65 EME-style "OOO"
|
|
||||||
message from populating the Tx message boxes.
|
|
||||||
|
|
||||||
- Fixed behavior with double-click on 'CQ <AA-ZZ> <call> <grid>.'
|
|
||||||
|
|
||||||
- Update the "blank line" divider with band ID at 4*TRperiod/5.
|
|
||||||
|
|
||||||
- Fix cty.dat lookups that were not honouring exact match flags
|
|
||||||
|
|
||||||
- Add some further Copyright protections.
|
|
||||||
|
|
||||||
- Fix a bug involving "firstcall contains mycall" but not equal to mycall.
|
|
||||||
|
|
||||||
- Fix an issue with editing IARU regions in the working frequencies table.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0-rc2
|
|
||||||
September 2, 2017
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
Implementation of FT8 and its auto-sequencing feature is now more
|
|
||||||
capable and more polished. The decoder is faster and better: it now
|
|
||||||
includes signal subtraction, multi-pass decoding, and the use of
|
|
||||||
accumulated "a priori" information as a QSO progresses. Sensitivity
|
|
||||||
extends downward as far as -24 dB in some circumstances. Overlapping
|
|
||||||
signals 2 and 3 deep are frequently decoded at essentially the same
|
|
||||||
frequency. On a crowded band we sometimes see more than 30 decodes in
|
|
||||||
a single 15-second interval, over a 2 kHz window. The North American
|
|
||||||
VHF Contesting Mode has been extended to include both FT8 and MSK144
|
|
||||||
modes.
|
|
||||||
|
|
||||||
The "RC2" release also includes many minor bug fixes and an
|
|
||||||
extensively updated WSJT-X User Guide.
|
|
||||||
|
|
||||||
Depending on what code revision you upgrade from, it may be necessary
|
|
||||||
to do a one-time reset of the default list of suggested operating
|
|
||||||
frequencies. Go to *File->Settings->Frequencies*, right click on
|
|
||||||
the table and select *Reset*.
|
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X Version 1.8.0
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
NEW FEATURES IN WSJT-X Version 1.8.0
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
1. New mode called FT8: sensitivity down to -20 dB on the AWGN
|
|
||||||
channel; QSOs 4 times faster than JT65 or JT9; auto-sequencing
|
|
||||||
includes an option to respond automatically to first decoded
|
|
||||||
reply to your CQ.
|
|
||||||
|
|
||||||
2. New mode for accurate Frequency Calibration of your radio.
|
|
||||||
|
|
||||||
3. Improved performance of decoders for JT65, QRA64, and MSK144.
|
|
||||||
MSK144 includes facilities for amplitide and phase equalization
|
|
||||||
and an "SWL" mode for short-format messages.
|
|
||||||
|
|
||||||
4. Options to minimize screen space used by Main and Wide Graph
|
|
||||||
windows.
|
|
||||||
|
|
||||||
5. Enhanced management scheme for table of operating frequencies, and
|
|
||||||
a new set of default frequencies specific to the three IARU
|
|
||||||
Regions.
|
|
||||||
|
|
||||||
6. Improved CAT control for many rigs, including those controlled
|
|
||||||
through Commander or OmniRig.
|
|
||||||
|
|
||||||
7. New keyboard shortcuts to set "Tx even/1st" ON or OFF.
|
|
||||||
|
|
||||||
8. A number of (mostly minor) bug fixes and tweaks to the user
|
|
||||||
interface. For example: new behavior for the audio level slider;
|
|
||||||
correctly logged QSO start times in certain situations; correct
|
|
||||||
control of FT-891/991 and some other radios via rigctld.
|
|
||||||
|
|
||||||
At the time of the v1.8.0-rc1 release the following tasks are yet to
|
|
||||||
be completed:
|
|
||||||
|
|
||||||
1. Updates to WSJT-X User Guide.
|
|
||||||
2. Sample files for FT8.
|
|
||||||
3. Enhanced decoding using AP ("a priori") information.
|
|
||||||
4. Signal subtraction and multi-pass decoding.
|
|
||||||
5. Option to Auto-respond to the weakest responder to your CQ.
|
|
||||||
|
|
||||||
|
|
||||||
Installation packages for Windows, Linux, OS X, and Raspbian can be
|
|
||||||
downloaded from the WSJT web site:
|
|
||||||
http://physics.princeton.edu/pulsar/K1JT/wsjtx.html
|
|
||||||
|
|
||||||
Please send bug reports to either wsjtgroup@yahoogroups.com or
|
|
||||||
wsjt-devel@lists.sourceforge.net. Such reports should include a full
|
|
||||||
prescription of steps to reproduce the undesired behavior. You must
|
|
||||||
be a subscriber to post to either of these lists.
|
|
||||||
|
|
||||||
|
|
||||||
Brief Description of the FT8 Protocol
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
WSJT-X Version 1.8.0 includes a new mode called FT8, developed by K9AN
|
|
||||||
and K1JT. The mode name "FT8" stands for "Franke and Taylor, 8-FSK
|
|
||||||
modulation". FT8 uses 15-second T/R sequences and provides 50% or
|
|
||||||
better decoding probability down to -20 dB on an AWGN channel. An
|
|
||||||
auto-sequencing facility includes an option to respond automatically
|
|
||||||
to the first decoded reply to your CQ. FT8 QSOs are 4 times faster
|
|
||||||
than those made with JT65 or JT9. FT8 is an excellent mode for HF
|
|
||||||
DXing and for situations like multi-hop E_s on 6 meters, where deep
|
|
||||||
QSB may make fast and reliable completion of QSOs desirable.
|
|
||||||
|
|
||||||
Some important characteristics of FT8:
|
|
||||||
|
|
||||||
- T/R sequence length: 15 s
|
|
||||||
- Message length: 75 bits + 12-bit CRC
|
|
||||||
- FEC code: LDPC(174,87)
|
|
||||||
- Modulation: 8-FSK, tone spacing 6.25 Hz
|
|
||||||
- Constant-envelope waveform
|
|
||||||
- Occupied bandwidth: 50 Hz
|
|
||||||
- Synchronization: 7x7 Costas arrays at start, middle, and end
|
|
||||||
- Transmission duration: 79*1920/12000 = 12.64 s
|
|
||||||
- Decoding threshold: -20 dB; several dB lower with AP decoding
|
|
||||||
- Multi-decoder finds and decodes all FT8 signals in passband
|
|
||||||
- Optional auto-sequencing and auto-reply to a CQ response
|
|
||||||
- Operational behavior similar to JT9, JT65
|
|
||||||
|
|
||||||
We plan to implement signal subtraction, two-pass decoding, and use of
|
|
||||||
a priori (AP) information in the decoder. These features are not yet
|
|
||||||
activated in v1.8.0.
|
|
||||||
|
|
||||||
We haven't yet finalized what the three extra bits in the message
|
|
||||||
payload will be used for. Suggestions are welcome!
|
|
||||||
|
|
||||||
-- Joe, K1JT, for the WSJT Development Team
|
|
||||||
|
|
@ -1,159 +0,0 @@
|
|||||||
#include "SampleDownloader.hpp"
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QtWidgets>
|
|
||||||
|
|
||||||
#include "pimpl_impl.hpp"
|
|
||||||
#include "SettingsGroup.hpp"
|
|
||||||
#include "SampleDownloader/Directory.hpp"
|
|
||||||
#include "MessageBox.hpp"
|
|
||||||
|
|
||||||
#include "moc_SampleDownloader.cpp"
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
char const * const title = "Download Samples";
|
|
||||||
}
|
|
||||||
|
|
||||||
class SampleDownloader::impl final
|
|
||||||
: public QDialog
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit impl (QSettings * settings, Configuration const *, QNetworkAccessManager *, QWidget * parent);
|
|
||||||
~impl () {save_window_state ();}
|
|
||||||
|
|
||||||
void refresh ()
|
|
||||||
{
|
|
||||||
show ();
|
|
||||||
raise ();
|
|
||||||
activateWindow ();
|
|
||||||
directory_.refresh (http_only_check_box_.isChecked ());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void closeEvent (QCloseEvent * e) override
|
|
||||||
{
|
|
||||||
save_window_state ();
|
|
||||||
QDialog::closeEvent (e);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void save_window_state ()
|
|
||||||
{
|
|
||||||
SettingsGroup g (settings_, title);
|
|
||||||
settings_->setValue ("geometry", saveGeometry ());
|
|
||||||
settings_->setValue ("SamplesURL", url_line_edit_.text ());
|
|
||||||
settings_->setValue ("HTTPOnly", http_only_check_box_.isChecked ());
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_SLOT void button_clicked (QAbstractButton *);
|
|
||||||
|
|
||||||
QSettings * settings_;
|
|
||||||
Directory directory_;
|
|
||||||
QGridLayout main_layout_;
|
|
||||||
QVBoxLayout left_layout_;
|
|
||||||
QDialogButtonBox button_box_;
|
|
||||||
QWidget details_widget_;
|
|
||||||
QFormLayout details_layout_;
|
|
||||||
QLineEdit url_line_edit_;
|
|
||||||
QCheckBox http_only_check_box_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#include "SampleDownloader.moc"
|
|
||||||
|
|
||||||
SampleDownloader::SampleDownloader (QSettings * settings, Configuration const * configuration
|
|
||||||
, QNetworkAccessManager * network_manager, QWidget * parent)
|
|
||||||
: m_ {settings, configuration, network_manager, parent}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
SampleDownloader::~SampleDownloader ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void SampleDownloader::show ()
|
|
||||||
{
|
|
||||||
m_->refresh ();
|
|
||||||
}
|
|
||||||
|
|
||||||
SampleDownloader::impl::impl (QSettings * settings
|
|
||||||
, Configuration const * configuration
|
|
||||||
, QNetworkAccessManager * network_manager
|
|
||||||
, QWidget * parent)
|
|
||||||
: QDialog {parent, Qt::Window | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint}
|
|
||||||
, settings_ {settings}
|
|
||||||
, directory_ {configuration, network_manager}
|
|
||||||
, button_box_ {QDialogButtonBox::Close, Qt::Vertical}
|
|
||||||
{
|
|
||||||
setWindowTitle (windowTitle () + ' ' + tr (title));
|
|
||||||
resize (500, 600);
|
|
||||||
{
|
|
||||||
SettingsGroup g {settings_, title};
|
|
||||||
restoreGeometry (settings_->value ("geometry", saveGeometry ()).toByteArray ());
|
|
||||||
url_line_edit_.setText (settings_->value ("SamplesURL", PROJECT_SAMPLES_URL).toString ());
|
|
||||||
http_only_check_box_.setChecked (settings_->value ("HTTPOnly", false).toBool ());
|
|
||||||
directory_.url_root (url_line_edit_.text ());
|
|
||||||
}
|
|
||||||
|
|
||||||
setWindowTitle (QApplication::applicationName () + " - " + tr ("Download Samples"));
|
|
||||||
|
|
||||||
button_box_.button (QDialogButtonBox::Close)->setDefault (true);
|
|
||||||
button_box_.addButton ("&Abort", QDialogButtonBox::DestructiveRole);
|
|
||||||
button_box_.addButton ("&Refresh", QDialogButtonBox::ResetRole);
|
|
||||||
left_layout_.addWidget (&directory_);
|
|
||||||
|
|
||||||
auto details_button = button_box_.addButton ("&Details", QDialogButtonBox::HelpRole);
|
|
||||||
details_button->setCheckable (true);
|
|
||||||
details_widget_.hide ();
|
|
||||||
details_layout_.setMargin (0);
|
|
||||||
details_layout_.addRow ("Base URL for samples:", &url_line_edit_);
|
|
||||||
details_layout_.addRow ("Only use HTTP:", &http_only_check_box_);
|
|
||||||
http_only_check_box_.setToolTip ("Check this is you get SSL/TLS errors");
|
|
||||||
details_widget_.setLayout (&details_layout_);
|
|
||||||
|
|
||||||
main_layout_.addLayout (&left_layout_, 0, 0);
|
|
||||||
main_layout_.addWidget (&button_box_, 0, 1);
|
|
||||||
main_layout_.addWidget (&details_widget_, 1, 0, 1, 2);
|
|
||||||
main_layout_.setRowStretch (1, 2);
|
|
||||||
setLayout (&main_layout_);
|
|
||||||
|
|
||||||
connect (&button_box_, &QDialogButtonBox::clicked, this, &SampleDownloader::impl::button_clicked);
|
|
||||||
connect (details_button, &QAbstractButton::clicked, &details_widget_, &QWidget::setVisible);
|
|
||||||
connect (&url_line_edit_, &QLineEdit::editingFinished, [this] () {
|
|
||||||
if (directory_.url_root (url_line_edit_.text ()))
|
|
||||||
{
|
|
||||||
directory_.refresh (http_only_check_box_.isChecked ());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("Input Error"), tr ("Invalid URL format"));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
connect (&http_only_check_box_, &QAbstractButton::toggled, [this] (bool checked) {
|
|
||||||
directory_.refresh (checked);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void SampleDownloader::impl::button_clicked (QAbstractButton * button)
|
|
||||||
{
|
|
||||||
switch (button_box_.buttonRole (button))
|
|
||||||
{
|
|
||||||
case QDialogButtonBox::RejectRole:
|
|
||||||
hide ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QDialogButtonBox::DestructiveRole:
|
|
||||||
directory_.abort ();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QDialogButtonBox::ResetRole:
|
|
||||||
directory_.refresh (http_only_check_box_.isChecked ());
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
#ifndef SAMPLE_DOWNLOADER_HPP__
|
|
||||||
#define SAMPLE_DOWNLOADER_HPP__
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
#include "pimpl_h.hpp"
|
|
||||||
|
|
||||||
class QSettings;
|
|
||||||
class QWidget;
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
class Configuration;
|
|
||||||
|
|
||||||
//
|
|
||||||
// SampleDownloader - A Dialog to maintain sample files
|
|
||||||
//
|
|
||||||
// This uses a Qt Dialog window that contains a tree view of the
|
|
||||||
// available sample files on a web or ftp server. The files can be
|
|
||||||
// installed locally by ticking a check box or removed from the local
|
|
||||||
// machine by un-ticking the check boxes.
|
|
||||||
//
|
|
||||||
// The class requires a pointer to an open QSettings instance where it
|
|
||||||
// will save its persistent state, a pointer to a WSJT-X Configuration
|
|
||||||
// instance that is used to obtain configuration information like the
|
|
||||||
// current file save location and, a pointer to a
|
|
||||||
// QNetworkAccessManager instance which is used for network requests.
|
|
||||||
//
|
|
||||||
// An instance of SampleDownloader need not be destroyed after use,
|
|
||||||
// just call SampleDownloader::show() to make the dialog visible
|
|
||||||
// again.
|
|
||||||
//
|
|
||||||
class SampleDownloader final
|
|
||||||
: public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT;
|
|
||||||
|
|
||||||
public:
|
|
||||||
SampleDownloader (QSettings * settings
|
|
||||||
, Configuration const *
|
|
||||||
, QNetworkAccessManager *
|
|
||||||
, QWidget * parent = nullptr);
|
|
||||||
~SampleDownloader ();
|
|
||||||
|
|
||||||
Q_SLOT void show ();
|
|
||||||
|
|
||||||
private:
|
|
||||||
class impl;
|
|
||||||
pimpl<impl> m_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,319 +0,0 @@
|
|||||||
#include "Directory.hpp"
|
|
||||||
|
|
||||||
#include <QVariant>
|
|
||||||
#include <QString>
|
|
||||||
#include <QHeaderView>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QAuthenticator>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QTreeWidgetItem>
|
|
||||||
#include <QTreeWidgetItemIterator>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QJsonParseError>
|
|
||||||
#include <QJsonArray>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QRegularExpression>
|
|
||||||
|
|
||||||
#include "Configuration.hpp"
|
|
||||||
#include "DirectoryNode.hpp"
|
|
||||||
#include "FileNode.hpp"
|
|
||||||
#include "revision_utils.hpp"
|
|
||||||
#include "MessageBox.hpp"
|
|
||||||
|
|
||||||
#include "moc_Directory.cpp"
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
char const * samples_dir_name = "samples";
|
|
||||||
QString const contents_file_name = "contents_" + version (false) + ".json";
|
|
||||||
}
|
|
||||||
|
|
||||||
Directory::Directory (Configuration const * configuration
|
|
||||||
, QNetworkAccessManager * network_manager
|
|
||||||
, QWidget * parent)
|
|
||||||
: QTreeWidget {parent}
|
|
||||||
, configuration_ {configuration}
|
|
||||||
, network_manager_ {network_manager}
|
|
||||||
, http_only_ {false}
|
|
||||||
, root_dir_ {configuration_->save_directory ()}
|
|
||||||
, contents_ {this
|
|
||||||
, network_manager_
|
|
||||||
, QDir {root_dir_.absoluteFilePath (samples_dir_name)}.absoluteFilePath (contents_file_name)}
|
|
||||||
{
|
|
||||||
dir_icon_.addPixmap (style ()->standardPixmap (QStyle::SP_DirClosedIcon), QIcon::Normal, QIcon::Off);
|
|
||||||
dir_icon_.addPixmap (style ()->standardPixmap (QStyle::SP_DirOpenIcon), QIcon::Normal, QIcon::On);
|
|
||||||
file_icon_.addPixmap (style ()->standardPixmap (QStyle::SP_FileIcon));
|
|
||||||
|
|
||||||
setColumnCount (2);
|
|
||||||
setHeaderLabels ({"File", "Progress"});
|
|
||||||
header ()->setSectionResizeMode (QHeaderView::ResizeToContents);
|
|
||||||
setItemDelegate (&item_delegate_);
|
|
||||||
|
|
||||||
connect (network_manager_, &QNetworkAccessManager::authenticationRequired
|
|
||||||
, this, &Directory::authentication);
|
|
||||||
connect (this, &Directory::itemChanged, [this] (QTreeWidgetItem * item) {
|
|
||||||
switch (item->type ())
|
|
||||||
{
|
|
||||||
case FileNode::Type:
|
|
||||||
{
|
|
||||||
FileNode * node = static_cast<FileNode *> (item);
|
|
||||||
if (!node->sync (node->checkState (0) == Qt::Checked))
|
|
||||||
{
|
|
||||||
FileNode::sync_blocker b {node};
|
|
||||||
node->setCheckState (0, node->checkState (0) == Qt::Checked ? Qt::Unchecked : Qt::Checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Directory::url_root (QUrl root)
|
|
||||||
{
|
|
||||||
if (!root.path ().endsWith ('/'))
|
|
||||||
{
|
|
||||||
root.setPath (root.path () + '/');
|
|
||||||
}
|
|
||||||
bool valid = root.isValid ();
|
|
||||||
if (valid)
|
|
||||||
{
|
|
||||||
url_root_ = root;
|
|
||||||
}
|
|
||||||
return valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::error (QString const& title, QString const& message)
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, title, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Directory::refresh (bool http_only)
|
|
||||||
{
|
|
||||||
abort ();
|
|
||||||
clear ();
|
|
||||||
// update locations
|
|
||||||
root_dir_ = configuration_->save_directory ();
|
|
||||||
QDir contents_dir {root_dir_.absoluteFilePath (samples_dir_name)};
|
|
||||||
contents_.local_file_path (contents_dir.absoluteFilePath (contents_file_name));
|
|
||||||
contents_.http_only (http_only_ = http_only);
|
|
||||||
QUrl url {url_root_.resolved (QDir {root_dir_.relativeFilePath (samples_dir_name)}.filePath (contents_file_name))};
|
|
||||||
if (url.isValid ())
|
|
||||||
{
|
|
||||||
return contents_.sync (url, true, true); // attempt to fetch contents
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this
|
|
||||||
, tr ("URL Error")
|
|
||||||
, tr ("Invalid URL:\n\"%1\"")
|
|
||||||
.arg (url.toDisplayString ()));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::download_finished (bool success)
|
|
||||||
{
|
|
||||||
if (success)
|
|
||||||
{
|
|
||||||
QFile contents {contents_.local_file_path ()};
|
|
||||||
if (contents.open (QFile::ReadOnly | QFile::Text))
|
|
||||||
{
|
|
||||||
QJsonParseError json_status;
|
|
||||||
auto content = QJsonDocument::fromJson (contents.readAll (), &json_status);
|
|
||||||
if (json_status.error)
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this
|
|
||||||
, tr ("JSON Error")
|
|
||||||
, tr ("Contents file syntax error %1 at character offset %2")
|
|
||||||
.arg (json_status.errorString ()).arg (json_status.offset));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!content.isArray ())
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents file top level must be a JSON array"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QTreeWidgetItem * parent {invisibleRootItem ()};
|
|
||||||
parent = new DirectoryNode {parent, samples_dir_name};
|
|
||||||
parent->setIcon (0, dir_icon_);
|
|
||||||
parent->setExpanded (true);
|
|
||||||
parse_entries (content.array (), root_dir_.relativeFilePath (samples_dir_name), parent);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("File System Error")
|
|
||||||
, tr ("Failed to open \"%1\"\nError: %2 - %3")
|
|
||||||
.arg (contents.fileName ())
|
|
||||||
.arg (contents.error ())
|
|
||||||
.arg (contents.errorString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::parse_entries (QJsonArray const& entries, QDir const& dir, QTreeWidgetItem * parent)
|
|
||||||
{
|
|
||||||
if (dir.isRelative () && !dir.path ().startsWith ('.'))
|
|
||||||
{
|
|
||||||
for (auto const& value: entries)
|
|
||||||
{
|
|
||||||
if (value.isObject ())
|
|
||||||
{
|
|
||||||
auto const& entry = value.toObject ();
|
|
||||||
auto const& name = entry["name"].toString ();
|
|
||||||
if (name.size () && !name.contains (QRegularExpression {R"([/:;])"}))
|
|
||||||
{
|
|
||||||
auto const& type = entry["type"].toString ();
|
|
||||||
if ("file" == type)
|
|
||||||
{
|
|
||||||
QUrl url {url_root_.resolved (dir.filePath (name))};
|
|
||||||
if (url.isValid ())
|
|
||||||
{
|
|
||||||
auto node = new FileNode {parent, network_manager_
|
|
||||||
, QDir {root_dir_.filePath (dir.path ())}.absoluteFilePath (name)
|
|
||||||
, url, http_only_};
|
|
||||||
FileNode::sync_blocker b {node};
|
|
||||||
node->setIcon (0, file_icon_);
|
|
||||||
node->setCheckState (0, node->local () ? Qt::Checked : Qt::Unchecked);
|
|
||||||
update (parent);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this
|
|
||||||
, tr ("URL Error")
|
|
||||||
, tr ("Invalid URL:\n\"%1\"")
|
|
||||||
.arg (url.toDisplayString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ("directory" == type)
|
|
||||||
{
|
|
||||||
auto node = new DirectoryNode {parent, name};
|
|
||||||
node->setIcon (0, dir_icon_);
|
|
||||||
auto const& entries = entry["entries"];
|
|
||||||
if (entries.isArray ())
|
|
||||||
{
|
|
||||||
parse_entries (entries.toArray ()
|
|
||||||
, QDir {root_dir_.relativeFilePath (dir.path ())}.filePath (name)
|
|
||||||
, node);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents entries must be a JSON array"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents entries must have a valid type"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents entries must have a valid name"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents entries must be JSON objects"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("JSON Error")
|
|
||||||
, tr ("Contents directories must be relative and within \"%1\"")
|
|
||||||
.arg (samples_dir_name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::abort ()
|
|
||||||
{
|
|
||||||
QTreeWidgetItemIterator iter {this};
|
|
||||||
while (*iter)
|
|
||||||
{
|
|
||||||
if ((*iter)->type () == FileNode::Type)
|
|
||||||
{
|
|
||||||
auto * node = static_cast<FileNode *> (*iter);
|
|
||||||
node->abort ();
|
|
||||||
}
|
|
||||||
++iter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// traverse the passed subtree accumulating the number of items, the
|
|
||||||
// number we have size data for, the bytes downloaded so far and the
|
|
||||||
// maximum bytes to expect
|
|
||||||
//
|
|
||||||
int recurse_children (QTreeWidgetItem const * item, int * counted
|
|
||||||
, qint64 * bytes, qint64 * max)
|
|
||||||
{
|
|
||||||
int items {0};
|
|
||||||
for (int index {0}; index < item->childCount (); ++index)
|
|
||||||
{
|
|
||||||
auto const * child = item->child (index);
|
|
||||||
if (child->type () == FileNode::Type) // only count files
|
|
||||||
{
|
|
||||||
++items;
|
|
||||||
if (auto size = child->data (1, Qt::UserRole).toLongLong ())
|
|
||||||
{
|
|
||||||
*max += size;
|
|
||||||
++*counted;
|
|
||||||
}
|
|
||||||
*bytes += child->data (1, Qt::DisplayRole).toLongLong ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// recurse into sub-directory subtrees
|
|
||||||
items += recurse_children (child, counted, bytes, max);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::update (QTreeWidgetItem * item)
|
|
||||||
{
|
|
||||||
// iterate the tree under item and accumulate the progress
|
|
||||||
if (item)
|
|
||||||
{
|
|
||||||
Q_ASSERT (item->type () == DirectoryNode::Type);
|
|
||||||
qint64 max {0};
|
|
||||||
qint64 bytes {0};
|
|
||||||
int counted {0};
|
|
||||||
|
|
||||||
// get the count, progress and size of children
|
|
||||||
int items {recurse_children (item, &counted, &bytes, &max)};
|
|
||||||
|
|
||||||
// estimate size of items not yet downloaded as average of
|
|
||||||
// those actually present
|
|
||||||
if (counted)
|
|
||||||
{
|
|
||||||
max += (items - counted) * max / counted;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save as our progress
|
|
||||||
item->setData (1, Qt::UserRole, max);
|
|
||||||
item->setData (1, Qt::DisplayRole, bytes);
|
|
||||||
|
|
||||||
// recurse up to top
|
|
||||||
update (item->parent ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Directory::authentication (QNetworkReply * /* reply */
|
|
||||||
, QAuthenticator * /* authenticator */)
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (this, tr ("Network Error"), tr ("Authentication required"));
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
#ifndef SAMPLE_DOWNLOADER_DIRECTORY_HPP__
|
|
||||||
#define SAMPLE_DOWNLOADER_DIRECTORY_HPP__
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QString>
|
|
||||||
#include <QTreeWidget>
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QSize>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QUrl>
|
|
||||||
|
|
||||||
#include "DirectoryDelegate.hpp"
|
|
||||||
#include "RemoteFile.hpp"
|
|
||||||
|
|
||||||
class Configuration;
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
class QTreeWidgetItem;
|
|
||||||
class QNetworkReply;
|
|
||||||
class QAuthenticator;
|
|
||||||
class QJsonArray;
|
|
||||||
|
|
||||||
class Directory final
|
|
||||||
: public QTreeWidget
|
|
||||||
, protected RemoteFile::ListenerInterface
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit Directory (Configuration const * configuration
|
|
||||||
, QNetworkAccessManager * network_manager
|
|
||||||
, QWidget * parent = nullptr);
|
|
||||||
|
|
||||||
QSize sizeHint () const override {return {400, 500};}
|
|
||||||
|
|
||||||
bool url_root (QUrl);
|
|
||||||
bool refresh (bool http_only);
|
|
||||||
void abort ();
|
|
||||||
void update (QTreeWidgetItem * item);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void error (QString const& title, QString const& message) override;
|
|
||||||
bool redirect_request (QUrl const&) override {return true;} // allow
|
|
||||||
void download_finished (bool success) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Q_SLOT void authentication (QNetworkReply *, QAuthenticator *);
|
|
||||||
void parse_entries (QJsonArray const& entries, QDir const& dir, QTreeWidgetItem * parent);
|
|
||||||
|
|
||||||
Configuration const * configuration_;
|
|
||||||
QNetworkAccessManager * network_manager_;
|
|
||||||
bool http_only_;
|
|
||||||
QDir root_dir_;
|
|
||||||
QUrl url_root_;
|
|
||||||
RemoteFile contents_;
|
|
||||||
DirectoryDelegate item_delegate_;
|
|
||||||
QIcon dir_icon_;
|
|
||||||
QIcon file_icon_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,44 +0,0 @@
|
|||||||
#include "DirectoryDelegate.hpp"
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QVariant>
|
|
||||||
#include <QString>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QModelIndex>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QStyleOptionViewItem>
|
|
||||||
#include <QStyleOptionProgressBar>
|
|
||||||
|
|
||||||
void DirectoryDelegate::paint (QPainter * painter, QStyleOptionViewItem const& option
|
|
||||||
, QModelIndex const& index) const
|
|
||||||
{
|
|
||||||
if (1 == index.column ())
|
|
||||||
{
|
|
||||||
QStyleOptionProgressBar progress_bar_option;
|
|
||||||
progress_bar_option.rect = option.rect;
|
|
||||||
progress_bar_option.state = QStyle::State_Enabled;
|
|
||||||
progress_bar_option.direction = QApplication::layoutDirection ();
|
|
||||||
progress_bar_option.fontMetrics = QApplication::fontMetrics ();
|
|
||||||
progress_bar_option.minimum = 0;
|
|
||||||
progress_bar_option.maximum = 100;
|
|
||||||
auto progress = index.data ().toLongLong ();
|
|
||||||
if (progress > 0)
|
|
||||||
{
|
|
||||||
auto percent = int (progress * 100 / index.data (Qt::UserRole).toLongLong ());
|
|
||||||
progress_bar_option.progress = percent;
|
|
||||||
progress_bar_option.text = QString::number (percent) + '%';
|
|
||||||
progress_bar_option.textVisible = true;
|
|
||||||
progress_bar_option.textAlignment = Qt::AlignCenter;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// not started
|
|
||||||
progress_bar_option.progress = -1;
|
|
||||||
}
|
|
||||||
QApplication::style ()->drawControl (QStyle::CE_ProgressBar, &progress_bar_option, painter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QStyledItemDelegate::paint (painter, option, index);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
#ifndef DIRECTORY_DELEGATE_HPP__
|
|
||||||
#define DIRECTORY_DELEGATE_HPP__
|
|
||||||
|
|
||||||
#include <QStyledItemDelegate>
|
|
||||||
|
|
||||||
class QObject;
|
|
||||||
class QStyleOptionVoew;
|
|
||||||
class QModelIndex;
|
|
||||||
class QPainter;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Styled item delegate that renders a progress bar in column #1
|
|
||||||
//
|
|
||||||
// model column #1 DisplayRole is the progress in bytes
|
|
||||||
// model column #1 UserRole is the expected number of bytes
|
|
||||||
//
|
|
||||||
class DirectoryDelegate final
|
|
||||||
: public QStyledItemDelegate
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit DirectoryDelegate (QObject * parent = nullptr)
|
|
||||||
: QStyledItemDelegate {parent}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void paint (QPainter * painter, QStyleOptionViewItem const& option
|
|
||||||
, QModelIndex const& index) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,51 +0,0 @@
|
|||||||
#ifndef DIRECTORY_NODE_HPP__
|
|
||||||
#define DIRECTORY_NODE_HPP__
|
|
||||||
|
|
||||||
#include <QTreeWidgetItem>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
//
|
|
||||||
// Tree widget item representing a file system directory.
|
|
||||||
//
|
|
||||||
// It renders the directory name in the first column and progress
|
|
||||||
// information in the 2nd column. The progress information consists of
|
|
||||||
// two 64 bit integer values, the 1st in the DisplayRole is the number
|
|
||||||
// of bytes received and the 2nd in the UserRole the total bytes
|
|
||||||
// expected. The progress information is not automatically
|
|
||||||
// maintained, see the Directory class for an example of how to
|
|
||||||
// dynamically maintain the DirectoryNode progress values. The 1st
|
|
||||||
// column also renders a tristate check box that controls the first
|
|
||||||
// column check boxes of child items.
|
|
||||||
//
|
|
||||||
class DirectoryNode final
|
|
||||||
: public QTreeWidgetItem
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit DirectoryNode (QTreeWidgetItem * parent, QString const& name)
|
|
||||||
: QTreeWidgetItem {parent, Type}
|
|
||||||
{
|
|
||||||
setFlags (flags () | Qt::ItemIsUserCheckable | Qt::ItemIsTristate);
|
|
||||||
setText (0, name);
|
|
||||||
setCheckState (0, Qt::Unchecked);
|
|
||||||
|
|
||||||
// initialize as empty, the owning QTreeWidget must maintain these
|
|
||||||
// progress values
|
|
||||||
setData (1, Qt::DisplayRole, 0ll); // progress in bytes
|
|
||||||
setData (1, Qt::UserRole, 0ll); // expected bytes
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator == (QString const& name) const
|
|
||||||
{
|
|
||||||
return name == text (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int constexpr Type {UserType};
|
|
||||||
};
|
|
||||||
|
|
||||||
inline
|
|
||||||
bool operator == (QString const& lhs, DirectoryNode const& rhs)
|
|
||||||
{
|
|
||||||
return rhs == lhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,74 +0,0 @@
|
|||||||
#include "FileNode.hpp"
|
|
||||||
|
|
||||||
#include <QVariant>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QFileInfo>
|
|
||||||
|
|
||||||
#include "Directory.hpp"
|
|
||||||
#include "MessageBox.hpp"
|
|
||||||
|
|
||||||
FileNode::FileNode (QTreeWidgetItem * parent
|
|
||||||
, QNetworkAccessManager * network_manager
|
|
||||||
, QString const& local_file_path
|
|
||||||
, QUrl const& url
|
|
||||||
, bool http_only)
|
|
||||||
: QTreeWidgetItem {parent, Type}
|
|
||||||
, remote_file_ {this, network_manager, local_file_path, http_only}
|
|
||||||
, block_sync_ {false}
|
|
||||||
{
|
|
||||||
sync_blocker b {this};
|
|
||||||
setFlags (flags () | Qt::ItemIsUserCheckable);
|
|
||||||
setText (0, QFileInfo {local_file_path}.fileName ()); // display
|
|
||||||
setData (0, Qt::UserRole, url);
|
|
||||||
setData (0, Qt::UserRole + 1, local_file_path); // local absolute path
|
|
||||||
setCheckState (0, Qt::Unchecked);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileNode::error (QString const& title, QString const& message)
|
|
||||||
{
|
|
||||||
MessageBox::warning_message (treeWidget (), title, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FileNode::sync (bool local)
|
|
||||||
{
|
|
||||||
if (block_sync_)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return remote_file_.sync (data (0, Qt::UserRole).toUrl (), local);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileNode::download_progress (qint64 bytes_received, qint64 total_bytes)
|
|
||||||
{
|
|
||||||
sync_blocker b {this};
|
|
||||||
setData (1, Qt::UserRole, total_bytes);
|
|
||||||
if (bytes_received < 0)
|
|
||||||
{
|
|
||||||
setData (1, Qt::DisplayRole, 0ll);
|
|
||||||
setCheckState (0, Qt::Unchecked);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setData (1, Qt::DisplayRole, bytes_received);
|
|
||||||
}
|
|
||||||
static_cast<Directory *> (treeWidget ())->update (parent ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileNode::download_finished (bool success)
|
|
||||||
{
|
|
||||||
sync_blocker b {this};
|
|
||||||
if (!success)
|
|
||||||
{
|
|
||||||
setData (1, Qt::UserRole, 0ll);
|
|
||||||
setData (1, Qt::DisplayRole, 0ll);
|
|
||||||
}
|
|
||||||
setCheckState (0, success ? Qt::Checked : Qt::Unchecked);
|
|
||||||
static_cast<Directory *> (treeWidget ())->update (parent ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileNode::abort ()
|
|
||||||
{
|
|
||||||
sync_blocker b {this};
|
|
||||||
remote_file_.abort ();
|
|
||||||
}
|
|
@ -1,67 +0,0 @@
|
|||||||
#ifndef FILE_NODE_HPP__
|
|
||||||
#define FILE_NODE_HPP__
|
|
||||||
|
|
||||||
#include <QTreeWidgetItem>
|
|
||||||
|
|
||||||
#include "RemoteFile.hpp"
|
|
||||||
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
class QString;
|
|
||||||
class QUrl;
|
|
||||||
|
|
||||||
//
|
|
||||||
// A holder for a RemoteFile object linked to a QTreeWidget row.
|
|
||||||
//
|
|
||||||
// It renders the file name in first column and holds download
|
|
||||||
// progress data in the second column. The progress information is a
|
|
||||||
// 64 bit integer number of bytes in the DisplayRole and a total bytes
|
|
||||||
// expected in the UserRole. The first column also renders a check box
|
|
||||||
// that downloads the file when checked and removes the downloaded
|
|
||||||
// file when unchecked. The URL and local absolute file path are
|
|
||||||
// stored in the UserData and UserData+1 roles of the first column.
|
|
||||||
//
|
|
||||||
class FileNode final
|
|
||||||
: public QTreeWidgetItem
|
|
||||||
, protected RemoteFile::ListenerInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit FileNode (QTreeWidgetItem * parent
|
|
||||||
, QNetworkAccessManager * network_manager
|
|
||||||
, QString const& local_path
|
|
||||||
, QUrl const& url
|
|
||||||
, bool http_only);
|
|
||||||
|
|
||||||
bool local () const {return remote_file_.local ();}
|
|
||||||
bool sync (bool local);
|
|
||||||
void abort ();
|
|
||||||
|
|
||||||
static int constexpr Type {UserType + 1};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Clients may use this RAII class to block nested calls to sync
|
|
||||||
// which may be troublesome, e.g. when UI updates cause recursion.
|
|
||||||
//
|
|
||||||
struct sync_blocker
|
|
||||||
{
|
|
||||||
sync_blocker (FileNode * node) : node_ {node} {node_->block_sync_ = true;}
|
|
||||||
sync_blocker (sync_blocker const&) = delete;
|
|
||||||
sync_blocker& operator = (sync_blocker const&) = delete;
|
|
||||||
~sync_blocker () {node_->block_sync_ = false;}
|
|
||||||
private:
|
|
||||||
FileNode * node_;
|
|
||||||
};
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void error (QString const& title, QString const& message) override;
|
|
||||||
bool redirect_request (QUrl const&) override {return true;} // allow
|
|
||||||
void download_progress (qint64 bytes_received, qint64 total_bytes) override;
|
|
||||||
void download_finished (bool success) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
RemoteFile remote_file_; // active download
|
|
||||||
bool block_sync_;
|
|
||||||
|
|
||||||
friend struct sync_blocker;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,5 +0,0 @@
|
|||||||
A UI for downloading sample files from a web server.
|
|
||||||
|
|
||||||
Works in concert with samples/CMakeLists.txt which generates the JSON
|
|
||||||
contents description file and has a build target upload-samples that
|
|
||||||
uploads the samples and content file to the project files server.
|
|
@ -1,271 +0,0 @@
|
|||||||
#include "RemoteFile.hpp"
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QByteArray>
|
|
||||||
|
|
||||||
#include "moc_RemoteFile.cpp"
|
|
||||||
|
|
||||||
RemoteFile::RemoteFile (ListenerInterface * listener, QNetworkAccessManager * network_manager
|
|
||||||
, QString const& local_file_path, bool http_only, QObject * parent)
|
|
||||||
: QObject {parent}
|
|
||||||
, listener_ {listener}
|
|
||||||
, network_manager_ {network_manager}
|
|
||||||
, local_file_ {local_file_path}
|
|
||||||
, http_only_ {http_only}
|
|
||||||
, is_valid_ {false}
|
|
||||||
, redirect_count_ {0}
|
|
||||||
, file_ {local_file_path}
|
|
||||||
{
|
|
||||||
local_file_.setCaching (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoteFile::local_file_path (QString const& name)
|
|
||||||
{
|
|
||||||
QFileInfo new_file {name};
|
|
||||||
new_file.setCaching (false);
|
|
||||||
if (new_file != local_file_)
|
|
||||||
{
|
|
||||||
if (local_file_.exists ())
|
|
||||||
{
|
|
||||||
QFile file {local_file_.absoluteFilePath ()};
|
|
||||||
if (!file.rename (new_file.absoluteFilePath ()))
|
|
||||||
{
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot rename file:\n\"%1\"\nto: \"%2\"\nError(%3): %4")
|
|
||||||
.arg (file.fileName ())
|
|
||||||
.arg (new_file.absoluteFilePath ())
|
|
||||||
.arg (file.error ())
|
|
||||||
.arg (file.errorString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::swap (local_file_, new_file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RemoteFile::local () const
|
|
||||||
{
|
|
||||||
auto is_local = (reply_ && !reply_->isFinished ()) || local_file_.exists ();
|
|
||||||
if (is_local)
|
|
||||||
{
|
|
||||||
auto size = local_file_.size ();
|
|
||||||
listener_->download_progress (size, size);
|
|
||||||
listener_->download_finished (true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listener_->download_progress (-1, 0);
|
|
||||||
}
|
|
||||||
return is_local;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RemoteFile::sync (QUrl const& url, bool local, bool force)
|
|
||||||
{
|
|
||||||
if (local)
|
|
||||||
{
|
|
||||||
if (!reply_ || reply_->isFinished ()) // not active download
|
|
||||||
{
|
|
||||||
if (force || !local_file_.exists () || url != url_)
|
|
||||||
{
|
|
||||||
url_ = url;
|
|
||||||
redirect_count_ = 0;
|
|
||||||
Q_ASSERT (!is_valid_);
|
|
||||||
download (url_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (reply_ && reply_->isRunning ())
|
|
||||||
{
|
|
||||||
reply_->abort ();
|
|
||||||
}
|
|
||||||
if (local_file_.exists ())
|
|
||||||
{
|
|
||||||
auto path = local_file_.absoluteDir ();
|
|
||||||
if (path.remove (local_file_.fileName ()))
|
|
||||||
{
|
|
||||||
listener_->download_progress (-1, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot delete file:\n\"%1\"")
|
|
||||||
.arg (local_file_.absoluteFilePath ()));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
path.rmpath (".");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoteFile::download (QUrl url)
|
|
||||||
{
|
|
||||||
if (QNetworkAccessManager::Accessible != network_manager_->networkAccessible ()) {
|
|
||||||
// try and recover network access for QNAM
|
|
||||||
network_manager_->setNetworkAccessible (QNetworkAccessManager::Accessible);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (url.isValid () && (!QSslSocket::supportsSsl () || http_only_))
|
|
||||||
{
|
|
||||||
url.setScheme ("http");
|
|
||||||
}
|
|
||||||
QNetworkRequest request {url};
|
|
||||||
request.setRawHeader ("User-Agent", "WSJT Sample Downloader");
|
|
||||||
request.setOriginatingObject (this);
|
|
||||||
|
|
||||||
// this blocks for a second or two the first time it is used on
|
|
||||||
// Windows - annoying
|
|
||||||
if (!is_valid_)
|
|
||||||
{
|
|
||||||
reply_ = network_manager_->head (request);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reply_ = network_manager_->get (request);
|
|
||||||
}
|
|
||||||
|
|
||||||
connect (reply_.data (), &QNetworkReply::finished, this, &RemoteFile::reply_finished);
|
|
||||||
connect (reply_.data (), &QNetworkReply::readyRead, this, &RemoteFile::store);
|
|
||||||
connect (reply_.data (), &QNetworkReply::downloadProgress
|
|
||||||
, [this] (qint64 bytes_received, qint64 total_bytes) {
|
|
||||||
// report progress of wanted file
|
|
||||||
if (is_valid_)
|
|
||||||
{
|
|
||||||
listener_->download_progress (bytes_received, total_bytes);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoteFile::abort ()
|
|
||||||
{
|
|
||||||
if (reply_ && reply_->isRunning ())
|
|
||||||
{
|
|
||||||
reply_->abort ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoteFile::reply_finished ()
|
|
||||||
{
|
|
||||||
if (!reply_) return; // we probably deleted it in an
|
|
||||||
// earlier call
|
|
||||||
QUrl redirect_url {reply_->attribute (QNetworkRequest::RedirectionTargetAttribute).toUrl ()};
|
|
||||||
if (reply_->error () == QNetworkReply::NoError && !redirect_url.isEmpty ())
|
|
||||||
{
|
|
||||||
if (listener_->redirect_request (redirect_url))
|
|
||||||
{
|
|
||||||
if (++redirect_count_ < 10) // maintain sanity
|
|
||||||
{
|
|
||||||
// follow redirect
|
|
||||||
download (reply_->url ().resolved (redirect_url));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listener_->download_finished (false);
|
|
||||||
listener_->error (tr ("Network Error")
|
|
||||||
, tr ("Too many redirects: %1")
|
|
||||||
.arg (redirect_url.toDisplayString ()));
|
|
||||||
is_valid_ = false; // reset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listener_->download_finished (false);
|
|
||||||
listener_->error (tr ("Network Error")
|
|
||||||
, tr ("Redirect not followed: %1")
|
|
||||||
.arg (redirect_url.toDisplayString ()));
|
|
||||||
is_valid_ = false; // reset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (reply_->error () != QNetworkReply::NoError)
|
|
||||||
{
|
|
||||||
file_.cancelWriting ();
|
|
||||||
file_.commit ();
|
|
||||||
listener_->download_finished (false);
|
|
||||||
is_valid_ = false; // reset
|
|
||||||
// report errors that are not due to abort
|
|
||||||
if (QNetworkReply::OperationCanceledError != reply_->error ())
|
|
||||||
{
|
|
||||||
listener_->error (tr ("Network Error"), reply_->errorString ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
auto path = QFileInfo {file_.fileName ()}.absoluteDir ();
|
|
||||||
if (is_valid_ && !file_.commit ())
|
|
||||||
{
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot commit changes to:\n\"%1\"")
|
|
||||||
.arg (file_.fileName ()));
|
|
||||||
path.rmpath ("."); // tidy empty directories
|
|
||||||
listener_->download_finished (false);
|
|
||||||
is_valid_ = false; // reset
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!is_valid_)
|
|
||||||
{
|
|
||||||
// now get the body content
|
|
||||||
is_valid_ = true;
|
|
||||||
download (reply_->url ().resolved (redirect_url));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listener_->download_finished (true);
|
|
||||||
is_valid_ = false; // reset
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (reply_ && reply_->isFinished ())
|
|
||||||
{
|
|
||||||
reply_->deleteLater ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RemoteFile::store ()
|
|
||||||
{
|
|
||||||
if (is_valid_)
|
|
||||||
{
|
|
||||||
if (!file_.isOpen ())
|
|
||||||
{
|
|
||||||
// create temporary file in the final location
|
|
||||||
auto path = QFileInfo {file_.fileName ()}.absoluteDir ();
|
|
||||||
if (path.mkpath ("."))
|
|
||||||
{
|
|
||||||
if (!file_.open (QSaveFile::WriteOnly))
|
|
||||||
{
|
|
||||||
abort ();
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot open file:\n\"%1\"\nError(%2): %3")
|
|
||||||
.arg (path.path ())
|
|
||||||
.arg (file_.error ())
|
|
||||||
.arg (file_.errorString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
abort ();
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot make path:\n\"%1\"")
|
|
||||||
.arg (path.path ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (file_.write (reply_->read (reply_->bytesAvailable ())) < 0)
|
|
||||||
{
|
|
||||||
abort ();
|
|
||||||
listener_->error (tr ("File System Error")
|
|
||||||
, tr ("Cannot write to file:\n\"%1\"\nError(%2): %3")
|
|
||||||
.arg (file_.fileName ())
|
|
||||||
.arg (file_.error ())
|
|
||||||
.arg (file_.errorString ()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
#ifndef REMOTE_FILE_HPP__
|
|
||||||
#define REMOTE_FILE_HPP__
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QString>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QSaveFile>
|
|
||||||
#include <QPointer>
|
|
||||||
|
|
||||||
class QNetworkAccessManager;
|
|
||||||
class QNetworkReply;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Synchronize an individual file specified by a URL to the local file
|
|
||||||
// system
|
|
||||||
//
|
|
||||||
class RemoteFile final
|
|
||||||
: public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
//
|
|
||||||
// Clients of RemoteFile must provide an instance of this
|
|
||||||
// interface. It may be used to receive information and requests
|
|
||||||
// from the RemoteFile instance as it does its work.
|
|
||||||
//
|
|
||||||
class ListenerInterface
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
ListenerInterface () {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void error (QString const& title, QString const& message) = 0;
|
|
||||||
virtual bool redirect_request (QUrl const&) {return false;} // disallow
|
|
||||||
virtual void download_progress (qint64 /* bytes_received */, qint64 /* total_bytes */) {}
|
|
||||||
virtual void download_finished (bool /* success */) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit RemoteFile (ListenerInterface * listener, QNetworkAccessManager * network_manager
|
|
||||||
, QString const& local_file_path, bool http_only = false
|
|
||||||
, QObject * parent = nullptr);
|
|
||||||
|
|
||||||
// true if local file exists or will do very soon
|
|
||||||
bool local () const;
|
|
||||||
|
|
||||||
// download/remove the local file
|
|
||||||
bool sync (QUrl const& url, bool local = true, bool force = false);
|
|
||||||
|
|
||||||
// abort an active download
|
|
||||||
void abort ();
|
|
||||||
|
|
||||||
// change the local location, this will rename if the file exists locally
|
|
||||||
void local_file_path (QString const&);
|
|
||||||
|
|
||||||
QString local_file_path () const {return local_file_.absoluteFilePath ();}
|
|
||||||
QUrl url () const {return url_;}
|
|
||||||
|
|
||||||
// always use an http scheme for remote URLs
|
|
||||||
void http_only (bool flag = true) {http_only_ = flag;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void download (QUrl url);
|
|
||||||
void reply_finished ();
|
|
||||||
|
|
||||||
Q_SLOT void store ();
|
|
||||||
|
|
||||||
Q_SIGNAL void redirect (QUrl const&, unsigned redirect_count);
|
|
||||||
Q_SIGNAL void downloadProgress (qint64 bytes_received, qint64 total_bytes);
|
|
||||||
Q_SIGNAL void finished ();
|
|
||||||
|
|
||||||
ListenerInterface * listener_;
|
|
||||||
QNetworkAccessManager * network_manager_;
|
|
||||||
QFileInfo local_file_;
|
|
||||||
bool http_only_;
|
|
||||||
QUrl url_;
|
|
||||||
QPointer<QNetworkReply> reply_;
|
|
||||||
bool is_valid_;
|
|
||||||
unsigned redirect_count_;
|
|
||||||
QSaveFile file_;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,243 +0,0 @@
|
|||||||
set (LANGUAGES
|
|
||||||
en
|
|
||||||
)
|
|
||||||
|
|
||||||
set (common_SRCS
|
|
||||||
common/communication.adoc
|
|
||||||
common/license.adoc
|
|
||||||
common/links.adoc
|
|
||||||
)
|
|
||||||
|
|
||||||
set (UG_SRCS
|
|
||||||
docinfo.html
|
|
||||||
docinfo.xml
|
|
||||||
acknowledgements.adoc
|
|
||||||
astro_data.adoc
|
|
||||||
config-details.adoc
|
|
||||||
controls-functions-center.adoc
|
|
||||||
controls-functions-left.adoc
|
|
||||||
controls-functions-main-window.adoc
|
|
||||||
controls-functions-menus.adoc
|
|
||||||
controls-functions-messages.adoc
|
|
||||||
controls-functions-status-bar.adoc
|
|
||||||
controls-functions-wide-graph.adoc
|
|
||||||
cooperating-programs.adoc
|
|
||||||
decoder_notes.adoc
|
|
||||||
faq.adoc
|
|
||||||
font-sizes.adoc
|
|
||||||
install-from-source.adoc
|
|
||||||
install-linux.adoc
|
|
||||||
install-mac.adoc
|
|
||||||
install-windows.adoc
|
|
||||||
introduction.adoc
|
|
||||||
measurement_tools.adoc
|
|
||||||
protocols.adoc
|
|
||||||
logging.adoc
|
|
||||||
make-qso.adoc
|
|
||||||
measurement_tools.adoc
|
|
||||||
new_features.adoc
|
|
||||||
platform-dependencies.adoc
|
|
||||||
protocols.adoc
|
|
||||||
settings-advanced.adoc
|
|
||||||
settings-audio.adoc
|
|
||||||
settings-colors.adoc
|
|
||||||
settings-frequencies.adoc
|
|
||||||
settings-general.adoc
|
|
||||||
settings-radio.adoc
|
|
||||||
settings-reporting.adoc
|
|
||||||
settings-txmacros.adoc
|
|
||||||
support.adoc
|
|
||||||
system-requirements.adoc
|
|
||||||
transceiver-setup.adoc
|
|
||||||
tutorial-example1.adoc
|
|
||||||
tutorial-example2.adoc
|
|
||||||
tutorial-example3.adoc
|
|
||||||
tutorial-main-window.adoc
|
|
||||||
tutorial-wide-graph-settings.adoc
|
|
||||||
utilities.adoc
|
|
||||||
vhf-features.adoc
|
|
||||||
wsjtx-main.adoc
|
|
||||||
wspr.adoc
|
|
||||||
)
|
|
||||||
|
|
||||||
set (UG_IMGS
|
|
||||||
images/130610_2343-wav-80.png
|
|
||||||
images/170709_135615.wav.png
|
|
||||||
images/AstroData_2.png
|
|
||||||
images/Astronomical_data.png
|
|
||||||
images/auto-seq.png
|
|
||||||
images/band-settings.png
|
|
||||||
images/colors.png
|
|
||||||
images/config-menu.png
|
|
||||||
images/decode-menu.png
|
|
||||||
images/decodes.png
|
|
||||||
images/download_samples.png
|
|
||||||
images/echo_144.png
|
|
||||||
images/file-menu.png
|
|
||||||
images/FreqCal.png
|
|
||||||
images/FreqCal_Graph.png
|
|
||||||
images/FreqCal_Results.png
|
|
||||||
images/freemsg.png
|
|
||||||
images/ft8_decodes.png
|
|
||||||
images/help-menu.png
|
|
||||||
images/JT4F.png
|
|
||||||
images/JT65B.png
|
|
||||||
images/keyboard-shortcuts.png
|
|
||||||
images/MSK144.png
|
|
||||||
images/QRA64.png
|
|
||||||
images/WSPR_WideGraphControls.png
|
|
||||||
images/WSPR_1a.png
|
|
||||||
images/WSPR_2.png
|
|
||||||
images/jtalert.png
|
|
||||||
images/keyboard-shortcuts.png
|
|
||||||
images/log-qso.png
|
|
||||||
images/MacAppMenu.png
|
|
||||||
images/main-ui.png
|
|
||||||
images/main-ui-controls.png
|
|
||||||
images/misc-controls-center.png
|
|
||||||
images/misc-main-ui.png
|
|
||||||
images/mode-menu.png
|
|
||||||
images/new-msg-box.png
|
|
||||||
images/psk-reporter.png
|
|
||||||
images/r3666-config-screen-80.png
|
|
||||||
images/r3666-main-ui-80.png
|
|
||||||
images/r4148-txmac-ui.png
|
|
||||||
images/RadioTab.png
|
|
||||||
images/reporting.png
|
|
||||||
images/save-menu.png
|
|
||||||
images/settings-advanced.png
|
|
||||||
images/settings-audio.png
|
|
||||||
images/settings-frequencies.png
|
|
||||||
images/settings-general.png
|
|
||||||
images/setup-menu.png
|
|
||||||
images/special-mouse-commands.png
|
|
||||||
images/status-bar-a.png
|
|
||||||
images/tools-menu.png
|
|
||||||
images/traditional-msg-box.png
|
|
||||||
images/tx-macros.png
|
|
||||||
images/VHF_controls.png
|
|
||||||
images/view-menu.png
|
|
||||||
images/wide-graph-controls.png
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
find_program (ASCIIDOCTOR_EXECUTABLE NAMES asciidoctor)
|
|
||||||
if (NOT ASCIIDOCTOR_EXECUTABLE)
|
|
||||||
message (FATAL_ERROR "asciidoctor is required to build the documentation
|
|
||||||
|
|
||||||
Building the documenation may optionally be turned off by setting the CMake
|
|
||||||
option WSJT_GENERATE_DOCS to OFF.")
|
|
||||||
endif (NOT ASCIIDOCTOR_EXECUTABLE)
|
|
||||||
|
|
||||||
find_program (FOPUB_EXECUTABLE NAMES fopub)
|
|
||||||
|
|
||||||
include (CMakeParseArguments)
|
|
||||||
|
|
||||||
# generate a document from asciidoc text files(s)
|
|
||||||
#
|
|
||||||
# HTML - generate an HTML document
|
|
||||||
# PDF - generate a PDF document
|
|
||||||
# SOURCE - top level asciidoc file
|
|
||||||
# ASCIIDOCTOR_OPTIONS - asciidoctor command options
|
|
||||||
# DEPENDS - dependent files
|
|
||||||
function (document)
|
|
||||||
cmake_parse_arguments (_args "HTML" "SOURCE;LANG;OUTPUT" "ASCIIDOCTOR_OPTIONS;PDF;DEPENDS" ${ARGN})
|
|
||||||
get_filename_component (_source_path ${_args_SOURCE} PATH)
|
|
||||||
get_filename_component (_source_name ${_args_SOURCE} NAME)
|
|
||||||
get_filename_component (_output_name_we ${_args_SOURCE} NAME_WE)
|
|
||||||
|
|
||||||
# HTML
|
|
||||||
if (${_args_HTML})
|
|
||||||
set (_html_file ${CMAKE_CURRENT_BINARY_DIR}/${_output_name_we}_${lang}.html)
|
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${_html_file}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${_source_path}/${lang}
|
|
||||||
COMMAND ${ASCIIDOCTOR_EXECUTABLE} ${_args_ASCIIDOCTOR_OPTIONS}
|
|
||||||
-b html5
|
|
||||||
-a VERSION_MAJOR=${WSJTX_VERSION_MAJOR}
|
|
||||||
-a VERSION_MINOR=${WSJTX_VERSION_MINOR}
|
|
||||||
-a VERSION_PATCH=${WSJTX_VERSION_PATCH}
|
|
||||||
-a VERSION=${wsjtx_VERSION}
|
|
||||||
--out-file=${_html_file} ${_source_name}
|
|
||||||
DEPENDS ${_args_DEPENDS}
|
|
||||||
COMMENT "Generating ${_html_file}"
|
|
||||||
)
|
|
||||||
list (APPEND _output_files ${_html_file})
|
|
||||||
endif (${_args_HTML})
|
|
||||||
|
|
||||||
# PDF
|
|
||||||
if (_args_PDF AND EXISTS ${FOPUB_EXECUTABLE})
|
|
||||||
set (_docbook_file ${CMAKE_CURRENT_BINARY_DIR}/${_output_name_we}_${lang}.xml)
|
|
||||||
set (_pdf_file_we ${CMAKE_CURRENT_BINARY_DIR}/${_output_name_we}_${lang})
|
|
||||||
if (${lang} MATCHES "^(en|es|fr)$") # en-us, fr-ca and es-{mx,co} use US-Letter or equivalent
|
|
||||||
set (_usl_commands
|
|
||||||
COMMAND ${FOPUB_EXECUTABLE} ARGS ${_docbook_file} ${_args_PDF} -param paper.type USLetter
|
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E rename ${_pdf_file_we}.pdf '${_pdf_file_we} \(USLetter\).pdf'
|
|
||||||
)
|
|
||||||
list (APPEND _output_files "${_pdf_file_we} (USLetter).pdf")
|
|
||||||
endif ()
|
|
||||||
list (APPEND _output_files "${_pdf_file_we}.pdf")
|
|
||||||
add_custom_command (
|
|
||||||
OUTPUT ${_docbook_file} ${_output_files}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${_source_path}/${lang}
|
|
||||||
COMMAND ${ASCIIDOCTOR_EXECUTABLE} ARGS ${_args_ASCIIDOCTOR_OPTIONS}
|
|
||||||
-b docbook
|
|
||||||
-a data-uri!
|
|
||||||
-a VERSION_MAJOR=${WSJTX_VERSION_MAJOR}
|
|
||||||
-a VERSION_MINOR=${WSJTX_VERSION_MINOR}
|
|
||||||
-a VERSION_PATCH=${WSJTX_VERSION_PATCH}
|
|
||||||
-a VERSION=${wsjtx_VERSION}
|
|
||||||
-D ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
-o ${_docbook_file} ${_source_name}
|
|
||||||
${_usl_commands}
|
|
||||||
COMMAND ${FOPUB_EXECUTABLE} ARGS ${_docbook_file} ${_args_PDF} -param paper.type A4
|
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E rename ${_pdf_file_we}.pdf '${_pdf_file_we}.pdf'
|
|
||||||
DEPENDS ${_args_DEPENDS}
|
|
||||||
COMMENT "Generating ${_output_files}"
|
|
||||||
)
|
|
||||||
endif (_args_PDF AND EXISTS ${FOPUB_EXECUTABLE})
|
|
||||||
|
|
||||||
set (${_args_OUTPUT} ${_output_files} PARENT_SCOPE)
|
|
||||||
endfunction (document)
|
|
||||||
|
|
||||||
set (htmls)
|
|
||||||
set (pdfs)
|
|
||||||
foreach (lang ${LANGUAGES})
|
|
||||||
set (_sources)
|
|
||||||
foreach (_src ${UG_SRCS} ${UG_IMGS})
|
|
||||||
list (APPEND _sources "user_guide/${lang}/${_src}")
|
|
||||||
endforeach ()
|
|
||||||
document(
|
|
||||||
HTML
|
|
||||||
SOURCE user_guide/wsjtx-main.adoc
|
|
||||||
LANG "${lang}"
|
|
||||||
OUTPUT html
|
|
||||||
ASCIIDOCTOR_OPTIONS -d book -a data-uri -a toc=left -a max-width=1024px
|
|
||||||
DEPENDS ${common_SRCS} ${_sources}
|
|
||||||
)
|
|
||||||
document(
|
|
||||||
PDF -param body.font.master 11 -param body.font.family "'Noto Sans, Helvetica, sans-serif'" -param title.font.family "'Noto Serif, Times New Roman, serif'" -param page.margin.inner 1cm -param page.margin.outer 1cm -param page.margin.top 0.75cm -param page.margin.bottom 0.5cm -param generate.toc 0
|
|
||||||
SOURCE user_guide/wsjtx-main.adoc
|
|
||||||
LANG "${lang}"
|
|
||||||
OUTPUT pdf
|
|
||||||
ASCIIDOCTOR_OPTIONS -d book
|
|
||||||
DEPENDS ${common_SRCS} ${_sources}
|
|
||||||
)
|
|
||||||
list (APPEND htmls "${html}")
|
|
||||||
list (APPEND pdfs "${pdf}")
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
add_custom_target (docs ALL DEPENDS ${htmls} ${pdfs})
|
|
||||||
|
|
||||||
foreach (_html ${htmls})
|
|
||||||
get_filename_component (_path ${_html} PATH)
|
|
||||||
get_filename_component (_nwe ${_html} NAME_WE)
|
|
||||||
get_filename_component (_ext ${_html} EXT)
|
|
||||||
string (REGEX REPLACE "_en$" "" _nwe ${_nwe})
|
|
||||||
install (FILES
|
|
||||||
${_html}
|
|
||||||
DESTINATION ${CMAKE_INSTALL_DOCDIR}
|
|
||||||
RENAME ${_nwe}-${wsjtx_VERSION}${_ext}
|
|
||||||
#COMPONENT runtime
|
|
||||||
)
|
|
||||||
endforeach ()
|
|
40
doc/README
@ -1,40 +0,0 @@
|
|||||||
This folder contains the sources of WSJT-X documentation. To build
|
|
||||||
these you will need the asciidoctor tool installed.
|
|
||||||
|
|
||||||
If you do not wish to build the documentation, it is possible to skip
|
|
||||||
this directory in the WSJT-X build by setting the CMake option
|
|
||||||
WSJT_GENERATE_DOCS to OFF in your build tree.
|
|
||||||
|
|
||||||
|
|
||||||
On Linux
|
|
||||||
========
|
|
||||||
|
|
||||||
You will probably have these installed already if you are building the
|
|
||||||
WSJT-X manpages, if you are not you will just need to install
|
|
||||||
asciidoc:
|
|
||||||
|
|
||||||
sudo apt-get install asciidoctor
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
sudo yum install asciidoctor
|
|
||||||
|
|
||||||
or whatever your distribution and package management requires.
|
|
||||||
|
|
||||||
|
|
||||||
On Mac OS X
|
|
||||||
===========
|
|
||||||
|
|
||||||
I recommend MacPorts:
|
|
||||||
|
|
||||||
sudo port install rb-rubygems
|
|
||||||
sudo gem install asciidoctor
|
|
||||||
|
|
||||||
|
|
||||||
On Windows
|
|
||||||
==========
|
|
||||||
|
|
||||||
The asciidoctor tool is a Ruby script so you will need to install a
|
|
||||||
version of Ruby. The gem tool is a good way to install asciidoctor:
|
|
||||||
|
|
||||||
gem install asciidoctor
|
|
@ -1,17 +0,0 @@
|
|||||||
The following are established communication channels for the WSJT Group.
|
|
||||||
For updates and other information on the continuing development of _WSJT_,
|
|
||||||
_MAP65_, _WSPR_, _WSPR-X_, and _WSJT-X_ you are invited to subscribe to the
|
|
||||||
{dev_mail_list}.
|
|
||||||
|
|
||||||
.General Information
|
|
||||||
* Main Site: {homepage}
|
|
||||||
* Development Site: {projsummary}
|
|
||||||
|
|
||||||
.Development Related
|
|
||||||
* Project Manager, email: {joe_taylor}
|
|
||||||
* Development Email: {devmail1}
|
|
||||||
* Development Mailing List (join): {dev_mail_list}
|
|
||||||
* Repository Updates, (join): {dev_mail_svn}
|
|
||||||
|
|
||||||
.Community Related
|
|
||||||
* Discussion Board: {wsjt_yahoo_group}
|
|
@ -1,29 +0,0 @@
|
|||||||
include::./links.adoc[]
|
|
||||||
_{prog}_ is free software: you may redistribute and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
_{prog}_ is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this documentation. If not, see {gnu_gpl}.
|
|
||||||
|
|
||||||
Except where otherwise noted, all algorithms, protocol designs, source
|
|
||||||
code, and supporting files contained in the _{prog}_ package are the
|
|
||||||
intellectual property of the program's authors. The authors assert
|
|
||||||
*Copyright ownership* of this material, whether or not such copyright
|
|
||||||
notice appears in each individual file. Others who make fair use of
|
|
||||||
our work under terms of the GNU General Public License must display
|
|
||||||
the following copyright notice prominently:
|
|
||||||
|
|
||||||
*The algorithms, source code, look-and-feel of _{prog}_ and related
|
|
||||||
programs, and protocol specifications for the modes FSK441, FT8, JT4,
|
|
||||||
JT6M, JT9, JT65, JTMS, QRA64, ISCAT, and MSK144 are Copyright (C)
|
|
||||||
2001-2018 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.*
|
|
@ -1,128 +0,0 @@
|
|||||||
////
|
|
||||||
Link file to hold all links
|
|
||||||
File Location: ./doc/common/links.adoc
|
|
||||||
Usage example: include::../common/links.adoc[]
|
|
||||||
Syntax: [link-id] [link] [displayed text]
|
|
||||||
|
|
||||||
Example:
|
|
||||||
:pskreporter: http://pskreporter.info/pskmap.html[PSK Reporter]
|
|
||||||
|
|
||||||
[link-id] = :pskreporter:
|
|
||||||
[link] http://pskreporter.info/pskmap.html
|
|
||||||
[displayed text] PSK Reporter
|
|
||||||
|
|
||||||
Perform searches from the doc root directory: doc
|
|
||||||
Search: grep -rl --exclude-dir="*\.svn" {pskreporter} .
|
|
||||||
grep -rl --exclude-dir="*\.svn" PSK Reporter .
|
|
||||||
grep -rl --exclude-dir="*\.svn" {devsvn} .
|
|
||||||
grep -rl --exclude-dir="*\.svn" {kvasd} .
|
|
||||||
grep -rl --exclude-dir="*\.svn" {ntpsetup} .
|
|
||||||
|
|
||||||
Include links.adoc: grep -rl --exclude-dir="*\.svn" pskreporter .
|
|
||||||
Exclude links.adoc: grep -rl --exclude-dir="*\.svn" {pskreporter} .
|
|
||||||
|
|
||||||
Note(s):
|
|
||||||
a). Don't forget a space then "." at the end.
|
|
||||||
|
|
||||||
b). To include links.adoc file itself, remove the brackets {} from
|
|
||||||
the pattern search:
|
|
||||||
|
|
||||||
c). Look at each of the files listed to ensure the [displayed text]
|
|
||||||
still makes sense in the caption. If not, just add another link. Be
|
|
||||||
aware of the translators requirements by trying to keep the displayed
|
|
||||||
text language agnostic or neutral e.g. use a proper noun like a
|
|
||||||
persons name or a document title in the language of the linked
|
|
||||||
document. Do not use plain English generic words for link text link
|
|
||||||
"here".
|
|
||||||
|
|
||||||
d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
// General URL's
|
|
||||||
//:launchpadac6sl: https://launchpad.net/~jnogatch/+archive/wsjtx[WSJT-X Linux Packages]
|
|
||||||
:alarmejt: http://f5jmh.free.fr/index.php?page=english[AlarmeJT]
|
|
||||||
:asciidoc_cheatsheet: http://powerman.name/doc/asciidoc[AsciiDoc Cheatsheet]
|
|
||||||
:asciidoc_help: http://www.methods.co.nz/asciidoc/userguide.html[AsciiDoc User Guide]
|
|
||||||
:asciidoc_questions: http://www.methods.co.nz/asciidoc/faq.html[AsciiDoc FAQ]
|
|
||||||
:asciidoc_syntax: http://xpt.sourceforge.net/techdocs/nix/tool/asciidoc-syn/ascs01-AsciiDocMarkupSyntaxQuickSummary/single/[AsciiDoc Syntax]
|
|
||||||
:asciidoctor_style: http://asciidoctor.org/docs/asciidoc-writers-guide/#delimited-blocks[AsciiDoctor Styles Guide]
|
|
||||||
:asciidoctor_syntax: http://asciidoctor.org/docs/asciidoc-writers-guide/#delimited-blocks[AsciiDoctor Syntax Guide]
|
|
||||||
:cc_by_sa: http://creativecommons.org/licenses/by-sa/3.0/[Commons Attribution-ShareAlike 3.0 Unported License]
|
|
||||||
:debian32: http://physics.princeton.edu/pulsar/K1JT/wsjtx_{VERSION}_i386.deb[wsjtx_{VERSION}_i386.deb]
|
|
||||||
:debian64: http://physics.princeton.edu/pulsar/K1JT/wsjtx_{VERSION}_amd64.deb[wsjtx_{VERSION}_amd64.deb]
|
|
||||||
:raspbian: http://physics.princeton.edu/pulsar/K1JT/wsjtx_{VERSION}_armhf.deb[wsjtx_{VERSION}_armhf.deb]
|
|
||||||
:debian: http://www.debian.org/[Debian]
|
|
||||||
:dev_guide: http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/wsjt-dev-guide.html[Dev-Guide]
|
|
||||||
:devsvn1: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/[Devel-SVN]
|
|
||||||
:devsvn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/[SourceForge]
|
|
||||||
:dimension4: http://www.thinkman.com/dimension4/[Thinking Man Software]
|
|
||||||
:download: http://physics.princeton.edu/pulsar/K1JT/wsjtx.html[Download Page]
|
|
||||||
:dxatlas: http://www.dxatlas.com/[Afreet Software, Inc.]
|
|
||||||
:dxlcommander: http://www.dxlabsuite.com/commander/[Commander]
|
|
||||||
:dxlsuite: http://www.dxlabsuite.com/[DX Lab Suite]
|
|
||||||
:fedora32: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-i686.rpm[wsjtx-{VERSION}-i686.rpm]
|
|
||||||
:fedora64: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-x86_64.rpm[wsjtx-{VERSION}-x86_64.rpm]
|
|
||||||
:fmt_arrl: http://www.arrl.org/frequency-measuring-test[ARRL FMT Info]
|
|
||||||
:fmt_group: https://groups.yahoo.com/neo/groups/FMT-nuts/info[FMT Group]
|
|
||||||
:fmt_k5cm: http://www.k5cm.com/[FMT Event Info]
|
|
||||||
:fmt_wspr: http://www.physics.princeton.edu/pulsar/K1JT/FMT_User.pdf[Accurate Frequency Measurements with your WSPR Setup]
|
|
||||||
:ft8_tips: http://www.physics.princeton.edu/pulsar/K1JT/FT8_Operating_Tips.pdf[here]
|
|
||||||
:ft8_DXped: http://physics.princeton.edu/pulsar/k1jt/FT8_DXpedition_Mode.pdf[FT8 DXpedition Mode]
|
|
||||||
:gnu_gpl: http://www.gnu.org/licenses/gpl-3.0.txt[GNU General Public License]
|
|
||||||
:homepage: http://physics.princeton.edu/pulsar/K1JT/[WSJT Home Page]
|
|
||||||
:hrd: http://www.hrdsoftwarellc.com/[Ham Radio Deluxe]
|
|
||||||
:jt4eme: http://physics.princeton.edu/pulsar/K1JT/WSJT-X_1.6.0_for_JT4_v7.pdf[Using WSJT-X for JT4 EME Operation]
|
|
||||||
:jt65protocol: http://physics.princeton.edu/pulsar/K1JT/JT65.pdf[QEX]
|
|
||||||
:jtalert: http://hamapps.com/[JT-Alert]
|
|
||||||
:launchpadki7mt: https://launchpad.net/~ki7mt[KI7MT PPA's]
|
|
||||||
:log4om: http://www.log4om.com[Log4OM]
|
|
||||||
:lunarEchoes: http://physics.princeton.edu/pulsar/K1JT/LunarEchoes_QEX.pdf[QEX]
|
|
||||||
:msk144: http://physics.princeton.edu/pulsar/k1jt/MSK144_Protocol_QEX.pdf[QEX]
|
|
||||||
:msys_url: http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/[MSYS Download]
|
|
||||||
:ntpsetup: http://www.satsignal.eu/ntp/setup.html[Network Time Protocol Setup]
|
|
||||||
:osx_instructions: http://physics.princeton.edu/pulsar/K1JT/OSX_Readme[Mac OS X Install Instructions]
|
|
||||||
:ppa: http://en.wikipedia.org/wiki/Personal_Package_Archive[PPA]
|
|
||||||
:projsummary: http://sourceforge.net/projects/wsjt/[Project Summary]
|
|
||||||
:pskreporter: http://pskreporter.info/pskmap.html[PSK Reporter]
|
|
||||||
:sourceforge: https://sourceforge.net/user/registration[SourceForge]
|
|
||||||
:sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK]
|
|
||||||
:ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice]
|
|
||||||
:wsjt_yahoo_group: https://groups.yahoo.com/neo/groups/wsjtgroup/info[WSJT Group]
|
|
||||||
:wsjtx: http://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]
|
|
||||||
:wspr0_guide: http://www.physics.princeton.edu/pulsar/K1JT/WSPR0_Instructions.TXT[WSPR0 Guide]
|
|
||||||
:wspr: http://physics.princeton.edu/pulsar/K1JT/wspr.html[WSPR Home Page]
|
|
||||||
:wsprnet: http://wsprnet.org/drupal/[WSPRnet]
|
|
||||||
:wsprnet_activity: http://wsprnet.org/drupal/wsprnet/activity[WSPRnet Activity page]
|
|
||||||
|
|
||||||
// Download Links
|
|
||||||
:cty_dat: http://www.country-files.com/cty/[Amateur Radio Country Files]
|
|
||||||
:jtbridge: http://jt-bridge.eller.nu/[JT-Bridge]
|
|
||||||
:jtsdk_doc: http://physics.princeton.edu/pulsar/K1JT/JTSDK-DOC.exe[Download]
|
|
||||||
:jtsdk_installer: http://sourceforge.net/projects/jtsdk/files/win32/2.0.0/JTSDK-2.0.0-B2-Win32.exe/download[Download]
|
|
||||||
:jtsdk_omnirig: http://sourceforge.net/projects/jtsdk/files/win32/2.0.0/base/contrib/OmniRig.zip/download[Download]
|
|
||||||
:jtsdk_py: http://physics.princeton.edu/pulsar/K1JT/JTSDK-PY.exe[Download]
|
|
||||||
:jtsdk_qt: http://physics.princeton.edu/pulsar/K1JT/JTSDK-QT.exe[Download]
|
|
||||||
:jtsdk_vcredist: http://sourceforge.net/projects/jtsdk/files/win32/2.0.0/base/contrib/vcredist_x86.exe/download[Download]
|
|
||||||
:nh6z: http://www.nh6z.net/Amatuer_Radio_Station_NH6Z/Other_Peoples_Software.html[here]
|
|
||||||
:omnirig: http://www.dxatlas.com/OmniRig/Files/OmniRig.zip[Omni-Rig]
|
|
||||||
:osx: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-Darwin.dmg[wsjtx-{VERSION}-Darwin.dmg]
|
|
||||||
:QRA64_EME: http://physics.princeton.edu/pulsar/K1JT/QRA64_EME.pdf[QRA64 for microwave EME]
|
|
||||||
:svn: http://subversion.apache.org/packages.html#windows[Subversion]
|
|
||||||
:win32: http://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
|
|
||||||
:wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
|
|
||||||
:wsjt_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/[WSJT Source Repository]
|
|
||||||
:wspr_code: http://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
|
|
||||||
:wspr_svn: http://sourceforge.net/p/wsjt/wsjt/HEAD/tree/branches/wspr/[WSPR Source Repository]
|
|
||||||
|
|
||||||
// MAIL-TO links
|
|
||||||
:alex_efros: mailto:powerman@powerman.name[Alex Efros]
|
|
||||||
:bill_somerville: mailto:g4wjs -at- c l a s s d e s i g n -dot- com [G4WJS]
|
|
||||||
:dev_mail_list: http://sourceforge.net/mailarchive/forum.php?forum_name=wsjt-devel[WSJT Developers Email List]
|
|
||||||
:dev_mail_svn: https://sourceforge.net/auth/subscriptions/[WSJT SVN Archives]
|
|
||||||
:devmail: mailto:wsjt-devel@lists.sourceforge.net[wsjt-devel@lists.sourceforge.net]
|
|
||||||
:devmail1: mailto:wsjt-devel@lists.sourceforge.net[Post Message]
|
|
||||||
:wsjtgroup_mail: mailto:wsjtgroup@yahoogroups.com[Post Message]
|
|
||||||
:greg_beam: mailto:ki7mt@yahoo.com[KI7MT]
|
|
||||||
:joe_taylor: mailto:joe@princeton.edu[K1JT]
|
|
||||||
:stuart_rackman: mailto:srackham@gmail.com[Stuart Rackham]
|
|
@ -1,29 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
The _WSJT_ project was started in 2001. Since 2005 it has been an
|
|
||||||
Open Source project, and it now includes programs _WSJT_, _MAP65_,
|
|
||||||
_WSPR_, _WSJT-X_, and _WSPR-X_. All code is licensed under the
|
|
||||||
GNU Public License (GPL). Many users of these programs, too numerous
|
|
||||||
to mention here individually, have contributed suggestions and advice
|
|
||||||
that have greatly aided the development of _WSJT_ and its sister
|
|
||||||
programs.
|
|
||||||
|
|
||||||
For _WSJT-X_ in particular, we acknowledge contributions from *AC6SL,
|
|
||||||
AE4JY, DJ0OT, G3WDG, G4KLA, G4WJS, IV3NWV, IW3RAB, K3WYC, K9AN,
|
|
||||||
KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR, VE1SKY, VK3ACF,
|
|
||||||
VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB*. Each of these amateurs has helped to
|
|
||||||
bring the program’s design, code, testing, and/or documentation to
|
|
||||||
its present state.
|
|
||||||
|
|
||||||
Most of the color palettes for the _WSJT-X_ waterfall were copied from
|
|
||||||
the excellent, well documented, open-source program _fldigi_, by *W1HKJ*
|
|
||||||
and friends.
|
|
||||||
|
|
||||||
We use development tools and libraries from many sources. We
|
|
||||||
particularly wish to acknowledge importance of the GNU Compiler
|
|
||||||
Collection from the Free Software Foundation, the "clang" compiler
|
|
||||||
from LLVM at the University of Illinois, and the Qt Project from Digia
|
|
||||||
PLC. Other important resources include the FFTW library by Matteo
|
|
||||||
Frigo and Steven G. Johnson; SLALIB, the Positional Astronomy Library
|
|
||||||
by P. T. Wallace; and a high-precision planetary ephemeris and
|
|
||||||
associated software from NASA's Jet Propulsion Laboratory.
|
|
@ -1,57 +0,0 @@
|
|||||||
A text box entitled Astronomical Data provides information needed for
|
|
||||||
tracking the sun or moon, compensating for EME Doppler shift, and
|
|
||||||
estimating EME Doppler spread and path degradation. Toggle the
|
|
||||||
*Astronomical data* on the *View* menu to display or hide this window.
|
|
||||||
|
|
||||||
image::AstroData_2.png[align="center",alt="Astronomical Data"]
|
|
||||||
|
|
||||||
Available information includes the current UTC *Date* and time; *Az*
|
|
||||||
and *El*, azimuth and elevation of the moon at your own location, in
|
|
||||||
degrees; *SelfDop*, *Width*, and *Delay*, the Doppler shift, full
|
|
||||||
limb-to-limb Doppler spread in Hz, and delay of your own EME echoes in
|
|
||||||
seconds; and *DxAz* and *DxEl*, *DxDop*, and *DxWid*, corresponding
|
|
||||||
parameters for a station located at the *DX Grid* entered on the main
|
|
||||||
window. These numbers are followed by *Dec*, the declination of the
|
|
||||||
moon; *SunAz* and *SunEl*, the azimuth and elevation of the Sun;
|
|
||||||
*Freq*, your stated operating frequency in MHz; *Tsky*, the estimated
|
|
||||||
sky background temperature in the direction of the moon, scaled to the
|
|
||||||
operating frequency; *Dpol*, the spatial polarization offset in
|
|
||||||
degrees; *MNR*, the maximum non-reciprocity of the EME path in dB,
|
|
||||||
owing to a combination of Faraday rotation and spatial polarization;
|
|
||||||
and finally *Dgrd*, an estimate of the signal degradation in dB,
|
|
||||||
relative to the best possible time with the moon at perigee in a cold
|
|
||||||
part of the sky.
|
|
||||||
|
|
||||||
On the higher microwave bands, where Faraday rotation is minimal and
|
|
||||||
linear polarization is often used, spatial offset will reduce signal
|
|
||||||
levels. Some stations have implemented mechanical polarisation
|
|
||||||
adjustment to overcome this loss, and the amount of rotation needed is
|
|
||||||
predicted in real time by the value of *Dpol*. Positive Dpol means
|
|
||||||
that the antenna should be rotated in a clockwise direction looking
|
|
||||||
from behind the antenna towards the moon. For a dish antenna, the
|
|
||||||
feed should similarly be rotated clockwise looking into the mouth of
|
|
||||||
the feed. A negative value for Dpol means anticlockwise rotation.
|
|
||||||
|
|
||||||
|
|
||||||
The state of the art for establishing three-dimensional locations of
|
|
||||||
the sun, moon, and planets at a specified time is embodied in a
|
|
||||||
numerical model of the solar system maintained at the Jet Propulsion
|
|
||||||
Laboratory. The model has been numerically integrated to produce
|
|
||||||
tabular data that can be interpolated with very high accuracy. For
|
|
||||||
example, the celestial coordinates of the moon or a planet can be
|
|
||||||
determined at a specified time to within about 0.0000003 degrees. The
|
|
||||||
JPL ephemeris tables and interpolation routines have been incorporated
|
|
||||||
into _WSJT-X_. Further details on accuracy, especially concerning
|
|
||||||
calculated EME Doppler shifts, are described in {lunarEchoes} for
|
|
||||||
November-December, 2016.
|
|
||||||
|
|
||||||
The sky background temperatures reported by _WSJT-X_ are derived from
|
|
||||||
the all-sky 408 MHz map of Haslam et al. (Astronomy and Astrophysics
|
|
||||||
Supplement Series, 47, 1, 1982), scaled by frequency to the -2.6
|
|
||||||
power. This map has angular resolution of about 1 degree, and of
|
|
||||||
course most amateur EME antennas have much broader beamwidths than
|
|
||||||
this. Your antenna will therefore smooth out the hot spots
|
|
||||||
considerably, and the observed extremes of sky temperature will be
|
|
||||||
less. Unless you understand your sidelobes and ground reflections
|
|
||||||
extremely well, it is unlikely that more accurate sky temperatures
|
|
||||||
would be of much practical use.
|
|
@ -1,4 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
[[CONFIG_DETAILS]]
|
|
||||||
|
|
||||||
Are we here?
|
|
@ -1,80 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
At the center of the main window are a number of controls used when
|
|
||||||
making QSOs. Controls not relevant to a particular mode or submode
|
|
||||||
may be "grayed out" (disabled) or removed from the display.
|
|
||||||
|
|
||||||
//.Misc Controls Center
|
|
||||||
image::misc-controls-center.png[align="center",alt="Misc Controls Center"]
|
|
||||||
|
|
||||||
* Check *Tx even* to transmit in even-numbered UTC minutes or
|
|
||||||
sequences, starting at 0. Uncheck this box to transmit in the odd
|
|
||||||
sequences. The correct selection is made automatically when you
|
|
||||||
double-click on a decoded text line, as described in the
|
|
||||||
<<TUTORIAL,Basic Operating Tutorial>>.
|
|
||||||
|
|
||||||
* The Tx and Rx audio frequencies can be set automatically by
|
|
||||||
double-clicking on decoded text or a signal in the waterfall. They
|
|
||||||
can also be adjusted using the spinner controls.
|
|
||||||
|
|
||||||
* You can force Tx frequency to the current Rx frequency by clicking
|
|
||||||
the *Tx<-Rx* button, and vice-versa for *Rx<-Tx*. The on-the-air
|
|
||||||
frequency of your lowest JT9 or JT65 tone is the sum of dial frequency
|
|
||||||
and audio Tx frequency.
|
|
||||||
|
|
||||||
* Check the box *Lock Tx=Rx* to make the frequencies always track one
|
|
||||||
another.
|
|
||||||
|
|
||||||
IMPORTANT: In general we do not recommend using *Lock Tx=Rx* since it
|
|
||||||
encourages poor radio etiquette when running a frequency. With this
|
|
||||||
box checked, your own Tx frequency will move around following your
|
|
||||||
callers.
|
|
||||||
|
|
||||||
* For modes lacking a multi-decode feature, or when *Enable
|
|
||||||
VHF/UHF/Microwave features* has been checked on the *Settings ->
|
|
||||||
General* tab, the *F Tol* control sets a frequency toilerance range
|
|
||||||
over which decoding will be attempted, centered on the Rx frequency.
|
|
||||||
|
|
||||||
* The *Report* control lets you change a signal report that has been
|
|
||||||
inserted automatically. Typical reports for the various modes fall in
|
|
||||||
the range –30 to +20 dB. Remember that JT65 reports saturate at an
|
|
||||||
upper limit of -1 dB.
|
|
||||||
|
|
||||||
TIP: Consider reducing power if your QSO partner reports your
|
|
||||||
signal above -5 dB in one of the _WSJT-X_ slow modes. These are
|
|
||||||
supposed to be weak signal modes!
|
|
||||||
|
|
||||||
* In some circumstances, especially on VHF and higher bands, you can
|
|
||||||
select a supported submode of the active mode by using the *Submode*
|
|
||||||
control. The *Sync* control sets a minimum threshold for establishing
|
|
||||||
time and frequency synchronization with a received signal.
|
|
||||||
|
|
||||||
* Spinner control *T/R xx s* sets sequence lengths for transmission
|
|
||||||
and reception in ISCAT, MSK144, and the fast JT9 modes.
|
|
||||||
|
|
||||||
* With *Split operation* activated on the *Settings -> Radio* tab, in
|
|
||||||
MSK144 and the fast JT9 submodes you can activate the spinner control
|
|
||||||
*Tx CQ nnn* by checking the box to its right. The program will then
|
|
||||||
generate something like `CQ nnn K1ABC FN42` for your CQ message, where
|
|
||||||
`nnn` is the kHz portion of your current operating frequency,
|
|
||||||
in the range 010 to 999. Your CQ
|
|
||||||
message *Tx6* will then be transmitted at the calling frequency
|
|
||||||
selected in the *Tx CQ nnn* spinner control. All other messages will
|
|
||||||
be transmitted at your current operating frequency. On reception,
|
|
||||||
when you double-click on a message like `CQ nnn K1ABC FN42` your rig
|
|
||||||
will QSY to the specified frequency so you can call the station at his
|
|
||||||
specified response frequency.
|
|
||||||
|
|
||||||
* Checkboxes at bottom center of the main window control special
|
|
||||||
features for particular operating modes:
|
|
||||||
|
|
||||||
** *Sh* enables shorthand messages in JT4, JT65, QRA64 and MSK144 modes
|
|
||||||
|
|
||||||
** *Fast* enables fast JT9 submodes
|
|
||||||
|
|
||||||
** *Auto Seq* enables auto-sequencing of Tx messages
|
|
||||||
|
|
||||||
** *Call 1st* enables automatic response to the first decoded
|
|
||||||
responder to your CQ
|
|
||||||
|
|
||||||
** *Tx6* toggles between two types of shorthand messages in JT4 mode
|
|
@ -1,45 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
Controls related to frequency selection, received audio level, the
|
|
||||||
station being called, and date and time are found at lower left of the
|
|
||||||
main window:
|
|
||||||
|
|
||||||
//.Misc Controls Left
|
|
||||||
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]
|
|
||||||
|
|
||||||
* A drop-down list of frequencies and bands at upper left lets you
|
|
||||||
select the operating band and sets dial frequency to a value taken
|
|
||||||
from the *Frequencies* tab on the *Settings* window. If CAT control
|
|
||||||
is active the radio's dial frequency will be set accordingly; if not,
|
|
||||||
you must tune the radio manually.
|
|
||||||
|
|
||||||
* Alternatively, you can enter a frequency (in MHz) or band name in
|
|
||||||
recognized ADIF format, for example 630m, 20m, or 70cm. The band-name
|
|
||||||
format works only if a working frequency has been set for that band
|
|
||||||
and mode, in which case the first such match is selected.
|
|
||||||
|
|
||||||
* You can also enter a frequency increment in kHz above the currently
|
|
||||||
displayed integer MHz. For example, if the displayed frequency is
|
|
||||||
10,368.100, enter `165k` (don't forget the `k`!) to QSY to 10,368.165.
|
|
||||||
|
|
||||||
* A small colored circle appears in green if the CAT control is
|
|
||||||
activated and functional. The green circle contains the character S
|
|
||||||
if the rig is detected to be in *Split* mode. The circle becomes red
|
|
||||||
if you have requested CAT control but communication with the radio has
|
|
||||||
been lost.
|
|
||||||
|
|
||||||
TIP: Many Icom rigs cannot be queried for split status, current VFO or
|
|
||||||
split transmit frequency. When using _WSJT-X_ with such radios you
|
|
||||||
should not change the current VFO, split status or dial frequency
|
|
||||||
using controls on the radio.
|
|
||||||
|
|
||||||
* If *DX Grid* contains a valid Maidenhead locator, the corresponding
|
|
||||||
great-circle azimuth and distance from your location are displayed.
|
|
||||||
|
|
||||||
* The program can maintain a database of callsigns and locators for
|
|
||||||
future reference. Click *Add* to insert the present call and locator
|
|
||||||
in the database; click *Lookup* to retrieve the locator for a
|
|
||||||
previously stored call. This feature is mainly useful for situations
|
|
||||||
in which the number of active stations is modest and reasonably
|
|
||||||
stable, such as EME (Earth-Moon-Earth) communication. The callsign
|
|
||||||
file name is `CALL3.TXT`.
|
|
@ -1,69 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
The following controls appear just under the decoded text windows on
|
|
||||||
the main screen:
|
|
||||||
|
|
||||||
//.Main UI
|
|
||||||
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
|
|
||||||
|
|
||||||
* When *CQ only* is checked, only messages from stations calling CQ will
|
|
||||||
be displayed in the left text panel.
|
|
||||||
|
|
||||||
* *Log QSO* raises a dialog window pre-filled with known information
|
|
||||||
about a QSO you have nearly completed. You can edit or add to this
|
|
||||||
information before clicking *OK* to log the QSO. If you check *Prompt
|
|
||||||
me to log QSO* on the *Settings -> Reporting* tab, the program will
|
|
||||||
raise the confirmation screen automatically when you send a message
|
|
||||||
containing +73+. *Start Date* and *Start Time* are set when you click
|
|
||||||
to send the *Tx 2* or *Tx 3* message, and backed up by one or two
|
|
||||||
sequence lengths, respectively. (Note that the actual start time may
|
|
||||||
have been earlier if repeats of early transmissions were required.)
|
|
||||||
End date and time are set when the *Log QSO* screen is invoked.
|
|
||||||
|
|
||||||
//.Log QSO Window
|
|
||||||
image::log-qso.png[align="center",alt="Log QSO"]
|
|
||||||
|
|
||||||
* *Stop* will terminate normal data acquisition in case you want to
|
|
||||||
freeze the waterfall or open and explore a previously recorded audio
|
|
||||||
file.
|
|
||||||
|
|
||||||
* *Monitor* toggles normal receive operation on or off. This button
|
|
||||||
is highlighted in green when the _WSJT-X_ is receiving. If you are
|
|
||||||
using CAT control, toggling *Monitor* OFF relinquishes control of the
|
|
||||||
rig; if *Monitor returns to last used frequency* is selected on the
|
|
||||||
*Settings | General* tab, toggling *Monitor* back ON will return to
|
|
||||||
the original frequency.
|
|
||||||
|
|
||||||
* *Erase* clears the right-hand decoded text window.
|
|
||||||
Double-clicking *Erase* clears both text windows.
|
|
||||||
|
|
||||||
TIP: Right-clicking on either text window brings up a context menu
|
|
||||||
with several options (including *Erase*) which operate on that window
|
|
||||||
alone.
|
|
||||||
|
|
||||||
* *Clear Avg* is present only in modes that support message averaging.
|
|
||||||
It provides a way to erase the accumulating information, thus
|
|
||||||
preparing to start a new average.
|
|
||||||
|
|
||||||
* *Decode* tells the program to repeat the decoding procedure at the
|
|
||||||
Rx frequency (green marker on waterfall scale), using the most recently
|
|
||||||
completed sequence of received data.
|
|
||||||
|
|
||||||
* *Enable Tx* toggles automatic T/R sequencing mode on or off and
|
|
||||||
highlights the button in red when ON. A transmission will start at
|
|
||||||
the beginning of the selected (odd or even) sequence, or immediately
|
|
||||||
if appropriate. Toggling the button to OFF during a transmission
|
|
||||||
allows the current transmission to finish.
|
|
||||||
|
|
||||||
* *Halt Tx* terminates a transmission immediately and disables
|
|
||||||
automatic T/R sequencing.
|
|
||||||
|
|
||||||
* *Tune* toggles the program into Tx mode and generates an unmodulated
|
|
||||||
carrier at the specified Tx frequency (red marker on waterfall scale).
|
|
||||||
This process is useful for adjusting an antenna tuner or tuning an
|
|
||||||
amplifier. The button is highlighted in red while *Tune* is active.
|
|
||||||
Toggle the button a second time or click *Halt Tx* to terminate the
|
|
||||||
*Tune* process. Note that activating *Tune* interrupts a receive
|
|
||||||
sequence and will prevent decoding during that sequence.
|
|
||||||
|
|
||||||
* Uncheck the box *Menus* to make the top-of-window menus disappear,
|
|
||||||
leaving more vertical space for decoded messages.
|
|
@ -1,66 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
Menus at top of the main window offer many options for configuration
|
|
||||||
and operation. Most of the items are self-explanatory; a few
|
|
||||||
additional details are provided below. Keyboard shortcuts for some
|
|
||||||
frequently used menu items are listed at the right edge of the menu.
|
|
||||||
|
|
||||||
==== _WSJT-X_ menu
|
|
||||||
image::MacAppMenu.png[align="left",alt="Mac App Menu"]
|
|
||||||
|
|
||||||
This menu appears on the Macintosh only. *Settings* appears here,
|
|
||||||
labeled as *Preferences*, rather than on the *File* menu. *About
|
|
||||||
WSJT-X* appears here rather than on the *Help* menu.
|
|
||||||
|
|
||||||
[[FILE_MENU]]
|
|
||||||
==== File menu
|
|
||||||
image::file-menu.png[align="left",alt="File Menu"]
|
|
||||||
|
|
||||||
[[CONFIG_MENU]]
|
|
||||||
==== Configuration Menu
|
|
||||||
image::config-menu.png[align="left",alt="File Menu"]
|
|
||||||
|
|
||||||
Many users prefer to create and use entries on the *Configurations*
|
|
||||||
menu for switching between modes. Simply *Clone* the *Default* entry,
|
|
||||||
*Rename* it as desired, and then make all desired settings for that
|
|
||||||
configuration. These settings will be restored whenever you select
|
|
||||||
that configuration.
|
|
||||||
|
|
||||||
As well as switching between configurations while running _WSJT-X_ you
|
|
||||||
can also start the application from the command line in any desired
|
|
||||||
configuration. Use the command-line option
|
|
||||||
`--config <configuration-name>`, or `-c` for short, as in these
|
|
||||||
examples for configurations `FT8` and `Echo`:
|
|
||||||
|
|
||||||
wsjtx --config FT8
|
|
||||||
wsjtx -c Echo
|
|
||||||
|
|
||||||
[[VIEW_MENU]]
|
|
||||||
==== View Menu
|
|
||||||
image::view-menu.png[align="left",alt="View Menu"]
|
|
||||||
|
|
||||||
[[MODE_MENU]]
|
|
||||||
==== Mode Menu
|
|
||||||
image::mode-menu.png[align="left",alt="Mode Menu"]
|
|
||||||
|
|
||||||
[[DECODE_MENU]]
|
|
||||||
==== Decode Menu
|
|
||||||
image::decode-menu.png[align="left",alt="Decode Menu"]
|
|
||||||
|
|
||||||
[[SAVE_MENU]]
|
|
||||||
[[SAVE-WAV]]
|
|
||||||
==== Save Menu
|
|
||||||
image::save-menu.png[align="left",alt="Save Menu"]
|
|
||||||
|
|
||||||
==== Tools Menu
|
|
||||||
image::tools-menu.png[align="left",alt="Tools Menu"]
|
|
||||||
|
|
||||||
[[HELP_MENU]]
|
|
||||||
==== Help Menu
|
|
||||||
image::help-menu.png[align="left",alt="Help Menu"]
|
|
||||||
|
|
||||||
===== Keyboard Shortcuts (F3)
|
|
||||||
image::keyboard-shortcuts.png[align="left",alt="Keyboard Shortcuts"]
|
|
||||||
|
|
||||||
===== Special Mouse Commands (F5)
|
|
||||||
image::special-mouse-commands.png[align="left",alt="Special Mouse Commands"]
|
|
@ -1,61 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
Two arrangements of controls are provided for generating and selecting
|
|
||||||
Tx messages. Controls familiar to users of program _WSJT_
|
|
||||||
appear on *Tab 1*, providing six fields for message entry.
|
|
||||||
Pre-formatted messages for the standard minimal QSO are generated when
|
|
||||||
you click *Generate Std Msgs* or double-click on an appropriate line
|
|
||||||
in one of the decoded text windows.
|
|
||||||
|
|
||||||
//.Traditional Message Menu
|
|
||||||
image::traditional-msg-box.png[align="center",alt="Traditional Message Menu"]
|
|
||||||
|
|
||||||
* Select the next message to be transmitted (at the start of your next
|
|
||||||
Tx sequence) by clicking on the circle under *Next*.
|
|
||||||
|
|
||||||
* To change to a specified Tx message immediately during a
|
|
||||||
transmission, click on a rectangular button under the *Now* label.
|
|
||||||
Changing a Tx message in mid-stream will slightly reduce the chance of
|
|
||||||
a correct decode, but it is usually OK if done in the first 10-20% of
|
|
||||||
a transmission.
|
|
||||||
|
|
||||||
* All six Tx message fields are editable. You can modify an
|
|
||||||
automatically generated message or enter a desired message, keeping in
|
|
||||||
mind the limits on message content. See <<PROTOCOLS,Protocol
|
|
||||||
Specifications>> for details.
|
|
||||||
|
|
||||||
* Click on the pull-down arrow for message #5 to select one of the
|
|
||||||
pre-stored messages entered on the *Settings | Tx Macros* tab.
|
|
||||||
Pressing *Enter* on a modified message #5 automatically adds that
|
|
||||||
message to the stored macros.
|
|
||||||
|
|
||||||
* In some circumstances it may be desirable to make your QSOs as
|
|
||||||
shiort as possible. To configure the program to start contacts with
|
|
||||||
message #2, disable message #1 by double-clicking on its round
|
|
||||||
radio-button or rectangular *Tx 1* button. Similarly, to send RR73
|
|
||||||
rather than RRR for message #4, double-click on one of its buttons.
|
|
||||||
|
|
||||||
The second arrangement of controls for generating and selecting
|
|
||||||
Tx messages appears on *Tab 2* of the Message Control Panel:
|
|
||||||
|
|
||||||
//.New Message Menu
|
|
||||||
image::new-msg-box.png[align="center",alt="New Message Menu"]
|
|
||||||
|
|
||||||
With this setup you normally follow a top-to-bottom sequence of
|
|
||||||
transmissions from the left column if you are calling CQ, or the right
|
|
||||||
column if answering a CQ.
|
|
||||||
|
|
||||||
* Clicking a button puts the appropriate message in the *Gen Msg* box.
|
|
||||||
If you are already transmitting, the Tx message is changed
|
|
||||||
immediately.
|
|
||||||
|
|
||||||
* You can enter and transmit anything (up to 13 characters, including
|
|
||||||
spaces) in the *Free Msg* box.
|
|
||||||
|
|
||||||
* Click on the pull-down arrow in the *Free Msg* box to select a
|
|
||||||
pre-stored macro. Pressing *Enter* on a modified message here
|
|
||||||
automatically adds that message to the table of stored macros.
|
|
||||||
|
|
||||||
TIP: During a transmission the actual message being sent always
|
|
||||||
appears in the first box of the status bar (bottom left of the main
|
|
||||||
screen).
|
|
@ -1,23 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
A *Status Bar* at the bottom edge of the main window provides useful
|
|
||||||
information about operating conditions.
|
|
||||||
|
|
||||||
//.Status Bar
|
|
||||||
image::status-bar-a.png[align="left",alt="Status Bar"]
|
|
||||||
|
|
||||||
Labels on the *Status Bar* display such information as the program's
|
|
||||||
current operating state, configuration name, operating mode, and the
|
|
||||||
content of your most recent transmitted message. The first label
|
|
||||||
(operating state) can be Receiving, Tx (for Transmitting), Tune, or
|
|
||||||
the name of file opened from the *File* menu; this label is
|
|
||||||
highlighted in green for Receiving, yellow for Tx, red for Tune, and
|
|
||||||
light blue for a file name. When transmitting, the Tx message is
|
|
||||||
displayed exactly as it will be decoded by receiving stations. The
|
|
||||||
second label (as shown above) will be absent if you are using the
|
|
||||||
*Default* setting on the *Configurations* menu. A progress bar shows
|
|
||||||
the elapsed fraction of a Tx or Rx sequence. Finally, if the Watchdog
|
|
||||||
(WD) timer was enabled on the *settings | General* tab, a label in the
|
|
||||||
lower right-hand corner displays the number of minutes remaining
|
|
||||||
before timeout.
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
The following controls appear at the bottom of the Wide Graph window.
|
|
||||||
Decoding occurs only in the displayed frequency range; otherwise, with
|
|
||||||
the exceptions of *Start NNN Hz* and of *JT65 nnnn JT9* when operating
|
|
||||||
in JT9+JT65 mode, controls on the Wide Graph window have no effect on
|
|
||||||
the decoding process.
|
|
||||||
|
|
||||||
image::wide-graph-controls.png[align="center",alt="Wide Graph Controls"]
|
|
||||||
|
|
||||||
- *Bins/Pixel* controls the displayed frequency resolution. Set this
|
|
||||||
value to 1 for the highest possible resolution, or to higher numbers
|
|
||||||
to compress the spectral display. Normal operation with a convenient
|
|
||||||
window size works well at 2 to 8 bins per pixel.
|
|
||||||
|
|
||||||
- *JT65 nnnn JT9* sets the dividing point (blue marker) for wide-band
|
|
||||||
decoding of JT65 and JT9 signals in *JT9+JT65* mode. The decoder
|
|
||||||
looks for JT65 signals everywhere, but JT9 signals only above this
|
|
||||||
frequency. This setting is stored separately for each band.
|
|
||||||
|
|
||||||
- *Start nnn Hz* sets the low-frequency starting point of the
|
|
||||||
waterfall frequency scale.
|
|
||||||
|
|
||||||
- *N Avg* is the number of successive spectra to be averaged before
|
|
||||||
updating the display. Values around 5 are suitable for normal JT9 and
|
|
||||||
JT65 operation. Adjust *N Avg* to make the waterfall move faster or
|
|
||||||
slower, as desired.
|
|
||||||
|
|
||||||
- A dropdown list below the *Palette* label lets you select from a
|
|
||||||
wide range of waterfall color palettes.
|
|
||||||
|
|
||||||
- Click *Adjust* to activate a window that allows you to create a
|
|
||||||
user-defined palette.
|
|
||||||
|
|
||||||
- Check *Flatten* if you want _WSJT-X_ to compensate for a sloping or
|
|
||||||
uneven response across the received passband. For this feature to
|
|
||||||
work properly, you should restrict the range of displayed frequencies
|
|
||||||
so that only the active part of the spectrum is shown.
|
|
||||||
|
|
||||||
- Select *Current* or *Cumulative* for the spectrum displayed in the
|
|
||||||
bottom one-third of the Wide Graph window. *Current* is the average
|
|
||||||
spectrum over the most recent *N Avg* FFT calculations. *Cumulative*
|
|
||||||
is the average spectrum since the start of the present UTC minute.
|
|
||||||
*Linear Avg* is useful in JT4 mode, especially when short-form
|
|
||||||
messages are used.
|
|
||||||
|
|
||||||
- Four sliders control reference levels and scaling for waterfall
|
|
||||||
colors and the spectrum plot. Values around midscale are usually
|
|
||||||
about right, depending on the input signal level, the chosen palette,
|
|
||||||
and your own preferences. Hover the mouse over a control to display a
|
|
||||||
tip reminding you of its function.
|
|
||||||
|
|
||||||
- *Smoothing* is active only when *Linear Average* has been selected.
|
|
||||||
Smoothing the displayed spectrum over more than one bin can enhance
|
|
||||||
your ability to detect weak EME signals with Doppler spread more than
|
|
||||||
a few Hz.
|
|
||||||
|
|
||||||
[[CONTROLS_FAST]]
|
|
||||||
=== Fast Graph
|
|
||||||
|
|
||||||
The waterfall palette used for the Fast Graph is the same as the one
|
|
||||||
selected on the Wide Graph. Three sliders at the bottom of the Fast
|
|
||||||
Graph window can be used to optimize gain and zero-offset for the
|
|
||||||
displayed information. Hover the mouse over a control to display a
|
|
||||||
tip reminding you of its function. Clicking the *Auto Level* button
|
|
||||||
will produce reasonable settings as a starting point.
|
|
||||||
|
|
||||||
image::fast-graph-controls.png[align="center",alt="Fast Graph Controls"]
|
|
||||||
|
|
||||||
[[CONTROLS_ECHO]]
|
|
||||||
=== Echo Graph
|
|
||||||
|
|
||||||
The following controls appear at the bottom of the Echo Graph:
|
|
||||||
|
|
||||||
image::echo-graph-controls.png[align="center",alt="EchoGraph Controls"]
|
|
||||||
|
|
||||||
- *Bins/Pixel* controls the displayed frequency resolution. Set this
|
|
||||||
value to 1 for the highest possible resolution, or to higher numbers
|
|
||||||
to compress the spectral display.
|
|
||||||
|
|
||||||
- *Gain* and *Zero* sliders control scaling and offset of plotted
|
|
||||||
spectra.
|
|
||||||
|
|
||||||
- *Smooth* values greater than 0 apply running averages to the plotted
|
|
||||||
spectra, thereby smoothing the curves over multiple bins.
|
|
||||||
|
|
||||||
- Label *N* shows the number of echo pulses averaged.
|
|
||||||
|
|
||||||
- Click the *Colors* button to cycle through 6 possible choices of
|
|
||||||
color and line width for the plots.
|
|
||||||
|
|
||||||
[[CONTROLS_MISCELLANEOUS]]
|
|
||||||
=== Miscellaneous
|
|
||||||
|
|
||||||
Most windows can be resized as desired. If you are short of screen
|
|
||||||
space you can make the Main Window and Wide Graph smaller by hiding
|
|
||||||
some controls and labels. To enable this feature type *Ctrl+M* with
|
|
||||||
focus on the appropriate window. (For the Main Window you can select
|
|
||||||
*Hide menus and labels* on the *View* menu.) Type *Ctrl+M* again
|
|
||||||
to make the controls visible once more.
|
|
@ -1,39 +0,0 @@
|
|||||||
_WSJT-X_ is programmed to cooperate closely with several other useful
|
|
||||||
programs.
|
|
||||||
|
|
||||||
* {dxlsuite}, {omnirig}, and {hrd} were described in the section on
|
|
||||||
<<RADIO,rig control>>.
|
|
||||||
|
|
||||||
* {pskreporter}, by Philip Gladstone, is a web server that gathers
|
|
||||||
reception reports sent by various other programs, including _WSJT-X_.
|
|
||||||
The information is made available in near real time on a world map,
|
|
||||||
and also as statistical summaries of various kinds. A number of
|
|
||||||
options are available to the user; for example, you can request a map
|
|
||||||
showing world-wide JT65 activity on all amateur bands over the
|
|
||||||
past hour. Such a map might look like this, where different colors
|
|
||||||
represent different bands:
|
|
||||||
|
|
||||||
image::psk-reporter.png[align="left",alt="PSK Reporter"]
|
|
||||||
|
|
||||||
The following screen shot shows the PSK Reporter map configured to
|
|
||||||
show MSK144 reports:
|
|
||||||
|
|
||||||
image::psk-reporter_2.png[align="left",alt="PSK Reporter"]
|
|
||||||
|
|
||||||
* {jtalert}, by VK3AMA, is available only for Windows. It provides
|
|
||||||
many operating aids including automatic logging to several third-party
|
|
||||||
logging programs, audio and visual alerts following a number of
|
|
||||||
optional alert conditions (decoding of a new DXCC, new state, etc.),
|
|
||||||
and convenient direct access to web services such as callsign lookup.
|
|
||||||
|
|
||||||
image::jtalert.png[align="left",alt="JTAlert-X image"]
|
|
||||||
|
|
||||||
* {alarmejt}, by F5JMH, is available only for Linux. The program keeps
|
|
||||||
its own logbook. It fetches contact information from _WSJT-X_ and
|
|
||||||
provides visual alerts for new DXCC entities and grid squares on the
|
|
||||||
current band, as well as other options.
|
|
||||||
|
|
||||||
* {jtbridge}, by SM0THU, is available for OS X. It works together with
|
|
||||||
logging applications Aether, MacLoggerDX, RUMlog or RUMlogNG. It
|
|
||||||
checks QSO and QSL status of the call and DXCC entity, as well as many
|
|
||||||
other features.
|
|
@ -1,155 +0,0 @@
|
|||||||
=== AP Decoding
|
|
||||||
|
|
||||||
The _WSJT-X_ decoders for JT65, QRA64, and FT8 include optional
|
|
||||||
procedures that use naturally accumulating information during a
|
|
||||||
minimal QSO. This _a priori_ (AP) information increases sensitivity
|
|
||||||
of the decoder by up to 4 dB, at the cost of a slightly higher rate of
|
|
||||||
false decodes.
|
|
||||||
|
|
||||||
For example: when you decide to answer a CQ, you already know your own
|
|
||||||
callsign and that of your potential QSO partner. The software
|
|
||||||
therefore "`knows`" what to expect for 57 of the 72 message bits (28
|
|
||||||
bits for each of two callsigns, 1 bit for message type) in the next
|
|
||||||
received message. The decoder's task can thus be reduced to
|
|
||||||
determining the remaining 15 bits of the message and ensuring that the
|
|
||||||
resulting solution is reliable.
|
|
||||||
|
|
||||||
AP decoding starts by setting AP bits to the hypothesized values, as
|
|
||||||
if they had been received correctly. We then determine whether the
|
|
||||||
remaining message and parity bits are consistent with the hypothesized
|
|
||||||
AP bits, with a specified level of confidence. Successful AP decodes
|
|
||||||
are labeled with an end-of-line indicator of the form `aP`, where `P`
|
|
||||||
is one of the single-digit AP decoding types listed in Table 1. For
|
|
||||||
example, `a2` indicates that the successful decode used MyCall as
|
|
||||||
hypothetically known information.
|
|
||||||
|
|
||||||
[[FT8_AP_INFO_TABLE]]
|
|
||||||
.FT8 AP information types
|
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
|
||||||
|===============================================
|
|
||||||
|aP | Message components
|
|
||||||
|a1 | CQ     ?     ?
|
|
||||||
|a2 | MyCall     ?     ?
|
|
||||||
|a3 | MyCall DxCall     ?
|
|
||||||
|a4 | MyCall DxCall RRR
|
|
||||||
|a5 | MyCall DxCall 73
|
|
||||||
|a6 | MyCall DxCall RR73
|
|
||||||
|===============================================
|
|
||||||
|
|
||||||
If a codeword is found that is judged to have high (but not
|
|
||||||
overwhelmingly high) probability of being correct, a `?` character is
|
|
||||||
appended when the decoded message is displayed. To avoid misleading
|
|
||||||
spots of occasional false decodes, messages so marked are not
|
|
||||||
forwarded to {pskreporter}.
|
|
||||||
|
|
||||||
Table 2 lists the six possible QSO states that are tracked by the
|
|
||||||
_WSJT-X_ auto-sequencer, along with the type of AP decoding that would
|
|
||||||
be attempted in each state.
|
|
||||||
|
|
||||||
[[FT8_AP_DECODING_TYPES_TABLE]]
|
|
||||||
.FT8 AP decoding types for each QSO state
|
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
|
||||||
|===========================================
|
|
||||||
|State |AP type
|
|
||||||
|CALLING STN | 2, 3
|
|
||||||
|REPORT | 2, 3
|
|
||||||
|ROGER_REPORT | 3, 4, 5, 6
|
|
||||||
|ROGERS | 3, 4, 5, 6
|
|
||||||
|SIGNOFF | 3, 1, 2
|
|
||||||
|CALLING CQ | 1, 2
|
|
||||||
|===========================================
|
|
||||||
|
|
||||||
Decoding with _a priori_ information behaves slightly differently
|
|
||||||
in JT65. Some details are provided in Tables 3 and 4.
|
|
||||||
|
|
||||||
[[JT65_AP_INFO_TABLE]]
|
|
||||||
.JT65 AP information types
|
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
|
||||||
|===============================================
|
|
||||||
|aP | Message components
|
|
||||||
|a1 | CQ     ?     ?
|
|
||||||
|a2 | MyCall     ?     ?
|
|
||||||
|a3 | MyCall DxCall     ?
|
|
||||||
|a4 | MyCall DxCall RRR
|
|
||||||
|a5 | MyCall DxCall 73
|
|
||||||
|a6 | MyCall DxCall DxGrid
|
|
||||||
|a7 | CQ DxCall DxGrid
|
|
||||||
|===============================================
|
|
||||||
|
|
||||||
[[JT65_AP_DECODING_TYPES_TABLE]]
|
|
||||||
.JT65 AP decoding types for each QSO state
|
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
|
||||||
|===========================================
|
|
||||||
|State |AP type
|
|
||||||
|CALLING STN | 2, 3, 6, 7
|
|
||||||
|REPORT | 2, 3
|
|
||||||
|ROGER_REPORT | 3, 4, 5
|
|
||||||
|ROGERS | 3, 4, 5
|
|
||||||
|SIGNOFF | 2, 3, 4, 5
|
|
||||||
|CALLING CQ | 1, 2, 6
|
|
||||||
|===========================================
|
|
||||||
|
|
||||||
|
|
||||||
=== Decoded Lines
|
|
||||||
|
|
||||||
Displayed information accompanying decoded messages generally includes UTC,
|
|
||||||
signal-to-noise ratio in dB, time offset DT in seconds, and
|
|
||||||
audio frequency in Hz. Some modes include additional information such
|
|
||||||
as frequency offset from nominal (DF), frequency drift (Drift or F1),
|
|
||||||
or distance (km or mi).
|
|
||||||
|
|
||||||
There may also be some cryptic characters with special meanings
|
|
||||||
summarized in the following Table:
|
|
||||||
|
|
||||||
[[DECODED_LINES_TABLE]]
|
|
||||||
.Notations used on decoded text lines
|
|
||||||
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|
|
||||||
|===========================================
|
|
||||||
|Mode |Mode character|Sync character|End of line information
|
|
||||||
|FT8 | ~ | | ?   aP
|
|
||||||
|JT4 | $ | *, # | f, fN, dNC
|
|
||||||
|JT9 | @ | |
|
|
||||||
|JT65 | # | |
|
|
||||||
|JT65 VHF| # | *, # | f, fN, dNC
|
|
||||||
|QRA64 | : | * | R
|
|
||||||
|ISCAT | | * | M N C T
|
|
||||||
|MSK144 | & | | N H E
|
|
||||||
|===========================================
|
|
||||||
Sync character::
|
|
||||||
`*` - Normal sync +
|
|
||||||
`#` - Alternate sync
|
|
||||||
|
|
||||||
End of line information::
|
|
||||||
`?` - Decoded with lower confidence +
|
|
||||||
`a` - Decoded with aid of some a priori (AP) information +
|
|
||||||
`C` - Confidence indicator [ISCAT and Deep Search; (0-9,*)] +
|
|
||||||
`d` - Deep Search algorithm +
|
|
||||||
`E` - Size of MSK eye diagram opening - if negative, the eye is closed +
|
|
||||||
`f` - Franke-Taylor or Fano algorithm +
|
|
||||||
`H` - Number of bit errors corrected +
|
|
||||||
`M` - Message length (characters) +
|
|
||||||
`N` - Number of Rx intervals or frames averaged +
|
|
||||||
`P` - Number indicating type of AP information (Table 1, above) +
|
|
||||||
`R` - Return code from QRA64 decoder +
|
|
||||||
`T` - Length of analyzed region (s)
|
|
||||||
|
|
||||||
Table 6 below shows the meaning of the return codes R in QRA64 mode.
|
|
||||||
|
|
||||||
[[QRA64_AP_INFO_TABLE]]
|
|
||||||
.QRA64 AP return codes
|
|
||||||
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|
|
||||||
|===============================================
|
|
||||||
|rc | Message components
|
|
||||||
|0 | ?     ?     ?
|
|
||||||
|1 | CQ     ?     ?
|
|
||||||
|2 | CQ     ?
|
|
||||||
|3 | MyCall     ?     ?
|
|
||||||
|4 | MyCall     ?
|
|
||||||
|5 | MyCall DxCall     ?
|
|
||||||
|6 | ?     DxCall     ?
|
|
||||||
|7 | ?     DxCall
|
|
||||||
|8 | MyCall DxCall DxGrid
|
|
||||||
|9 | CQ DxCall     ?
|
|
||||||
|10 | CQ DxCall
|
|
||||||
|11 | CQ DxCall DxGrid
|
|
||||||
|===============================================
|
|
@ -1,17 +0,0 @@
|
|||||||
<style>
|
|
||||||
html, body {
|
|
||||||
font-size: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: Georgia, "Times New Roman", Times, serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:visited {
|
|
||||||
color: purple;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,77 +0,0 @@
|
|||||||
////
|
|
||||||
Questions:
|
|
||||||
Should be short one liners (in the .adoc file) ending with ?::
|
|
||||||
If your question is too long for one line, consider multiple questions or rephrase
|
|
||||||
|
|
||||||
Answers:
|
|
||||||
Can be bullet or paragraphs. Bullets make for easier reading.
|
|
||||||
|
|
||||||
Bullet Usage:
|
|
||||||
* = a circle bullet single intent
|
|
||||||
** = circle bullet double indent
|
|
||||||
. = should be avoided as the questions are numbered
|
|
||||||
.. = bullet a, b, c, and so on, double indent
|
|
||||||
|
|
||||||
Alternatives: Use a * Bullet, followed by .. for example, then have
|
|
||||||
a multi-section answer using the * as the section header
|
|
||||||
|
|
||||||
* Section Header 1
|
|
||||||
.. Possible Answer a
|
|
||||||
.. Possible Answer b
|
|
||||||
* Section Header 2
|
|
||||||
.. Possible Answer a
|
|
||||||
.. Possible Answer b
|
|
||||||
|
|
||||||
Link Usage:
|
|
||||||
Use the common/links.adoc for href links to maintain consistency. Try to avoid
|
|
||||||
apostrophes ` or ' as it breaks AsciiDoc syntax without special escaping
|
|
||||||
and they do not translate into other languages well.
|
|
||||||
|
|
||||||
////
|
|
||||||
[qanda]
|
|
||||||
My displayed spectrum is flatter when I do not check the *Flatten* box. What's wrong?::
|
|
||||||
|
|
||||||
_WSJT-X_ does not expect a steep filter edge within the displayed
|
|
||||||
passband. Use a wider IF filter or reduce the displayed passband by
|
|
||||||
decreasing *Bins/Pixel*, increasing *Start*, or reducing the width of
|
|
||||||
the *Wide Graph*. You might also choose to re-center the filter
|
|
||||||
passband, if such control is available.
|
|
||||||
|
|
||||||
How should I configure _WSJT-X_ to run multiple instances?::
|
|
||||||
|
|
||||||
Start _WSJT-X_ from a command-prompt window, assigning each instance a
|
|
||||||
unique identifier as in the following two-instance example. This
|
|
||||||
procedure will isolate the *Settings* file and the writable file
|
|
||||||
location for each instance of _WSJT-X_.
|
|
||||||
|
|
||||||
wsjtx --rig-name=TS2000
|
|
||||||
wsjtx --rig-name=FT847
|
|
||||||
|
|
||||||
Rig control through _OmniRig_ seems to fail when I click *Test CAT*. What can I do about it?::
|
|
||||||
|
|
||||||
_Omni-Rig_ apparently has a bug that appears when you click *Test
|
|
||||||
CAT*. Forget using *Test CAT* and just click *OK*. _Omni-Rig_ then
|
|
||||||
behaves normally.
|
|
||||||
|
|
||||||
I am using _WSJT-X_ with _Ham Radio Deluxe_. All seems well until I start HRD Logbook or DM780 running in parallel; then CAT control becomes unreliable.::
|
|
||||||
|
|
||||||
You may see delays up to 20 seconds or so in frequency changes or
|
|
||||||
other radio commands, due to a bug in HRD. HRD folks are aware of the
|
|
||||||
problem, and are working to resolve it.
|
|
||||||
|
|
||||||
I am running _WSJT-X_ under Ubuntu. The program starts, but menu bar is missing from the top of the main window and the hot-keys don't work.::
|
|
||||||
|
|
||||||
Ubuntu's new "`Unity`" desktop puts the menu for the currently active
|
|
||||||
window at the top of the primary display screen. You can restore menu
|
|
||||||
bars to their traditional locations by typing the following in a
|
|
||||||
command-prompt window:
|
|
||||||
|
|
||||||
sudo apt remove appmenu-qt5
|
|
||||||
|
|
||||||
+
|
|
||||||
Alternatively, you can disable the common menu bar for just _WSJT-X_
|
|
||||||
by starting the application with the environment variable
|
|
||||||
QT_QPA_PLATFORMTHEME set to empty (the space after the '=' character
|
|
||||||
is necessary):
|
|
||||||
|
|
||||||
QT_QPA_PLATFORMTHEME= wsjtx
|
|
@ -1,15 +0,0 @@
|
|||||||
// Status=review
|
|
||||||
|
|
||||||
- You can control the program's font sizes by using a text editor
|
|
||||||
(e.g., Windows Notepad or similar) to create a one-line file named
|
|
||||||
+fonts.txt+ in the _WSJT-X_ installation directory. Enter a single
|
|
||||||
line of text with four numbers separated by spaces. The first two
|
|
||||||
numbers control the font size (in points) and weight (on a 0 – 100
|
|
||||||
scale) of most labels on the user interface. The last two numbers
|
|
||||||
control size and weight of text in the *Band Activity* and *Rx
|
|
||||||
Frequency* windows.
|
|
||||||
|
|
||||||
- By default the four numbers are "`8 50 10 50`". If you need larger
|
|
||||||
fonts in the user interface and bold text in the decode windows, try
|
|
||||||
something like "`10 50 12 100`" (without the quotes).
|
|
||||||
|
|
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 153 KiB |
Before Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 877 B |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 532 KiB |
Before Width: | Height: | Size: 546 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 9.7 KiB |
Before Width: | Height: | Size: 3.4 KiB |