Compare commits

...

59 Commits

Author SHA1 Message Date
Jordan Sherer 495c16892f Bump 2018-07-10 00:56:17 -04:00
Jordan Sherer c596f23a05 Added wsjtx-ft8call as output target 2018-07-09 23:07:31 -04:00
Jordan Sherer b69e042f21 Bump version 2018-07-09 22:02:39 -04:00
Jordan Sherer ec568966c8 Fixed macros menu 2018-07-09 21:49:38 -04:00
Jordan Sherer eb062fb0b8 Macros should be updated more frequently 2018-07-09 20:55:54 -04:00
Jordan Sherer 9907a80136 Activity gui should update every 15 seconds 2018-07-09 20:51:42 -04:00
Jordan Sherer cd9079e7ff Updated directed call cache to be better represent recent directed calls 2018-07-09 17:29:43 -04:00
Jordan Sherer 42a8338d1c Allow transmit within 2 seconds of cycle start 2018-07-09 16:36:56 -04:00
Jordan Sherer f44b1154b7 Added SPOT button to UI 2018-07-09 16:31:37 -04:00
Jordan Sherer 722f2f10ae Fixed spec percent bug. Reduced default controls to nil 2018-07-09 15:34:44 -04:00
Jordan Sherer 2a7f38b187 Better breaking apart messages with newlines. Macros behavior 2018-07-09 15:17:53 -04:00
Jordan Sherer f9ab37530c Only clear activity on actual band change, not freq change 2018-07-09 10:10:04 -04:00
Jordan Sherer 442ff4b21d Fix bug on band change 2018-07-09 10:02:45 -04:00
Jordan Sherer ecacddb165 Updated makefile configs 2018-07-08 12:17:10 -04:00
Jordan Sherer 6aab2276ed Updated QAction for old versions of Qt 2018-07-08 09:29:31 -04:00
Jordan Sherer 5c9f9e8141 Version bump. 2018-07-08 09:25:35 -04:00
Jordan Sherer 60563a7dc3 Fix QAction constructor for old compilers 2018-07-07 22:04:27 -04:00
Jordan Sherer 7255728049 Added distance to the calls list 2018-07-07 22:02:11 -04:00
Jordan Sherer 50094fd8a9 Five minutes is too long. Down to two for activity 2018-07-07 17:15:17 -04:00
Jordan Sherer c45f4c137a Keep band activity around for 5 min 2018-07-07 16:58:09 -04:00
Jordan Sherer 16b46176a6 Only QSY your beacon if the frequency isn't free. Don't break lines in the rx window 2018-07-07 16:56:33 -04:00
Jordan Sherer 0df4bbcd29 Added QTH button 2018-07-07 00:47:17 -04:00
Jordan Sherer 3bbea95955 Add warning and eol message 2018-07-06 22:37:25 -04:00
Jordan Sherer fa0baad9a0 Pin calling activity to the top of the activity window 2018-07-06 22:21:04 -04:00
Jordan Sherer 7b7493d560 Fixed beacon tx display 2018-07-06 22:07:30 -04:00
Jordan Sherer dc6de6d819 Bump version 2018-07-06 20:14:09 -04:00
Jordan Sherer b7a51a5764 Disable a bunch of configuration settings that do not make sense for FT8Call 2018-07-06 20:06:41 -04:00
Jordan Sherer 145bc8d292 Updated configuration for beacon interval 2018-07-06 20:01:38 -04:00
Jordan Sherer f58ce3aec0 Propertly clear the edit widget. Properly space messages in the rx window 2018-07-06 18:25:27 -04:00
Jordan Sherer 27b45a26d9 Clear activity on band change. Scroll rx window 2018-07-06 16:54:26 -04:00
Jordan Sherer 0653f81a0d Smarter beaconing with band space 2018-07-06 16:40:09 -04:00
Jordan Sherer 1134cd5782 Disable activity word wrapping 2018-07-06 16:39:51 -04:00
Jordan Sherer aa1871dc66 Fixed beacon scheduling 2018-07-06 16:19:22 -04:00
Jordan Sherer 56869d16a9 Updated since computation to be accurate 2018-07-06 15:27:26 -04:00
Jordan Sherer ccf00dc460 Simple build script to help deploy linux app images 2018-07-06 15:27:06 -04:00
Jordan Sherer 57ad5fd0bc Compat for older Qt 2018-07-06 07:15:11 +00:00
Jordan Sherer 7d9553dd7c Added make app script 2018-07-06 03:03:02 -04:00
Jordan Sherer cad3f43752 Added version 2018-07-06 02:53:31 -04:00
Jordan Sherer 2605fb1a8f UI Customizations 2018-07-06 02:36:40 -04:00
Jordan Sherer 130b749dfe Disabled splashscreen. Updated application name and window title 2018-07-06 00:10:30 -04:00
Jordan Sherer 04bdf8574a Cache calls for easier display 2018-07-05 15:21:47 -04:00
Jordan Sherer 0dfc805a49 Highlight send button on transmit 2018-07-05 04:56:46 -04:00
Jordan Sherer 022866b52b Complete UI functionality 2018-07-05 04:45:55 -04:00
Jordan Sherer 9ed0fe80d2 UI: TableView customizations, including clear context menu 2018-07-03 18:57:49 -04:00
Jordan Sherer 7837ff5d74 UI: Updated tableview behavior 2018-07-03 15:34:03 -04:00
Jordan Sherer bee42d1762 UI Updates, Text Eliding, CallDetail Grid 2018-07-03 11:38:16 -04:00
Jordan Sherer 26c76662ac Read only edit box while transmitting 2018-07-03 03:29:26 -04:00
Jordan Sherer e3a9762179 Beaconing 2018-07-03 03:21:01 -04:00
Jordan Sherer d048f5a2ab Selection tracking 2018-07-03 02:02:19 -04:00
Jordan Sherer 0a95c79f3a Correct stop behavior when clicking send 2018-07-03 01:17:15 -04:00
Jordan Sherer 762f0fb3e1 Added proper send countdown 2018-07-02 23:03:07 -04:00
Jordan Sherer 812b11a53d Disable tx button 2018-07-02 22:56:51 -04:00
Jordan Sherer c517b555d8 Reorganized message transmission semantics 2018-07-02 22:54:26 -04:00
Jordan Sherer f610e946fc Reorganized the window, added beacon watch, macro buttons, etc 2018-07-02 15:08:26 -04:00
Jordan Sherer cb71c3dcf4 Adding messages to band activity 2018-06-15 10:11:44 -04:00
Jordan Sherer 5c8ff568c3 Updated main ui 2018-03-19 00:05:12 -04:00
Jordan Sherer 87cdc7f7e7 Reorganize main window and style meter 2018-03-10 16:59:09 -05:00
Jordan Sherer e694d862aa Modifying mainwindow to display waterfall and minimal ui 2018-03-09 13:10:19 -05:00
Jordan Sherer 4df7aae11a Merged in the extended free text experiment patch 2018-03-08 17:01:33 -05:00
24 changed files with 5619 additions and 2275 deletions
BIN
View File
Binary file not shown.
+9 -7
View File
@@ -2,13 +2,15 @@
# To pass variables to cpack from cmake, they must be configured
# in this file.
set (CPACK_SET_DESTDIR true)
set (CPACK_PACKAGE_VENDOR "@PROJECT_VENDOR@")
set (CPACK_PACKAGE_CONTACT "@PROJECT_CONTACT@")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "@PROJECT_SUMMARY_DESCRIPTION@")
set (CPACK_RESOURCE_FILE_LICENSE "@PROJECT_SOURCE_DIR@/COPYING")
set (CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set (CPACK_PACKAGE_EXECUTABLES wsjtx "@PROJECT_NAME@")
set (CPACK_CREATE_DESKTOP_LINKS wsjtx)
set (CPACK_PACKAGE_EXECUTABLES wsjtx-ft8call "@PROJECT_NAME@")
set (CPACK_CREATE_DESKTOP_LINKS wsjtx-ft8call)
set (CPACK_STRIP_FILES TRUE)
#
@@ -21,7 +23,7 @@ set (CPACK_STRIP_FILES TRUE)
if (CPACK_GENERATOR MATCHES "NSIS")
set (CPACK_STRIP_FILES FALSE) # breaks Qt packaging on Windows
set (CPACK_NSIS_INSTALL_ROOT "C:\\WSJT")
set (CPACK_NSIS_INSTALL_ROOT "C:\\FT8Call")
# set the install/unistall icon used for the installer itself
# There is a bug in NSI that does not handle full unix paths properly.
@@ -35,13 +37,13 @@ if (CPACK_GENERATOR MATCHES "NSIS")
"@PROJECT_HOMEPAGE@" "@PROJECT_NAME@ Web Site"
)
# Use the icon from wsjtx for add-remove programs
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\wsjtx.exe")
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\wsjtx-ft8call.exe")
set (CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
set (CPACK_NSIS_HELP_LINK "@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@")
set (CPACK_NSIS_URL_INFO_ABOUT "@PROJECT_HOMEPAGE@")
set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "wsjtx.exe")
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "wsjtx-ft8call.exe")
set (CPACK_NSIS_MODIFY_PATH ON)
endif ()
@@ -65,9 +67,9 @@ if ("${CPACK_GENERATOR}" STREQUAL "WIX")
# Reset CPACK_PACKAGE_VERSION to deal with WiX restriction.
# But the file names still use the full CMake_VERSION value:
set (CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-${CPACK_SYSTEM_NAME}")
"${CPACK_PACKAGE_NAME}-@wsjtx-ft8call_VERSION@-${CPACK_SYSTEM_NAME}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-Source")
"${CPACK_PACKAGE_NAME}-@wsjtx-ft8call_VERSION@-Source")
if (NOT CPACK_WIX_SIZEOF_VOID_P)
set (CPACK_WIX_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@")
+19 -19
View File
@@ -22,7 +22,7 @@ Change this to the newest SDK available that you can install on your system (10.
Do not override this if you intend to build an official deployable installer.")
endif (APPLE)
project (wsjtx C CXX Fortran)
project (wsjtx-ft8call C CXX Fortran)
#
# CMake policies
@@ -45,10 +45,10 @@ message (STATUS "Building ${CMAKE_PROJECT_NAME}-${wsjtx_VERSION}")
#
# project information
#
set (PROJECT_NAME "WSJT-X")
set (PROJECT_VENDOR "Joe Taylor, K1JT")
set (PROJECT_CONTACT "Joe Taylor <k1jt@arrl.net>")
set (PROJECT_COPYRIGHT "Copyright (C) 2001-2018 by Joe Taylor, K1JT")
set (PROJECT_NAME "FT8Call")
set (PROJECT_VENDOR "Jordan Sherer, KN4CRD")
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_HOMEPAGE http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html)
set (PROJECT_MANUAL wsjtx-main)
set (PROJECT_MANUAL_DIRECTORY_URL http://www.physics.princeton.edu/pulsar/K1JT/wsjtx-doc/)
@@ -1298,7 +1298,7 @@ else (${OPENMP_FOUND} OR APPLE)
endif (${OPENMP_FOUND} OR APPLE)
# build the main application
add_executable (wsjtx MACOSX_BUNDLE
add_executable (wsjtx-ft8call MACOSX_BUNDLE
${wsjtx_CXXSRCS}
${wsjtx_GENUISRCS}
wsjtx.rc
@@ -1307,10 +1307,10 @@ add_executable (wsjtx MACOSX_BUNDLE
)
if (WSJT_CREATE_WINMAIN)
set_target_properties (wsjtx PROPERTIES WIN32_EXECUTABLE ON)
set_target_properties (wsjtx-ft8call PROPERTIES WIN32_EXECUTABLE ON)
endif (WSJT_CREATE_WINMAIN)
set_target_properties (wsjtx PROPERTIES
set_target_properties (wsjtx-ft8call PROPERTIES
MACOSX_BUNDLE_INFO_STRING "${WSJTX_DESCRIPTION_SUMMARY}"
MACOSX_BUNDLE_ICON_FILE "${WSJTX_ICON_FILE}"
MACOSX_BUNDLE_BUNDLE_VERSION ${wsjtx_VERSION}
@@ -1321,27 +1321,27 @@ set_target_properties (wsjtx PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER "org.k1jt.wsjtx"
)
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
target_include_directories (wsjtx-ft8call PRIVATE ${FFTW3_INCLUDE_DIRS})
if (APPLE)
target_link_libraries (wsjtx wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
target_link_libraries (wsjtx-ft8call wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
else ()
target_link_libraries (wsjtx wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
target_link_libraries (wsjtx-ft8call wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES})
if (OpenMP_C_FLAGS)
set_target_properties (wsjtx PROPERTIES
set_target_properties (wsjtx-ft8call PROPERTIES
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
LINK_FLAGS "${OpenMP_C_FLAGS}"
)
endif ()
set_target_properties (wsjtx PROPERTIES
set_target_properties (wsjtx-ft8call PROPERTIES
Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/fortran_modules_omp
)
if (WIN32)
set_target_properties (wsjtx PROPERTIES
set_target_properties (wsjtx-ft8call PROPERTIES
LINK_FLAGS -Wl,--stack,16777216
)
endif ()
endif ()
qt5_use_modules (wsjtx SerialPort) # not sure why the interface link library syntax above doesn't work
qt5_use_modules (wsjtx-ft8call SerialPort) # not sure why the interface link library syntax above doesn't work
# make a library for WSJT-X UDP servers
# add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS})
@@ -1386,18 +1386,18 @@ endif (WSJT_CREATE_WINMAIN)
if (UNIX)
if (NOT WSJT_SKIP_MANPAGES)
add_subdirectory (manpages)
add_dependencies (wsjtx manpages)
add_dependencies (wsjtx-ft8call manpages)
endif (NOT WSJT_SKIP_MANPAGES)
if (NOT APPLE)
add_subdirectory (debian)
add_dependencies (wsjtx debian)
add_dependencies (wsjtx-ft8call debian)
endif (NOT APPLE)
endif (UNIX)
#
# installation
#
install (TARGETS wsjtx
install (TARGETS wsjtx-ft8call
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT runtime
BUNDLE DESTINATION . COMPONENT runtime
)
@@ -1511,7 +1511,7 @@ if (NOT WIN32 AND NOT APPLE)
# install a desktop file so wsjtx appears in the application start
# menu with an icon
install (
FILES wsjtx.desktop message_aggregator.desktop
FILES wsjtx-ft8call.desktop message_aggregator.desktop
DESTINATION share/applications
#COMPONENT runtime
)
+18 -2
View File
@@ -560,6 +560,7 @@ private:
bool miles_;
bool quick_call_;
bool disable_TX_on_73_;
int beacon_;
int watchdog_;
bool TX_messages_;
bool enable_VHF_features_;
@@ -649,6 +650,14 @@ bool Configuration::spot_to_psk_reporter () const
// rig must be open and working to spot externally
return is_transceiver_online () && m_->spot_to_psk_reporter_;
}
void Configuration::set_spot_to_psk_reporter (bool spot)
{
if(m_->spot_to_psk_reporter_ != spot){
m_->spot_to_psk_reporter_ = spot;
m_->write_settings();
}
}
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->monitor_last_used_;}
bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
@@ -661,6 +670,7 @@ bool Configuration::clear_DX () const {return m_->clear_DX_;}
bool Configuration::miles () const {return m_->miles_;}
bool Configuration::quick_call () const {return m_->quick_call_;}
bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;}
int Configuration::beacon () const {return m_->beacon_;}
int Configuration::watchdog () const {return m_->watchdog_;}
bool Configuration::TX_messages () const {return m_->TX_messages_;}
bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;}
@@ -1149,6 +1159,7 @@ void Configuration::impl::initialize_models ()
ui_->miles_check_box->setChecked (miles_);
ui_->quick_call_check_box->setChecked (quick_call_);
ui_->disable_TX_on_73_check_box->setChecked (disable_TX_on_73_);
ui_->beacon_spin_box->setValue (beacon_);
ui_->tx_watchdog_spin_box->setValue (watchdog_);
ui_->TX_messages_check_box->setChecked (TX_messages_);
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
@@ -1336,7 +1347,9 @@ void Configuration::impl::read_settings ()
tx_QSY_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
use_dynamic_grid_ = settings_->value ("AutoGrid", false).toBool ();
macros_.setStringList (settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList ());
auto loadedMacros = settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList();
macros_.setStringList (loadedMacros);
region_ = settings_->value ("Region", QVariant::fromValue (IARURegions::ALL)).value<IARURegions::Region> ();
@@ -1386,7 +1399,8 @@ void Configuration::impl::read_settings ()
miles_ = settings_->value ("Miles", false).toBool ();
quick_call_ = settings_->value ("QuickCall", false).toBool ();
disable_TX_on_73_ = settings_->value ("73TxDisable", false).toBool ();
watchdog_ = settings_->value ("TxWatchdog", 6).toInt ();
beacon_ = settings_->value ("TxBeacon", 5).toInt ();
watchdog_ = settings_->value ("TxWatchdog", 0).toInt ();
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
@@ -1484,6 +1498,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("Miles", miles_);
settings_->setValue ("QuickCall", quick_call_);
settings_->setValue ("73TxDisable", disable_TX_on_73_);
settings_->setValue ("TxBeacon", beacon_);
settings_->setValue ("TxWatchdog", watchdog_);
settings_->setValue ("Tx2QSO", TX_messages_);
settings_->setValue ("CATForceDTR", rig_params_.force_dtr);
@@ -1891,6 +1906,7 @@ void Configuration::impl::accept ()
miles_ = ui_->miles_check_box->isChecked ();
quick_call_ = ui_->quick_call_check_box->isChecked ();
disable_TX_on_73_ = ui_->disable_TX_on_73_check_box->isChecked ();
beacon_ = ui_->beacon_spin_box->value ();
watchdog_ = ui_->tx_watchdog_spin_box->value ();
TX_messages_ = ui_->TX_messages_check_box->isChecked ();
data_mode_ = static_cast<DataMode> (ui_->TX_mode_button_group->checkedId ());
+2
View File
@@ -107,6 +107,7 @@ public:
bool id_after_73 () const;
bool tx_QSY_allowed () const;
bool spot_to_psk_reporter () const;
void set_spot_to_psk_reporter (bool);
bool monitor_off_at_startup () const;
bool monitor_last_used () const;
bool log_as_RTTY () const;
@@ -119,6 +120,7 @@ public:
bool miles () const;
bool quick_call () const;
bool disable_TX_on_73 () const;
int beacon () const;
int watchdog () const;
bool TX_messages () const;
bool split_mode () const;
+123 -22
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>534</width>
<height>530</height>
<width>825</width>
<height>647</height>
</rect>
</property>
<property name="windowTitle">
@@ -16,6 +16,9 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTabWidget" name="configuration_tabs">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Select tab to change configuration parameters.</string>
</property>
@@ -81,18 +84,18 @@
</layout>
</item>
<item>
<layout class="QFormLayout" name="formLayout_21">
<item row="0" column="0">
<widget class="QCheckBox" name="use_dynamic_grid">
<property name="toolTip">
<string>Check to allow grid changes from external programs</string>
</property>
<property name="text">
<string>AutoGrid</string>
</property>
</widget>
</item>
</layout>
<layout class="QFormLayout" name="formLayout_21">
<item row="0" column="0">
<widget class="QCheckBox" name="use_dynamic_grid">
<property name="toolTip">
<string>Check to allow grid changes from external programs</string>
</property>
<property name="text">
<string>AutoGrid</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="formLayout_2">
@@ -117,6 +120,9 @@
<layout class="QFormLayout" name="formLayout_13">
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Message generation for type 2 compound callsign holders:</string>
</property>
@@ -131,7 +137,7 @@
<item row="0" column="1">
<widget class="QComboBox" name="type_2_msg_gen_combo_box">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Type 2 compound callsigns are those with prefixes or suffixes not included in the allowed shortlist (See Help-&amp;gt;Add-on prefixes and suffixes).&lt;/p&gt;&lt;p&gt;This option determines which generated messages should contain your full type 2 compound call sign rather than your base callsign. It only applies if you have a type 2 compound callsign.&lt;/p&gt;&lt;p&gt;This option controls the way the messages that are used to answer CQ calls are generated. Generated messages 6 (CQ) and 5 (73) will always contain your full callsign. The JT65 and JT9 protocols allow for some standard messages with your full call at the expense of another piece of information such as the DX call or your locator.&lt;/p&gt;&lt;p&gt;Choosing message 1 omits the DX callsign which may be an issue when replying to CQ calls. Choosing message 3 also omits the DX callsign and many versions of this and other software will not extract the report. Choosing neither means that your full callsign only goes in your message 5 (73) so your QSO partner may log the wrong callsign.&lt;/p&gt;&lt;p&gt;None of these options are perfect, message 3 is usually best but be aware your QSO partner may not log the report you send them.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -176,6 +182,9 @@
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QCheckBox" name="insert_blank_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Include a separator line between periods in the band activity window.</string>
</property>
@@ -186,6 +195,9 @@
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
@@ -212,6 +224,9 @@
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="miles_check_box">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Show distance to DX station in miles rather than kilometers.</string>
</property>
@@ -222,6 +237,9 @@
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
@@ -234,6 +252,9 @@
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="font_push_button">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Set the font characteristics for the application.</string>
</property>
@@ -244,6 +265,9 @@
</item>
<item>
<widget class="QPushButton" name="decoded_text_font_push_button">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Set the font characteristics for the Band Activity and Rx Frequency areas.</string>
</property>
@@ -269,6 +293,9 @@
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
@@ -292,14 +319,46 @@
<layout class="QGridLayout" name="gridLayout_8">
<item row="4" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QLabel" name="beacon_label_10">
<property name="text">
<string>Beacon every:</string>
</property>
<property name="buddy">
<cstring>beacon_spin_box</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="beacon_spin_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of minutes between unattended beacons&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="suffix">
<string> minutes</string>
</property>
<property name="prefix">
<string/>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="value">
<number>5</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<width>40</width>
<height>0</height>
</size>
</property>
@@ -330,7 +389,7 @@
<string/>
</property>
<property name="value">
<number>6</number>
<number>0</number>
</property>
</widget>
</item>
@@ -351,6 +410,9 @@
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="enable_VHF_features_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Enable VHF/UHF/Microwave features</string>
</property>
@@ -358,6 +420,9 @@
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="decode_at_52s_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Decode after EME delay</string>
</property>
@@ -372,6 +437,9 @@
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="tx_QSY_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -384,6 +452,9 @@
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<widget class="QCheckBox" name="CW_id_after_73_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Send a CW ID after every 73 or free text message.</string>
</property>
@@ -407,6 +478,9 @@
</item>
<item>
<widget class="QLabel" name="label">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -423,6 +497,9 @@
</item>
<item>
<widget class="QSpinBox" name="CW_id_interval_spin_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -451,6 +528,9 @@ quiet period when decoding is done.</string>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="quick_call_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Automatic transmission mode.</string>
</property>
@@ -461,6 +541,9 @@ quiet period when decoding is done.</string>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="disable_TX_on_73_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Turns off automatic transmissions after sending a 73 or any other free
text message.</string>
@@ -1644,6 +1727,9 @@ QListView::item:hover {
<layout class="QGridLayout" name="gridLayout_14">
<item row="0" column="0">
<widget class="QCheckBox" name="prompt_to_log_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>The program will pop up a partially completed Log QSO dialog when you send a 73 or free text message.</string>
</property>
@@ -1691,6 +1777,9 @@ QListView::item:hover {
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="report_in_comments_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Some logging programs will not accept the type of reports
saved by this program.
@@ -1704,6 +1793,9 @@ comments field.</string>
</item>
<item row="3" column="0" colspan="2">
<widget class="QCheckBox" name="clear_DX_check_box">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Check this option to force the clearing of the DX Call
and DX Grid fields when a 73 or free text message is sent.</string>
@@ -2357,6 +2449,9 @@ Right click for insert and delete options.</string>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_5">
<property name="enabled">
<bool>false</bool>
</property>
<property name="title">
<string>Miscellaneous</string>
</property>
@@ -2455,7 +2550,7 @@ Right click for insert and delete options.</string>
<item row="8" column="0">
<widget class="QCheckBox" name="cbx4ToneSpacing">
<property name="enabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@@ -2470,6 +2565,9 @@ Right click for insert and delete options.</string>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User-selectable parameters for JT65 VHF/UHF/Microwave decoding.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
@@ -2551,6 +2649,9 @@ Right click for insert and delete options.</string>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_7">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
@@ -2768,12 +2869,12 @@ soundcard changes</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
</buttongroups>
</ui>
+2 -1
View File
@@ -23,7 +23,8 @@ namespace
"MSK144",
"QRA64",
"FreqCal",
"FT8"
"FT8",
"FT8Free"
};
std::size_t constexpr mode_names_size = sizeof (mode_names) / sizeof (mode_names[0]);
}
+1
View File
@@ -50,6 +50,7 @@ public:
QRA64,
FreqCal,
FT8,
FT8Free,
MODES_END_SENTINAL_AND_COUNT // this must be last
};
Q_ENUM (Mode)
+4 -4
View File
@@ -1,6 +1,6 @@
# Version number components
set (WSJTX_VERSION_MAJOR 1)
set (WSJTX_VERSION_MINOR 9)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 2) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_MAJOR 0)
set (WSJTX_VERSION_MINOR 0)
set (WSJTX_VERSION_PATCH 4)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
+8 -3
View File
@@ -105,7 +105,8 @@ int main(int argc, char *argv[])
// that GUI has correct l18n
// Override programs executable basename as application name.
a.setApplicationName ("WSJT-X");
//a.setApplicationName ("WSJT-X");
a.setApplicationName("FT8Call");
a.setApplicationVersion (version ());
#if QT_VERSION >= 0x050200
@@ -259,7 +260,7 @@ int main(int argc, char *argv[])
multi_settings.set_common_value (splash_flag_name, false);
splash.close ();
});
splash.show ();
//splash.show ();
a.processEvents ();
}
}
@@ -295,8 +296,12 @@ int main(int argc, char *argv[])
mem_jt9.setKey(a.applicationName ());
if(!mem_jt9.attach()) {
std::cerr << QString("memory attach error: %1").arg(mem_jt9.error()).toLocal8Bit ().data () << std::endl;
if (!mem_jt9.create(sizeof(struct dec_data))) {
splash.hide ();
std::cerr << QString("memory create error: %1").arg(mem_jt9.error()).toLocal8Bit ().data () << std::endl;
MessageBox::critical_message (nullptr, a.translate ("main", "Shared memory error"),
a.translate ("main", "Unable to create shared memory segment"));
throw std::runtime_error {"Shared memory error"};
@@ -324,7 +329,7 @@ int main(int argc, char *argv[])
// run the application UI
MainWindow w(temp_dir, multiple, &multi_settings, &mem_jt9, downSampleFactor, &splash);
w.show();
splash.raise ();
//splash.raise ();
QObject::connect (&a, SIGNAL (lastWindowClosed()), &a, SLOT (quit()));
result = a.exec();
}
+1143 -32
View File
File diff suppressed because it is too large Load Diff
+106 -1
View File
@@ -16,6 +16,7 @@
#include <QProgressDialog>
#include <QAbstractSocket>
#include <QHostAddress>
#include <QPair>
#include <QPointer>
#include <QSet>
#include <QVector>
@@ -37,6 +38,7 @@
#include "astro.h"
#include "MessageBox.hpp"
#include "NetworkAccessManager.hpp"
#include "qorderedmap.h"
#define NUM_JT4_SYMBOLS 206 //(72+31)*2, embedded sync
#define NUM_JT65_SYMBOLS 126 //63 data + 63 sync
@@ -117,6 +119,15 @@ public slots:
void msgAvgDecode2();
void fastPick(int x0, int x1, int y);
void clearActivity();
int logRxTxMessageText(QDateTime date, bool isFree, QString text, int freq, bool tx, int block=-1);
void addMessageText(QString text);
void resetMessage();
void resetMessageUI();
void createMessage(QString const& text);
void createMessageTransmitQueue(QString const& text);
void resetMessageTransmitQueue();
QString popMessageFrame();
protected:
void keyPressEvent (QKeyEvent *) override;
void closeEvent(QCloseEvent *) override;
@@ -132,9 +143,13 @@ private slots:
void on_tx5_currentTextChanged (QString const&);
void on_tx6_editingFinished();
void on_actionSettings_triggered();
void preparePSKReporter();
void on_spotButton_clicked(bool checked);
void on_monitorButton_clicked (bool);
void on_actionAbout_triggered();
void on_autoButton_clicked (bool);
void on_labDialFreq_clicked();
void on_monitorTxButton_clicked();
void on_stopTxButton_clicked();
void on_stopButton_clicked();
void on_actionRelease_Notes_triggered ();
@@ -180,6 +195,9 @@ private slots:
void on_txb5_clicked();
void on_txb5_doubleClicked ();
void on_txb6_clicked();
void on_startTxButton_toggled(bool checked);
void splitAndSendNextMessage();
void on_rbNextFreeTextMsg_toggled (bool status);
void on_lookupButton_clicked();
void on_addButton_clicked();
void on_dxCallEntry_textChanged (QString const&);
@@ -201,8 +219,10 @@ private slots:
void on_actionErase_ALL_TXT_triggered();
void on_actionErase_FoxQSO_txt_triggered();
void on_actionErase_wsjtx_log_adi_triggered();
void startTx();
void startTx2();
void startP1();
void continueTx();
void stopTx();
void stopTx2();
void on_pbCallCQ_clicked();
@@ -213,12 +233,38 @@ private slots:
void on_pbSend73_clicked();
void on_rbGenMsg_clicked(bool checked);
void on_rbFreeText_clicked(bool checked);
void on_clearAction_triggered(QObject * sender);
void on_cqMacroButton_clicked();
void on_deMacroButton_clicked();
void on_replyMacroButton_clicked();
void on_qthMacroButton_clicked();
void on_snrMacroButton_clicked();
void on_macrosMacroButton_pressed();
void on_tableWidgetRXAll_cellClicked(int row, int col);
void on_tableWidgetRXAll_cellDoubleClicked(int row, int col);
void on_tableWidgetRXAll_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_tableWidgetCalls_cellClicked(int row, int col);
void on_tableWidgetCalls_cellDoubleClicked(int row, int col);
void on_tableWidgetCalls_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void on_freeTextMsg_currentTextChanged (QString const&);
void on_nextFreeTextMsg_currentTextChanged (QString const&);
void on_extFreeTextMsg_currentTextChanged (QString const&);
void on_extFreeTextMsgEdit_currentTextChanged (QString const&);
QStringList buildFT8MessageFrames(QString const& text);
QString parseFT8Message(QString input);
int countFreeTextMsgs(QString input);
bool prepareNextMessageFrame();
bool isFreqOffsetFree(int f, int bw);
int findFreeFreqOffset(int fmin, int fmax, int bw);
void scheduleBeacon(bool first=false);
void prepareBeacon();
QString calculateDistance(QString const& grid);
void on_rptSpinBox_valueChanged(int n);
void killFile();
void on_tuneButton_clicked (bool);
void on_pbR2T_clicked();
void on_pbT2R_clicked();
void on_beaconButton_clicked();
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
, Frequency dial_freq, QString const& mode
, QString const& rpt_sent, QString const& rpt_received
@@ -285,7 +331,7 @@ private slots:
void on_actionMSK144_triggered();
void on_actionQRA64_triggered();
void on_actionFreqCal_triggered();
void splash_done ();
void splash_done ();
void on_measure_check_box_stateChanged (int);
void on_sbNlist_valueChanged(int n);
void on_sbNslots_valueChanged(int n);
@@ -498,6 +544,7 @@ private:
}
m_QSOProgress;
int m_extFreeTxtPos;
int m_ihsym;
int m_nzap;
int m_npts8;
@@ -545,6 +592,7 @@ private:
QTimer minuteTimer;
QTimer splashTimer;
QTimer p1Timer;
QTimer beaconTimer;
QString m_path;
QString m_baseCall;
@@ -583,6 +631,43 @@ private:
qint32 ncall;
};
struct CallDetail
{
QString call;
QString grid;
int freq;
QDateTime utcTimestamp;
int snr;
};
struct ActivityDetail
{
bool isFree;
bool isLowConfidence;
QString firstCall;
QString secondCall;
int freq;
QString text;
QDateTime utcTimestamp;
int snr;
};
struct RXDetail
{
bool isFree;
int freq;
QString text;
QDateTime utcTimestamp;
};
int m_txFrameCount;
QQueue<QString> m_txFrameQueue;
QQueue<RXDetail> m_rxFrameQueue;
QCache<int, QDateTime> m_rxDirectedCache; // freq -> last directed rx
QCache<QString, int> m_rxCallCache; // call -> last freq seen
QMap<int, int> m_rxFrameBlockNumbers; // freq -> block
QMap<int, QList<ActivityDetail>> m_bandActivity; // freq -> [(text, last timestamp), ...]
QMap<QString, CallDetail> m_callActivity; // call -> (last freq, last timestamp)
QMap<QString,FoxQSO> m_foxQSO;
QMap<QString,QString> m_loggedByFox;
@@ -591,6 +676,7 @@ private:
QQueue<QString> m_foxRR73Queue;
QQueue<qint64> m_foxRateQueue;
QDateTime m_nextBeacon;
QDateTime m_dateTimeQSOOn;
QDateTime m_dateTimeLastTX;
@@ -653,6 +739,8 @@ private:
void locationChange(QString const& location);
void replayDecodes ();
void postDecode (bool is_new, QString const& message);
void displayTransmit();
void displayActivity();
void postWSPRDecode (bool is_new, QStringList message_parts);
void enable_DXCC_entity (bool on);
void switch_mode (Mode);
@@ -700,6 +788,23 @@ private:
void writeFoxQSO(QString msg);
};
class EscapeKeyPressEater : public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_Escape){
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
};
extern int killbyname(const char* progName);
extern void getDev(int* numDevices,char hostAPI_DeviceName[][50],
int minChan[], int maxChan[],
+3522 -2165
View File
File diff suppressed because it is too large Load Diff
Executable
+3
View File
@@ -0,0 +1,3 @@
echo make
echo cp wsjtx ft8call
echo linuxdeployqt ./ft8call -appimage -bundle-non-qt-libs -no-strip -no-translations
+8 -4
View File
@@ -57,12 +57,14 @@ void MeterWidget::paintEvent (QPaintEvent * event)
auto const& target = contentsRect ();
QRect r {QPoint {target.left (), static_cast<int> (target.top () + target.height () - m_signal / (double)MAXDB * target.height ())}
, QPoint {target.right (), target.bottom ()}};
p.setBrush (QColor(85,170,85));
//p.setBrush (QColor(85,170,85));
p.setBrush (Qt::green);
if (m_sigPeak > 85) {
p.setBrush(Qt::red);
}
else if (m_noisePeak < 15) {
p.setBrush(QColor(232,81,0));
//p.setBrush(QColor(232,81,0));
p.setBrush(Qt::yellow);
}
p.drawRect (r);
@@ -70,9 +72,11 @@ void MeterWidget::paintEvent (QPaintEvent * event)
{
// Draw peak hold indicator
auto peak = static_cast<int> (target.top () + target.height () - m_noisePeak / (double)MAXDB * target.height ());
p.setBrush (Qt::black);
//p.setBrush (Qt::black);
p.setBrush (Qt::white);
p.translate (target.left (), peak);
p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
//p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
p.drawPolygon (QPolygon { { {target.width (), -4}, {target.width (), 4}, {0, 0} } });
}
}
+1 -1
View File
@@ -36,7 +36,7 @@ CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor
m_line {0},
m_fSample {12000},
m_nsps {6912},
m_Percent2DScreen {30}, //percent of screen used for 2D display
m_Percent2DScreen {0}, //percent of screen used for 2D display
m_Percent2DScreen0 {0},
m_rxFreq {1020},
m_txFreq {0},
+611
View File
@@ -0,0 +1,611 @@
#ifndef ORDEREDMAP_H
#define ORDEREDMAP_H
#include <QtGlobal>
#include <QHash>
#include <QLinkedList>
#include <QList>
#include <QPair>
template <typename Key> inline bool oMHashEqualToKey(const Key &key1, const Key &key2)
{
// Key type must provide '==' operator
return key1 == key2;
}
template <typename Ptr> inline bool oMHashEqualToKey(Ptr *key1, Ptr *key2)
{
Q_ASSERT(sizeof(quintptr) == sizeof(Ptr *));
return quintptr(key1) == quintptr(key2);
}
template <typename Ptr> inline bool oMHashEqualToKey(const Ptr *key1, const Ptr *key2)
{
Q_ASSERT(sizeof(quintptr) == sizeof(const Ptr *));
return quintptr(key1) == quintptr(key2);
}
template <typename Key, typename Value>
class OrderedMap
{
class OMHash;
typedef typename QLinkedList<Key>::iterator QllIterator;
typedef typename QLinkedList<Key>::const_iterator QllConstIterator;
typedef QPair<Value, QllIterator> OMHashValue;
typedef typename OMHash::iterator OMHashIterator;
typedef typename OMHash::const_iterator OMHashConstIterator;
public:
class iterator;
class const_iterator;
typedef typename OrderedMap<Key, Value>::iterator Iterator;
typedef typename OrderedMap<Key, Value>::const_iterator ConstIterator;
explicit OrderedMap();
OrderedMap(const OrderedMap<Key, Value>& other);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
OrderedMap(OrderedMap<Key, Value>&& other);
#endif
void clear();
bool contains(const Key &key) const;
int count() const;
bool empty() const;
iterator insert(const Key &key, const Value &value);
bool isEmpty() const;
QList<Key> keys() const;
int remove(const Key &key);
int size() const;
Value take(const Key &key);
Value value(const Key &key) const;
Value value(const Key &key, const Value &defaultValue) const;
QList<Value> values() const;
OrderedMap<Key, Value> & operator=(const OrderedMap<Key, Value>& other);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
OrderedMap<Key, Value> & operator=(OrderedMap<Key, Value>&& other);
#endif
bool operator==(const OrderedMap<Key, Value> &other) const;
bool operator!=(const OrderedMap<Key, Value> &other) const;
Value& operator[](const Key &key);
const Value operator[](const Key &key) const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
iterator erase(iterator pos);
iterator find(const Key& key);
const_iterator find(const Key& key) const;
class const_iterator;
class iterator
{
QllIterator qllIter;
OMHash *data;
friend class const_iterator;
friend class OrderedMap;
public:
iterator() : data(NULL) {}
iterator(const QllIterator &qllIter, OMHash *data) :
qllIter(qllIter), data(data) {}
const Key & key() const
{
return *qllIter;
}
Value & value() const
{
OMHashIterator hit = data->find(*qllIter);
OMHashValue &pair = hit.value();
return pair.first;
}
Value & operator*() const
{
return value();
}
iterator operator+(int i) const
{
QllIterator q = qllIter;
q += i;
return iterator(q, data);
}
iterator operator-(int i) const
{
return operator +(- i);
}
iterator& operator+=(int i)
{
qllIter += i;
return *this;
}
iterator& operator-=(int i)
{
qllIter -= i;
return *this;
}
iterator& operator++()
{
++qllIter;
return *this;
}
iterator operator++(int)
{
iterator it = *this;
qllIter++;
return it;
}
iterator operator--()
{
--qllIter;
return *this;
}
iterator operator--(int)
{
iterator it = *this;
qllIter--;
return it;
}
bool operator ==(const iterator &other) const
{
return (qllIter == other.qllIter);
}
bool operator !=(const iterator &other) const
{
return (qllIter != other.qllIter);
}
};
class const_iterator
{
QllConstIterator qllConstIter;
const OMHash *data;
public:
const_iterator() : data(NULL) {}
const_iterator(const iterator &i) :
qllConstIter(i.qllIter), data(i.data) {}
const_iterator(const QllConstIterator &qllConstIter, const OMHash* data) :
qllConstIter(qllConstIter), data(data) {}
const Key & key() const
{
return *qllConstIter;
}
const Value & value() const
{
OMHashConstIterator hit = data->find(*qllConstIter);
const OMHashValue &pair = hit.value();
return pair.first;
}
const Value & operator*() const
{
return value();
}
const_iterator operator+(int i) const
{
QllConstIterator q = qllConstIter;
q += i;
return const_iterator(q, data);
}
const_iterator operator-(int i) const
{
return operator +(- i);
}
const_iterator& operator+=(int i)
{
qllConstIter += i;
return *this;
}
const_iterator& operator-=(int i)
{
qllConstIter -= i;
return *this;
}
const_iterator& operator++()
{
++qllConstIter;
return *this;
}
const_iterator operator++(int)
{
const_iterator it = *this;
qllConstIter++;
return it;
}
const_iterator operator--()
{
--qllConstIter;
return *this;
}
const_iterator operator--(int)
{
const_iterator it = *this;
qllConstIter--;
return it;
}
bool operator ==(const const_iterator &other) const
{
return (qllConstIter == other.qllConstIter);
}
bool operator !=(const const_iterator &other) const
{
return (qllConstIter != other.qllConstIter);
}
};
private:
class OMHash : public QHash<Key, OMHashValue >
{
public:
bool operator == (const OMHash &other) const
{
if (size() != other.size()) {
return false;
}
if (QHash<Key, OMHashValue >::operator ==(other)) {
return true;
}
typename QHash<Key, OMHashValue >::const_iterator it1 = this->constBegin();
typename QHash<Key, OMHashValue >::const_iterator it2 = other.constBegin();
while(it1 != this->end()) {
OMHashValue v1 = it1.value();
OMHashValue v2 = it2.value();
if ((v1.first != v2.first) || !oMHashEqualToKey<Key>(it1.key(), it2.key())) {
return false;
}
++it1;
++it2;
}
return true;
}
};
private:
void copy(const OrderedMap<Key, Value> &other);
OMHash data;
QLinkedList<Key> insertOrder;
};
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap() {}
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap(const OrderedMap<Key, Value>& other)
{
copy(other);
}
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
template <typename Key, typename Value>
OrderedMap<Key, Value>::OrderedMap(OrderedMap<Key, Value>&& other)
{
data = std::move(other.data);
insertOrder = std::move(other.insertOrder);
}
#endif
template <typename Key, typename Value>
void OrderedMap<Key, Value>::clear()
{
data.clear();
insertOrder.clear();
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::contains(const Key &key) const
{
return data.contains(key);
}
template <typename Key, typename Value>
int OrderedMap<Key, Value>::count() const
{
return data.count();
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::empty() const
{
return data.empty();
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::insert(const Key &key, const Value &value)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
// New key
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
OMHashValue pair(value, ioIter);
data.insert(key, pair);
return iterator(ioIter, &data);
}
OMHashValue pair = it.value();
// remove old reference
insertOrder.erase(pair.second);
// Add new reference
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
pair.first = value;
pair.second = ioIter;
return iterator(ioIter, &data);
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::isEmpty() const
{
return data.isEmpty();
}
template<typename Key, typename Value>
QList<Key> OrderedMap<Key, Value>::keys() const
{
return QList<Key>::fromStdList(insertOrder.toStdList());
}
template<typename Key, typename Value>
int OrderedMap<Key, Value>::remove(const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
return 0;
}
OMHashValue pair = it.value();
insertOrder.erase(pair.second);
data.erase(it);
return 1;
}
template<typename Key, typename Value>
int OrderedMap<Key, Value>::size() const
{
return data.size();
}
template<typename Key, typename Value>
void OrderedMap<Key, Value>::copy(const OrderedMap<Key, Value> &other)
{
/* Since I'm storing iterators of QLinkedList, I simply cannot make
* a trivial copy of the linked list. This is a limitation due to implicit
* sharing used in Qt containers, due to which iterator active on one
* QLL can change the data of another QLL even after creating a copy.
*
* Because of this, the old iterators have to be invalidated and new ones
* have to be generated.
*/
insertOrder.clear();
// Copy hash
data = other.data;
QllConstIterator cit = other.insertOrder.begin();
for (; cit != other.insertOrder.end(); ++cit) {
Key key = *cit;
QllIterator ioIter = insertOrder.insert(insertOrder.end(), key);
OMHashIterator it = data.find(key);
(*it).second = ioIter;
}
}
template<typename Key, typename Value>
Value OrderedMap<Key, Value>::take(const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
return Value();
}
OMHashValue pair = it.value();
insertOrder.erase(pair.second);
data.erase(it);
return pair.first;
}
template <typename Key, typename Value>
Value OrderedMap<Key, Value>::value(const Key &key) const
{
return data.value(key).first;
}
template <typename Key, typename Value>
Value OrderedMap<Key, Value>::value(const Key &key, const Value &defaultValue) const
{
OMHashConstIterator it = data.constFind(key);
if (it == data.end()) {
return defaultValue;
}
OMHashValue pair = it.value();
return pair.first;
}
template <typename Key, typename Value>
QList<Value> OrderedMap<Key, Value>::values() const
{
QList<Value> values;
foreach (const Key &key, insertOrder.toStdList()) {
OMHashValue v = data.value(key);
values.append(v.first);
}
return values;
}
template <typename Key, typename Value>
OrderedMap<Key, Value> & OrderedMap<Key, Value>::operator=(const OrderedMap<Key, Value>& other)
{
if (this != &other) {
copy(other);
}
return *this;
}
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
template <typename Key, typename Value>
OrderedMap<Key, Value> & OrderedMap<Key, Value>::operator=(OrderedMap<Key, Value>&& other)
{
if (this != &other) {
data = other.data;
insertOrder = other.insertOrder;
}
return *this;
}
#endif
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::operator==(const OrderedMap<Key, Value> &other) const
{
// 2 Ordered maps are equal if they have the same contents in the same order
return ((data == other.data) && (insertOrder == other.insertOrder));
}
template <typename Key, typename Value>
bool OrderedMap<Key, Value>::operator!=(const OrderedMap<Key, Value> &other) const
{
return ((data != other.data) || (insertOrder != other.insertOrder));
}
template <typename Key, typename Value>
Value& OrderedMap<Key, Value>::operator[](const Key &key)
{
OMHashIterator it = data.find(key);
if (it == data.end()) {
insert(key, Value());
it = data.find(key);
}
OMHashValue &pair = it.value();
return pair.first;
}
template <typename Key, typename Value>
const Value OrderedMap<Key, Value>::operator[](const Key &key) const
{
return value(key);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::begin()
{
return iterator(insertOrder.begin(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::begin() const
{
return const_iterator(insertOrder.begin(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::end()
{
return iterator(insertOrder.end(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::end() const
{
return const_iterator(insertOrder.end(), &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::erase(iterator pos)
{
OMHashIterator hit = data.find(*(pos.qllIter));
if (hit == data.end()) {
return pos;
}
data.erase(hit);
QllIterator ioIter = insertOrder.erase(pos.qllIter);
return iterator(ioIter, &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::iterator OrderedMap<Key, Value>::find(const Key& key)
{
OMHashIterator hit = data.find(key);
if (hit == data.end()) {
return end();
}
return iterator(hit.value().second, &data);
}
template <typename Key, typename Value>
typename OrderedMap<Key, Value>::const_iterator OrderedMap<Key, Value>::find(const Key& key) const
{
OMHashConstIterator hit = data.find(key);
if (hit == data.end()) {
return end();
}
return const_iterator(hit.value().second, &data);
}
#endif // ORDEREDMAP_H
+7 -2
View File
@@ -27,6 +27,7 @@ namespace
QString revision (QString const& svn_rev_string)
{
QString result;
#if 0
auto revision_from_svn = revision_extract_number (svn_rev_string);
#if defined (CMAKE_BUILD)
@@ -59,6 +60,7 @@ QString revision (QString const& svn_rev_string)
// not CMake build so all we have is revision passed
result = revision_from_svn;
}
#endif
#endif
return result.trimmed ();
}
@@ -70,19 +72,22 @@ QString version (bool include_patch)
if (include_patch)
{
v += "." WSJTX_STRINGIZE (WSJTX_VERSION_PATCH)
#if 0
# if defined (WSJTX_RC)
+ "-rc" WSJTX_STRINGIZE (WSJTX_RC)
# endif
#endif
;
}
#else
QString v {"Not for Release"};
#endif
return v;
}
QString program_title (QString const& revision)
{
QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()};
return id + " " + revision + " by K1JT";
QString id {"FT8Call de KN4CRD (v%1) a derivative of WSJT-X by K1JT"};
return id.arg(QCoreApplication::applicationVersion ());
}
+8 -1
View File
@@ -44,6 +44,7 @@ protected:
QWidget::paintEvent (event);
QPainter p {this};
p.setPen(Qt::white);
auto const& target = contentsRect ();
QFontMetrics font_metrics {p.font (), this};
auto font_offset = font_metrics.ascent () / 2;
@@ -82,12 +83,18 @@ SignalMeter::SignalMeter (QWidget * parent)
m_meter = new MeterWidget;
m_meter->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Minimum);
inner_layout->addWidget (m_meter);
//inner_layout->addWidget (m_meter);
m_scale = new Scale;
inner_layout->addWidget (m_scale);
// add this second...
inner_layout->addWidget (m_meter);
m_reading = new QLabel(this);
auto p = m_reading->palette();
p.setColor(m_reading->foregroundRole(), Qt::white);
m_reading->setPalette(p);
outer_layout->addLayout (inner_layout);
outer_layout->addWidget (m_reading);
+6 -5
View File
@@ -64,8 +64,8 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
ui->bppSpinBox->setValue(n);
m_nsmo=m_settings->value("SmoothYellow",1).toInt();
ui->smoSpinBox->setValue(m_nsmo);
m_Percent2DScreen=m_settings->value("Percent2D",30).toInt();
m_waterfallAvg = m_settings->value("WaterfallAvg",5).toInt();
m_Percent2DScreen=m_settings->value("Percent2D", 0).toInt();
m_waterfallAvg = m_settings->value("WaterfallAvg", 1).toInt();
ui->waterfallAvgSpinBox->setValue(m_waterfallAvg);
ui->widePlot->setWaterfallAvg(m_waterfallAvg);
ui->widePlot->setCurrent(m_settings->value("Current",false).toBool());
@@ -76,17 +76,18 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
if(ui->widePlot->cumulative()) ui->spec2dComboBox->setCurrentIndex(1);
if(ui->widePlot->linearAvg()) ui->spec2dComboBox->setCurrentIndex(2);
if(ui->widePlot->Reference()) ui->spec2dComboBox->setCurrentIndex(3);
int nbpp=m_settings->value("BinsPerPixel",2).toInt();
int nbpp=m_settings->value("BinsPerPixel", 4).toInt();
ui->widePlot->setBinsPerPixel(nbpp);
ui->sbPercent2dPlot->setValue(m_Percent2DScreen);
ui->widePlot->SetPercent2DScreen(m_Percent2DScreen);
ui->widePlot->setStartFreq(m_settings->value("StartFreq",0).toInt());
ui->fStartSpinBox->setValue(ui->widePlot->startFreq());
m_waterfallPalette=m_settings->value("WaterfallPalette","Default").toString();
m_userPalette = WFPalette {m_settings->value("UserPalette").value<WFPalette::Colours> ()};
m_fMinPerBand = m_settings->value ("FminPerBand").toHash ();
setRxRange ();
ui->controls_widget->setVisible(!m_settings->value("HideControls",false).toBool());
ui->cbControls->setChecked(!m_settings->value("HideControls",false).toBool());
ui->controls_widget->setVisible(!m_settings->value("HideControls", true).toBool());
ui->cbControls->setChecked(!m_settings->value("HideControls", true).toBool());
}
int index=0;
+4 -4
View File
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>799</width>
<width>942</width>
<height>337</height>
</rect>
</property>
@@ -68,7 +68,7 @@
<string>Controls</string>
</property>
<property name="checked">
<bool>true</bool>
<bool>false</bool>
</property>
</widget>
</widget>
@@ -219,7 +219,7 @@
<number>5</number>
</property>
<property name="value">
<number>30</number>
<number>0</number>
</property>
</widget>
</item>
@@ -293,7 +293,7 @@
<number>1</number>
</property>
<property name="value">
<number>2</number>
<number>5</number>
</property>
</widget>
</item>
+11
View File
@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=wsjtx-ft8call
Comment=Amateur Radio Weak Signal Operating
Exec=wsjtx-ft8call
Icon=wsjtx_icon
Terminal=false
X-MultipleArgs=false
Type=Application
Categories=AudioVideo;Audio;HamRadio;
StartupNotify=true
+2 -1
View File
@@ -83,7 +83,8 @@ HEADERS += qt_helpers.hpp \
logbook/logbook.h logbook/countrydat.h logbook/countriesworked.h logbook/adif.h \
messageaveraging.h echoplot.h echograph.h fastgraph.h fastplot.h Modes.hpp WSPRBandHopping.hpp \
WsprTxScheduler.h SampleDownloader.hpp MultiSettings.hpp PhaseEqualizationDialog.hpp \
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp
IARURegions.hpp MessageBox.hpp EqualizationToolsDialog.hpp \
qorderedmap.h
INCLUDEPATH += qmake_only
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2018-02-02T18:34:55. -->
<!-- Written by QtCreator 3.5.1, 2018-03-10T16:32:07. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>