Compare commits

..

No commits in common. "master" and "wsjtx-2.5.0-rc2" have entirely different histories.

178 changed files with 7440 additions and 25285 deletions

View File

@ -26,7 +26,7 @@ if (WIN32)
add_custom_command (
OUTPUT ${outfile}.h ${outfile}.cpp
COMMAND ${DUMPCPP_Executable}
ARGS ${ax_server_options} -o "${outfile}" "${infile}"
ARGS ${AX_SERVER_options} -o "${outfile}" "${infile}"
MAIN_DEPENDENCY ${infile} VERBATIM)
list (APPEND ${outfiles} ${outfile}.cpp)
endforeach()

View File

@ -45,7 +45,7 @@ if (POLICY CMP0075)
endif ()
project (wsjtx
VERSION 2.6.0.0
VERSION 2.5.0.0
LANGUAGES C CXX Fortran
)
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
@ -126,8 +126,7 @@ option (WSJT_GENERATE_DOCS "Generate documentation files." ON)
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.")
option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON)
CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in Release configuration." OFF
"NOT is_debug_build" OFF)
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
is_debug_build OFF)
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
@ -274,7 +273,6 @@ set (wsjtx_CXXSRCS
widgets/about.cpp
widgets/astro.cpp
widgets/messageaveraging.cpp
widgets/activeStations.cpp
widgets/colorhighlighting.cpp
WSPR/WsprTxScheduler.cpp
widgets/mainwindow.cpp
@ -338,7 +336,6 @@ set (wsjt_FSRCS
lib/timer_module.f90
lib/wavhdr.f90
lib/qra/q65/q65_encoding_modules.f90
lib/ft8/ft8_a7.f90
# remaining non-module sources
lib/addit.f90
@ -385,7 +382,6 @@ set (wsjt_FSRCS
lib/demod64a.f90
lib/determ.f90
lib/downsam9.f90
lib/echo_snr.f90
lib/encode232.f90
lib/encode4.f90
lib/encode_msk40.f90
@ -464,6 +460,7 @@ set (wsjt_FSRCS
lib/inter_wspr.f90
lib/jplsubs.f
lib/jt9fano.f90
lib/jtmsg.f90
lib/libration.f90
lib/lorentzian.f90
lib/fst4/lorentzian_fading.f90
@ -508,7 +505,6 @@ set (wsjt_FSRCS
lib/qra/q65/q65_set_list.f90
lib/refspectrum.f90
lib/savec2.f90
lib/save_dxbase.f90
lib/sec0.f90
lib/sec_midn.f90
lib/setup65.f90
@ -543,7 +539,6 @@ set (wsjt_FSRCS
lib/sync9.f90
lib/sync9f.f90
lib/sync9w.f90
lib/test_snr.f90
lib/timf2.f90
lib/tweak1.f90
lib/twkfreq.f90
@ -654,7 +649,6 @@ set (wsjtx_UISRCS
widgets/echograph.ui
widgets/fastgraph.ui
widgets/messageaveraging.ui
widgets/activeStations.ui
widgets/widegraph.ui
widgets/logqso.ui
Configuration.ui
@ -890,6 +884,8 @@ find_program (RIGCTLCOM_EXE rigctlcom)
check_type_size (CACHE_ALL HAMLIB_OLD_CACHING)
check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING)
find_package (Portaudio REQUIRED)
find_package (Usb REQUIRED)
#
@ -1099,7 +1095,7 @@ target_link_libraries (wsjt_fort ${FFTW3_LIBRARIES})
if (${OPENMP_FOUND} OR APPLE)
add_library (wsjt_fort_omp STATIC ${wsjt_FSRCS})
target_link_libraries (wsjt_fort_omp ${FFTW3_LIBRARIES})
if (OpenMP_C_FLAGS AND NOT APPLE)
if (OpenMP_C_FLAGS)
set_target_properties (wsjt_fort_omp
PROPERTIES
COMPILE_FLAGS "${OpenMP_C_FLAGS}"
@ -1132,9 +1128,6 @@ target_link_libraries (jt65sim wsjt_fort wsjt_cxx)
add_executable (sumsim lib/sumsim.f90)
target_link_libraries (sumsim wsjt_fort wsjt_cxx)
add_executable (test_snr lib/test_snr.f90)
target_link_libraries (test_snr wsjt_fort)
add_executable (q65sim lib/qra/q65/q65sim.f90)
target_link_libraries (q65sim wsjt_fort wsjt_cxx)
@ -1267,11 +1260,9 @@ set (LANGUAGES
ja # Japanese
#no # Norwegian
#pt # Portuguese
ru # Russian
#sv # Swedish
zh # Chinese
zh_HK # Chinese per Hong Kong
zh_TW # Chinese traditional
it # Italian
)
foreach (lang_ ${LANGUAGES})
@ -1414,7 +1405,6 @@ endif (${OPENMP_FOUND} OR APPLE)
if (WIN32)
# build map65
find_package (Portaudio REQUIRED)
add_subdirectory (map65)
endif ()
@ -1451,7 +1441,7 @@ set_target_properties (wsjtx PROPERTIES
)
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
if ((NOT ${OPENMP_FOUND}) OR APPLE)
if (APPLE)
target_link_libraries (wsjtx wsjt_fort)
else ()
target_link_libraries (wsjtx wsjt_fort_omp)

View File

@ -208,7 +208,7 @@ namespace
int const combo_box_item_disabled (0);
// QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>]*"};
QRegularExpression RTTY_roundup_exchange_re {
R"(
(
@ -593,7 +593,6 @@ private:
bool highlight_by_mode_;
bool highlight_only_fields_;
bool include_WAE_entities_;
bool highlight_73_;
int LotW_days_since_upload_;
TransceiverFactory::ParameterPack rig_params_;
@ -646,7 +645,6 @@ private:
bool TX_messages_;
bool enable_VHF_features_;
bool decode_at_52s_;
bool Tune_watchdog_disabled_;
bool single_decode_;
bool twoPass_;
bool bSpecialOp_;
@ -672,8 +670,6 @@ private:
bool bLowSidelobes_;
bool pwrBandTxMemory_;
bool pwrBandTuneMemory_;
bool highlight_DXcall_;
bool highlight_DXgrid_;
QAudioDeviceInfo audio_input_device_;
QAudioDeviceInfo next_audio_input_device_;
@ -754,7 +750,6 @@ 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_;}
bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;}
bool Configuration::Tune_watchdog_disabled () const {return m_->Tune_watchdog_disabled_;}
bool Configuration::single_decode () const {return m_->single_decode_;}
bool Configuration::twoPass() const {return m_->twoPass_;}
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
@ -792,9 +787,6 @@ DecodeHighlightingModel const& Configuration::decode_highlighting () const {retu
bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;}
bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;}
bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;}
bool Configuration::highlight_73 () const {return m_->highlight_73_;}
bool Configuration::highlight_DXcall () const {return m_->highlight_DXcall_;}
bool Configuration::highlight_DXgrid () const {return m_->highlight_DXgrid_;}
void Configuration::set_calibration (CalibrationParams params)
{
@ -901,7 +893,7 @@ QString Configuration::Field_Day_Exchange() const
{
return m_->FD_exchange_;
}
/*
void Configuration::setEU_VHF_Contest()
{
m_->bSpecialOp_=true;
@ -910,7 +902,6 @@ void Configuration::setEU_VHF_Contest()
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::EU_VHF);
m_->write_settings();
}
*/
QString Configuration::RTTY_Exchange() const
{
@ -929,30 +920,6 @@ void Configuration::set_location (QString const& grid_descriptor)
m_->dynamic_grid_ = grid_descriptor.trimmed ();
}
void Configuration::setSpecial_Hound()
{
m_->bSpecialOp_=true;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->ui_->rbHound->setChecked(true);
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::HOUND);
m_->write_settings();
}
void Configuration::setSpecial_Fox()
{
m_->bSpecialOp_=true;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->ui_->rbFox->setChecked(true);
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::FOX);
m_->write_settings();
}
void Configuration::setSpecial_None()
{
m_->bSpecialOp_=false;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->write_settings();
}
namespace
{
#if defined (Q_OS_MAC)
@ -1017,7 +984,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
, highlight_by_mode_ {false}
, highlight_only_fields_ {false}
, include_WAE_entities_ {false}
, highlight_73_ {false}
, LotW_days_since_upload_ {0}
, last_port_type_ {TransceiverFactory::Capabilities::none}
, rig_is_dummy_ {false}
@ -1156,7 +1122,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY));
ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY));
ui_->special_op_activity_button_group->setId (ui_->rbWW_DIGI, static_cast<int> (SpecialOperatingActivity::WW_DIGI));
ui_->special_op_activity_button_group->setId (ui_->rbARRL_Digi, static_cast<int> (SpecialOperatingActivity::ARRL_DIGI));
ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX));
ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND));
@ -1355,7 +1320,6 @@ void Configuration::impl::initialize_models ()
ui_->TX_messages_check_box->setChecked (TX_messages_);
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
ui_->decode_at_52s_check_box->setChecked(decode_at_52s_);
ui_->disable_Tune_watchdog_check_box->setChecked(Tune_watchdog_disabled_);
ui_->single_decode_check_box->setChecked(single_decode_);
ui_->cbTwoPass->setChecked(twoPass_);
ui_->gbSpecialOpActivity->setChecked(bSpecialOp_);
@ -1433,10 +1397,7 @@ void Configuration::impl::initialize_models ()
ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_);
ui_->only_fields_check_box->setChecked (highlight_only_fields_);
ui_->include_WAE_check_box->setChecked (include_WAE_entities_);
ui_->highlight_73_check_box->setChecked (highlight_73_);
ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_);
ui_->cbHighlightDXcall->setChecked(highlight_DXcall_);
ui_->cbHighlightDXgrid->setChecked(highlight_DXgrid_);
set_rig_invariants ();
}
@ -1531,7 +1492,6 @@ void Configuration::impl::read_settings ()
highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool ();
highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool ();
include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool ();
highlight_73_ = settings_->value("Highlight73", false).toBool ();
LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);
@ -1571,7 +1531,6 @@ void Configuration::impl::read_settings ()
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
Tune_watchdog_disabled_ = settings_->value("TuneWatchdogDisabled",false).toBool ();
single_decode_ = settings_->value("SingleDecode",false).toBool ();
twoPass_ = settings_->value("TwoPass",true).toBool ();
bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool ();
@ -1595,8 +1554,6 @@ void Configuration::impl::read_settings ()
calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
highlight_DXcall_ = settings_->value("highlight_DXcall",false).toBool ();
highlight_DXgrid_ = settings_->value("highlight_DXgrid",false).toBool ();
}
void Configuration::impl::find_audio_devices ()
@ -1669,7 +1626,6 @@ void Configuration::impl::write_settings ()
settings_->setValue ("HighlightByMode", highlight_by_mode_);
settings_->setValue ("OnlyFieldsSought", highlight_only_fields_);
settings_->setValue ("IncludeWAEEntities", include_WAE_entities_);
settings_->setValue ("Highlight73", highlight_73_);
settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_);
settings_->setValue ("toRTTY", log_as_RTTY_);
settings_->setValue ("dBtoComments", report_in_comments_);
@ -1706,7 +1662,6 @@ void Configuration::impl::write_settings ()
settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode));
settings_->setValue ("VHFUHF", enable_VHF_features_);
settings_->setValue ("Decode52", decode_at_52s_);
settings_->setValue ("TuneWatchdogDisabled", Tune_watchdog_disabled_);
settings_->setValue ("SingleDecode", single_decode_);
settings_->setValue ("TwoPass", twoPass_);
settings_->setValue ("SelectedActivity", SelectedActivity_);
@ -1730,8 +1685,6 @@ void Configuration::impl::write_settings ()
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
settings_->setValue ("Region", QVariant::fromValue (region_));
settings_->setValue ("AutoGrid", use_dynamic_grid_);
settings_->setValue ("highlight_DXcall", highlight_DXcall_);
settings_->setValue ("highlight_DXgrid", highlight_DXgrid_);
settings_->sync ();
}
@ -2135,7 +2088,6 @@ void Configuration::impl::accept ()
azel_directory_.setPath (ui_->azel_path_display_label->text ());
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
Tune_watchdog_disabled_ = ui_->disable_Tune_watchdog_check_box->isChecked ();
single_decode_ = ui_->single_decode_check_box->isChecked ();
twoPass_ = ui_->cbTwoPass->isChecked ();
bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked ();
@ -2211,7 +2163,6 @@ void Configuration::impl::accept ()
highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked ();
highlight_only_fields_ = ui_->only_fields_check_box->isChecked ();
include_WAE_entities_ = ui_->include_WAE_check_box->isChecked ();
highlight_73_ = ui_->highlight_73_check_box->isChecked ();
LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);
@ -2221,8 +2172,7 @@ void Configuration::impl::accept ()
dynamic_grid_.clear ();
}
use_dynamic_grid_ = ui_->use_dynamic_grid->isChecked();
highlight_DXcall_ = ui_->cbHighlightDXcall->isChecked();
highlight_DXgrid_ = ui_->cbHighlightDXgrid->isChecked();
write_settings (); // make visible to all
}
@ -2785,7 +2735,6 @@ bool Configuration::impl::open_rig (bool force)
ui_->test_CAT_push_button->setStyleSheet ({});
rig_active_ = true;
LOG_TRACE ("emitting startup_transceiver");
Q_EMIT start_transceiver (++transceiver_command_number_); // start rig on its thread
result = true;
}
@ -2833,7 +2782,6 @@ void Configuration::impl::transceiver_frequency (Frequency f)
cached_rig_state_.frequency (apply_calibration (f + current_offset_));
// qDebug () << "Configuration::impl::transceiver_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
}
@ -2860,7 +2808,6 @@ void Configuration::impl::transceiver_tx_frequency (Frequency f)
}
// qDebug () << "Configuration::impl::transceiver_tx_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
}
}
@ -2870,7 +2817,6 @@ void Configuration::impl::transceiver_mode (MODE m)
cached_rig_state_.online (true); // we want the rig online
cached_rig_state_.mode (m);
// qDebug () << "Configuration::impl::transceiver_mode: n:" << transceiver_command_number_ + 1 << "m:" << m;
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
}
@ -2880,7 +2826,6 @@ void Configuration::impl::transceiver_ptt (bool on)
set_cached_mode ();
cached_rig_state_.ptt (on);
// qDebug () << "Configuration::impl::transceiver_ptt: n:" << transceiver_command_number_ + 1 << "on:" << on;
LOG_TRACE ("emitting set_transceiver: requested state:" << cached_rig_state_);
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
}
@ -2964,7 +2909,6 @@ void Configuration::impl::close_rig ()
if (rig_active_)
{
ui_->test_CAT_push_button->setStyleSheet ("QPushButton {background-color: red;}");
LOG_TRACE ("emitting stop_transceiver");
Q_EMIT stop_transceiver ();
for (auto const& connection: rig_connections_)
{

View File

@ -134,7 +134,6 @@ public:
bool split_mode () const;
bool enable_VHF_features () const;
bool decode_at_52s () const;
bool Tune_watchdog_disabled () const;
bool single_decode () const;
bool twoPass() const;
bool bFox() const;
@ -182,14 +181,8 @@ public:
bool highlight_by_mode () const;
bool highlight_only_fields () const;
bool include_WAE_entities () const;
bool highlight_73 () const;
void setSpecial_Hound();
void setSpecial_Fox();
void setSpecial_None();
bool highlight_DXcall () const;
bool highlight_DXgrid () const;
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, ARRL_DIGI, FOX, HOUND};
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND};
SpecialOperatingActivity special_op_id () const;
struct CalibrationParams

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>588</width>
<height>642</height>
<width>554</width>
<height>560</height>
</rect>
</property>
<property name="windowTitle">
@ -171,6 +171,46 @@
<string>Display</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="3" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
<property name="text">
<string>&amp;Tx messages to Rx frequency window</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
<property name="text">
<string>Show &amp;DXCC, grid, and worked-before status</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="decodes_from_top_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.&lt;/p&gt;&lt;p&gt;This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Start new period decodes at top</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="4">
<layout class="QHBoxLayout" name="horizontalLayout_21">
<item>
@ -245,60 +285,6 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="cbHighlightDXgrid">
<property name="text">
<string>Highlight DX Grid in message</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="cbHighlightDXcall">
<property name="text">
<string>Highlight DX Call in message</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="decodes_from_top_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.&lt;/p&gt;&lt;p&gt;This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Start new period decodes at top</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
<property name="text">
<string>&amp;Tx messages to Rx frequency window</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
<property name="text">
<string>Show &amp;DXCC, grid, and worked-before status</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -503,16 +489,6 @@ quiet period when decoding is done.</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="disable_Tune_watchdog_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the Tune watchdog.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Disable Tune watchdog</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -2326,23 +2302,6 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="include_WAE_check_box">
<property name="text">
<string>Include extra WAE entities</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="only_fields_check_box">
<property name="toolTip">
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
</property>
<property name="text">
<string>Only grid Fields sought</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="DecodeHighlightingListView" name="highlighting_list_view">
<property name="sizePolicy">
@ -2390,10 +2349,20 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="highlight_73_check_box">
<item row="4" column="0">
<widget class="QCheckBox" name="include_WAE_check_box">
<property name="text">
<string>Highlight also messages with 73 or RR73</string>
<string>Include extra WAE entities</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="only_fields_check_box">
<property name="toolTip">
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
</property>
<property name="text">
<string>Only grid Fields sought</string>
</property>
</widget>
</item>
@ -2514,10 +2483,78 @@ Right click for insert and delete options.</string>
<string>Advanced</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<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>
<property name="title">
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
</property>
<layout class="QFormLayout" name="formLayout_11">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Random erasure patterns:</string>
</property>
<property name="buddy">
<cstring>sbNtrials</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="sbNtrials">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>12</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Aggressive decoding level:</string>
</property>
<property name="buddy">
<cstring>sbAggressive</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbAggressive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Higher levels will increase the probability of decoding, but will also increase probability of a false decode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="cbTwoPass">
<property name="text">
<string>Two-pass decoding</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="gbSpecialOpActivity">
<property name="title">
<string>Special operating activity</string>
<string>Special operating activity: Generation of FT4, FT8, and MSK144 messages</string>
</property>
<property name="checkable">
<bool>true</bool>
@ -2526,6 +2563,47 @@ Right click for insert and delete options.</string>
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,0,0,0">
<item row="0" column="3">
<widget class="QRadioButton" name="rbHound">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT8 DXpedition mode: Hound operator calling the DX.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>Hound</string>
</property>
<property name="text">
<string>Hound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rbNA_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>NA VHF Contest</string>
</property>
<property name="text">
<string>NA VHF Contest</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rbFox">
<property name="toolTip">
@ -2567,28 +2645,6 @@ Right click for insert and delete options.</string>
</attribute>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rbNA_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>NA VHF Contest</string>
</property>
<property name="text">
<string>NA VHF</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
@ -2602,24 +2658,74 @@ Right click for insert and delete options.</string>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QRadioButton" name="rbHound">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT8 DXpedition mode: Hound operator calling the DX.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>Hound</string>
</property>
<property name="text">
<string>Hound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
<item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTY_Roundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>R T T Y Roundup</string>
</property>
<property name="text">
<string>RTTY Roundup messages</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="accessibleName">
<string>RTTY Roundup exchange</string>
</property>
<property name="text">
<string>RTTY RU Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
@ -2712,88 +2818,6 @@ Right click for insert and delete options.</string>
</attribute>
</widget>
</item>
<item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTY_Roundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>R T T Y Roundup</string>
</property>
<property name="text">
<string>FT Roundup</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="accessibleName">
<string>RTTY Roundup exchange</string>
</property>
<property name="text">
<string>FT RU Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="3" column="3">
<widget class="QRadioButton" name="rbARRL_Digi">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL International Digital Contest&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>ARRL Digi Contest</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
@ -2969,74 +2993,6 @@ Right click for insert and delete options.</string>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<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>
<property name="title">
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
</property>
<layout class="QFormLayout" name="formLayout_11">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Random erasure patterns:</string>
</property>
<property name="buddy">
<cstring>sbNtrials</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="sbNtrials">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>12</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Aggressive decoding level:</string>
</property>
<property name="buddy">
<cstring>sbAggressive</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbAggressive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Higher levels will increase the probability of decoding, but will also increase probability of a false decode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="cbTwoPass">
<property name="text">
<string>Two-pass decoding</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
@ -3278,12 +3234,12 @@ Right click for insert and delete options.</string>
</connections>
<buttongroups>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="split_mode_button_group"/>
</buttongroups>
</ui>

View File

@ -6,7 +6,7 @@ you change the name in the Applications folder from WSJT-X to WSJT-X_previous
before proceeding.
I recommend that you follow the installation instructions especially if you
are moving from v2.3 to v2.4 or later, of WSJT-X or you have upgraded macOS.
are moving from v2.2 to v2.3 or later, of WSJT-X or you have upgraded macOS.
Double-click on the wsjtx-...-Darwin.dmg file you have downloaded from K1JT's web-site.
@ -25,7 +25,7 @@ change has been made by typing:
sysctl -a | grep sysv.shm
If shmmax is not shown as 52428800 then contact me since WSJT-X might fail to load with
If shmmax is not shown as 52428800 then contact me since WSJT-X will fail to load with
an error message: "Unable to create shared memory segment".
You can now close the Terminal window. It will not be necessary to repeat this procedure
@ -72,9 +72,7 @@ Please email me if you have problems.
--- John G4KLA (g4kla@rmnjmn.co.uk)
Additional Notes:
1. Information about com.wsjtx.sysctl.plist and multiple instances of WSJT-X
Addendum: Information about com.wsjtx.sysctl.plist and multiple instances of WSJT-X.
WSJT-X makes use of a block of memory which is shared between different parts of
the code. The normal allocation of shared memory on a Mac is insufficient and this
@ -89,8 +87,7 @@ simultaneously, the shmall parameter in the com.wsjtx.sysctl.plist file needs to
The shmall parameter determines the amount of shared memory which is allocated in 4096 byte pages
with 50MB (52428800) required for each instance. The shmall parameter is calculated as:
(n * 52428800)/4096 where 'n' is the number of instances required to run simultaneously.
Replace your new version of this file in /Library/LaunchDaemons and remember to reboot your
Mac afterwards.
Remember to reboot your Mac afterwards.
Note that the shmmax parameter remains unchanged. This is the maximum amount of shared memory that
any one instance is allowed to request from the total shared memory allocation and should not
@ -99,15 +96,4 @@ be changed.
If two instances of WSJT-X are running, it is likely that you might need additional
audio devices, from two rigs for example. Visit Audio MIDI Setup and create an Aggregate Device
which will allow you to specify more than one interface. I recommend you consult Apple's guide
on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000.
2. Preventing WSJT-X from being put into 'sleep' mode (App Nap).
In normal circumstances an application which has not been directly accessed for a while can be
subject to App Nap which means it is suspended until such time as its windows are accessed. If
it is intended that WSJT-X should be submitting continued reports to, for example, PSK Reporter
then reporting will be interrupted. App Nap can be disabled as follows, but first quit WSJT-X:
Open a Terminal window and type: defaults write org.k1jt.wsjtx NSAppSleepDisable -bool YES
If you type: defaults read org.k1jt.wsjtx then the response will be: NSAppSleepDisable = 1;
Close the Terminal window and launch WSJT-X. (If you 'Hide' WSJT-X, this scheme will be suspended.)
on combining multiple audio interfaces which is at https://support.apple.com/en-us/HT202000.

View File

@ -11,39 +11,7 @@ extern "C" {
namespace
{
QRegularExpression tokens_re {R"(
^
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
(?:
(?<word1>
(?:CQ|DE|QRZ)
(?:\s?DX|\s
(?:[A-Z]{1,4}|\d{3}) # directional CQ
)
| [A-Z0-9/]+ # DX call
|\.{3} # unknown hash code
)\s
)
(?:
(?<word2>[A-Z0-9/]+) # DE call
(?:\s
(?<word3>[-+A-Z0-9]+) # report
(?:\s
(?<word4>
(?:
OOO # EME
| (?!RR73)[A-R]{2}[0-9]{2} # grid square (not RR73)
| 5[0-9]{5} # EU VHF Contest report & serial
)
)
(?:\s
(?<word5>[A-R]{2}[0-9]{2}[A-X]{2}) # EU VHF Contest grid locator
)?
)?
)?
)?
)"
, QRegularExpression::ExtendedPatternSyntaxOption};
QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{1,4}|\d{3}))|[A-Z0-9/]+|\.{3})\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"};
}
DecodedText::DecodedText (QString const& the_string)
@ -55,15 +23,13 @@ DecodedText::DecodedText (QString const& the_string)
, is_standard_ {false}
{
// discard appended AP info
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?[aq][0-9].*$)"}, "\\1");
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?a[0-9].*$)"}, "\\1");
// qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
if (message_.length() >= 1)
{
// remove appended confidence (?) and ap designators before truncating the message
message_ = clean_string_.mid (column_qsoText + padding_).trimmed ();
message0_ = message_.left(37);
message_ = message_.left(37).remove (QRegularExpression {"[<>]"});
message0_ = message_.left(36);
message_ = message_.left(36).remove (QRegularExpression {"[<>]"});
int i1 = message_.indexOf ('\r');
if (i1 > 0)
{
@ -94,13 +60,11 @@ QStringList DecodedText::messageWords () const
// extract up to the first four message words
QString t=message_;
if(t.left(4)=="TU; ") t=message_.mid(4,-1);
return tokens_re.match(t).capturedTexts();
return words_re.match(t).capturedTexts();
}
// simple word split for free text messages
auto words = message_.split (' ', SkipEmptyParts);
// add whole message and two empty strings as item 0 & 1 to mimic RE
// capture list
words.prepend (QString {});
// add whole message as item 0 to mimic RE capture list
words.prepend (message_);
return words;
}
@ -130,7 +94,7 @@ bool DecodedText::isTX() const
bool DecodedText::isLowConfidence () const
{
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 36, 1);
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 21, 1);
}
int DecodedText::frequencyOffset() const
@ -164,37 +128,31 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
if (message_.size () < 1) return false;
QStringList const& w = message_.split(" ", SkipEmptyParts);
int offset {0};
if (w.size () > 2)
if (w.size ()
&& is_standard_ && (w[0] == myBaseCall
|| w[0].endsWith ("/" + myBaseCall)
|| w[0].startsWith (myBaseCall + "/")
|| (w.size () > 1 && !dxBaseCall.isEmpty ()
&& (w[1] == dxBaseCall
|| w[1].endsWith ("/" + dxBaseCall)
|| w[1].startsWith (dxBaseCall + "/")))))
{
if ("RR73;" == w[1] && w.size () > 3)
QString tt="";
if(w.size() > 2) tt=w[2];
bool ok;
auto i1=tt.toInt(&ok);
if (ok and i1>=-50 and i1<50)
{
offset = 2;
report = tt;
}
if (is_standard_ && (w[offset] == myBaseCall
|| w[offset].endsWith ("/" + myBaseCall)
|| w[offset].startsWith (myBaseCall + "/")
|| (w.size () > offset + 1 && !dxBaseCall.isEmpty ()
&& (w[offset + 1] == dxBaseCall
|| w[offset + 1].endsWith ("/" + dxBaseCall)
|| w[offset + 1].startsWith (dxBaseCall + "/")))))
else
{
bool ok;
auto tt = w[offset + 2];
auto i1=tt.toInt(&ok);
if (ok and i1>=-50 and i1<50)
if (tt.mid(0,1)=="R")
{
report = tt;
}
else
{
if (tt.mid(0,1)=="R")
i1=tt.mid(1).toInt(&ok);
if(ok and i1>=-50 and i1<50)
{
i1=tt.mid(1).toInt(&ok);
if(ok and i1>=-50 and i1<50)
{
report = tt.mid(1);
}
report = tt.mid(1);
}
}
}
@ -205,7 +163,7 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
// get the first text word, usually the call
QString DecodedText::call() const
{
return tokens_re.match (message_).captured ("word1");
return words_re.match (message_).captured ("word1");
}
// get the second word, most likely the de call and the third word, most likely grid
@ -217,7 +175,7 @@ void DecodedText::deCallAndGrid(/*out*/QString& call, QString& grid) const
{
msg = msg.mid (p + 2);
}
auto const& match = tokens_re.match (msg);
auto const& match = words_re.match (msg);
call = match.captured ("word2");
grid = match.captured ("word3");
if ("R" == grid) grid = match.captured ("word4");

View File

@ -443,7 +443,7 @@ void EqualizationToolsDialog::impl::plot_current ()
plot_.graph (3)->rescaleValueAxis ();
QFileInfo refspec_file_info {data_directory_.absoluteFilePath ("refspec.dat")};
std::ifstream refspec_file (refspec_file_info.absoluteFilePath ().toLocal8Bit ().constData (), std::ifstream::in);
std::ifstream refspec_file (refspec_file_info.absoluteFilePath ().toLatin1 ().constData (), std::ifstream::in);
unsigned n;
if (refspec_file >> amp_poly_low_ >> amp_poly_high_ >> n)
{
@ -499,7 +499,7 @@ void EqualizationToolsDialog::impl::plot_phase ()
, "Phase Coefficient Files (*.pcoeff)");
if (!phase_file_name.size ()) return;
std::ifstream phase_file (phase_file_name.toLocal8Bit ().constData (), std::ifstream::in);
std::ifstream phase_file (phase_file_name.toLatin1 ().constData (), std::ifstream::in);
int n;
float chi;
float rmsdiff;

378
NEWS
View File

@ -9,375 +9,7 @@
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
Release: WSJT-X 2.6.0-rc2
July 21, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
well as some bug fixes.
- The "Measure" function in Echo mode now uses the computed Doppler
spread for DX grid, when available. This feature is especially
helpful for microwave EME tests, enabling accurate measurement of
SNR for a DX station.
- Settings for T/R period and Submode are now remembered by mode when
you switch directly between (for example) MSK144-15, Q65-60A,
JT65C, or FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency of 1500 Hz
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
FT4, FT8, Q65, JT65, or FST4.
- QSOs in the Contest Log can now be displayed in increasing or
decreasing order of logged time. By default the log is scrolled to
the latest logged QSO, ready for insertion of a new contact. The
total number of QSOs in the Contest Log is displayed at bottom left
of its window.
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
- Layout of mode buttons has been optimized for 4K screens.
- Display of Keyboard Shortcuts has been updated.
- The OK button now has default focus in the LogQSO dialog window.
You may just hit Enter to log the QSO.
- Bug fix: The Tx Freq spinbox remained red when coming back from
some Q65 submodes. Corrected.
- Hamlib bug fixes: make sure that VFOB is selected when required on
some rigs (e.g. IC7610, IC7100), and others.
Release: WSJT-X 2.6.0-rc1
June 20, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
International Digital Contest; performance enhancements for FT8, Q65,
and EME Echo mode; new controls and options on the GUI; and several
bug fixes.
In program WSJT-X:
- Improved decoding for FT8: additional messages are marked 'a7'
- Improved decoding for Q65 when AP is in use
- Optional new "Active Stations" window and other features
supporting ARRL International Digital Contest
- Accurate SNR measurements in Echo mode, including large Doppler
spreads
- Add mode selection buttons on main window for FT4, FT8, JT65,
MSK144, and Q65
- Add a button to toggle FT8's Hound mode ON or OFF
- Add a "Clr Avg" button for Echo mode
- Add optional highlighting of DX Call and DX Grid
- Add optional highlighting of messages containing RR73 or 73
- New options for writing to ALL.TXT: split the file yearly, monthly,
or disable writing altogether
- Add Russian to available translations of user interface
- Add a 90 s Tune watchdog with optional disable
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
Hold Tx Freq is enabled
- Suppress transmission of blank messages
- Suppress self-spotting when running multiple instances
- Correct the handling of messages starting with "CQ xxxx ..."
- Correct a flaw that could cause Windows to drop audio samples
- Correct a flaw that could send incorrect frequencies to ALL.TXT
and PSK Reporter after a band change
- Correct the auto-sequencing logic in several specific circumstances
- Correct a flaw in WSPR mode when handling three-character callsigns
- Correct a flaw that could cause OmniRig 1.19 or later to set
incorrect frequencies after initialization
- Clean up some ToolTips
- Fix an inconsistancy in the macOS installation package that caused
the pwr slider to behave incorrectly on macOS 12
In program MAP65 (Windows only):
- Send additional information to file azel.dat
- Allow optional scaling of digital I/Q data
- Suppress a bounds error caused by too-wide setting of display
bandwidth
Release: WSJT-X 2.5.4
Dec 28, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.3:
WSJTX:
- Repair a defect that caused occasional crashes when in QSO with
stations using nonstandard callsigns.
MAP65:
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
user.
Release: WSJT-X 2.5.3
Dec 7, 2021
----------------------
This release has the following changes since release 2.5.2:
- Add a note in memory of G4WJS to the About window
- Add a simple $DXCALL macro capability for Tx messages, and update
the User Guide accordingly
- Ensure that MAIN VFO is used for receiving on rigs that require it
- Repair a defect in reporting low-confidence decodes to PskReporter
- Updated CTY.DAT database, tnx to Jim AD1C
Release: WSJT-X 2.5.2
Nov 4, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.1:
- Repair a longstanding regression that caused signal reports from
tail-ended Tx2 messages to be omitted from logged information
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
n3=1 DXpedition mode) in regular 77-bit modes
- Repair a regression associated with setting the main window width
on program startup.
- Repair a problem with Q65 decodes of type 'q3' for messages of the
form "<Call_1> Call_2"
- Execute code associated with Q65 decodes of type 'q5' only when the
Max Drift control is set to 50. This fix prevents
double-incrementing of the message averaging counter on the first
decoding sequence.
- Polarization offset 'Dpol' from the astronomical data window is now
written to file azel.dat if environment variable
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
especially useful for EME on the higher microwave bands.
- The Auto Log QSO option in "Settings->Reporting" now behaves the
same as the Prompt to log QSO option when not in a special
operating context mode.
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
and is no longer reset to Fast on program startup or when Settings
has been opened. The user selection is used for automatic decodes,
but Deep is used for any subsequent manual decode attempts.
- New hamlib code to correct minor flaws in controlling several rigs.
- Update the Chinese and Hong Kong translations of the user
interface.
- Note that since the WSJT-X v2.5.0 GA release we have not been
providing pre-built 32-bit packages for Linux on Intel CPUs, this
is due to the mainstream Linux Desktop distributions no longer
providing updates for 32-bit only systems. 32-bit WSJT-X can still
be built for Linux Intel and is supported at least until some
prerequisite package is no longer available.
Release: WSJT-X 2.5.1
Oct 21, 2021
----------------------
This release mainly contains improvements and defect repairs related
to Q65 and JT65 modes when used with non-standard and compound
calls. Also included is a new feature for microwave aircraft scatter
and repairs for defects detected since the 2.5.0 GA release.
- Improved Q65 support for 10GHz Aircraft Scatter contributed by Rex,
VK7MO, and Roger, W3SZ. (See "10 GHz Terrestrial with Q65" in DUBUS
Vol 1/2021 page 64.) Decodes of type 'q3' may now include
corrections for frequency drift.
- Repair a defect that failed to pre-load the DE and DX calls to the
hash lookup tables in the Q65 decoder.
- Repair standard message Tx4 and Tx5 generation in Q65 mode when
using a non-standard call.
- Repair a defect in generation of the standard Tx2 JT65 message in
EME mode when using a compound call.
- Repair a defect when decoding 77-bit type 4 non-standard call
message.
- Repair a defect that could cause a crash when switching from Q65 to
JT65 mode and attempting a double-click decode.
- Enable 'q3' AP decoding in Q65 mode for messages containing a
non-standard call.
- Repair a defect that required a blank DX Grid to achieve Q65 'q3'
decodes of messages containing a non-standard call.
- Repair the logic that sets parameters for Q65 "Deep" decoding.
- In Q65 mode, allow 'q2' decodes when MyCall is compound or
non-standard.
- Repair a long-standing defect that could cause a crash when
reference spectrum correction is enabled.
- Updated UI translations from Xavi, EA3W, Oba-san, JA7UDE, and a new
translation for Traditional Chinese by Steven, BU2EL.
- Updated CTY.DAT database, tnx to Jim AD1C
- Improved main window layout to ensure TxN messages are fully
visible.
Release: WSJT-X 2.5.0
Sept 27, 2021
-------------------------
WSJT-X in this release is nearly identical to that in WSJT-X 2.4.0.
The Q65 decoder has been enhanced to measure and compensate for linear
frequency drift in Q65 signals. In addition, the Windows installation
package now includes version 3.0 of application MAP65 which has Q65
support to match and improve on its existing JT65 capabilities.
See the 2.5.0 release candidate notices below for a summaries of the
other changes included in this release. WSJT-X 2.5.0 is bundled with
Hamlib version 4.3.1 which includes important regression repairs over
the earlier 4.3 release.
Other changes in the package since WSJT-X 2.5.0-rc6 include the
following enhancements and defect repairs:
MAP65:
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
- Fix MAP65's generation of Tx3 message for abs(SNR)< 10.
WSJTX:
- Repair a defect that caused CAT errors when using WSPR band hopping
and auto tune-up with some Icom rigs.
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
Release: WSJT-X 2.5.0-rc6
Sept 6, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc5 include the following
enhancements and defect repairs:
MAP65:
- There are no functional changes to MAP65 in this release.
WSJT-X:
- Repair a file handle leak in wsprd (tnx Phil, KA9Q).
- Better handling of the Tx1 buttons when changing special operating
modes.
- Q65 mode now supports contest special operating modes.
- Repair an issue when non-ASCII characters used in account names.
- Repair a regression that prevented WSPR band-hopping working when
the Tx percentage is zero.
Release: WSJT-X 2.5.0-rc5
Aug 5, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc4 include the following
enhancements and defect repairs:
MAP65:
- When you double-click on lower waterfall, Ftol is set to 100
only if it is currently set to a higher value.
- Early decoding pass is skipped when data are read from disk.
- Duplicate decodes are suppressed only when at the same frequency.
WSJT-X:
- Repair a regression that caused some messages involving compound
or nonstandard callsigns to be encoded as free text
Release: WSJT-X 2.5.0-rc4
Aug 2, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc3 include the following
enhancements and defect repairs:
MAP65:
- Suppress display of duplicate decodes
- Increase the length of .tf2 & .iq files to 56 s
- Implements an early decoding pass at 52 s
WSJT-X:
- Repair a defect in CALL3.TXT lookups that incorrectly matched
partial calls
- Instructions in macOS ReadMe.txt to suppress App Nap energy saving
- Revised User Guide using FT8 mode for the basic tutorial
- Allow contest and FD operating in Q65 mode
Release: WSJT-X 2.5.0-rc3
Jul 5, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc2 include the following
enhancements and defect repairs:
MAP65:
- Correct two defects that could cause "hung decoder" status
- Translate reported frequencies so that |DF| <= 500 Hz for Q65
decodes.
- Provide access to Release Notes from the Help menu
- Correct the formatting of Q65 messages to livecq
- Repair an Xpol polarization finding hang
- Build MAP65 to start without an attached console
WSJT-X:
- Repair a long standing defect that caused UDP Protocol Heartbeat
messages to not be sent when no other intervening messages are
sent.
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.5.0-rc2
@ -420,7 +52,6 @@ WSJT-X (including the decoder for Q65 used by MAP65):
series rigs, and support for the Icom IC-575 rig.
- Updated CTY.DAT database
Release: WSJT-X 2.5.0-rc1
Jun 3, 2021
-------------------------
@ -775,6 +406,7 @@ release candidate.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
Nov 16, 2020
-------------------------
@ -1239,7 +871,6 @@ prior v2.1.0 release.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------
@ -1309,7 +940,6 @@ feedback to guide future development.
*Note* this release is not for general public release and we request
that it is not distributed.
Release: WSJT-X 2.1.0-rc1
March 25, 2019
-------------------------
@ -1443,7 +1073,6 @@ Some details of changes since WSJT-X-rc5 include the following:
- Update the WSJT-X User Guide to v2.0 (more to come...)
- Update cty.dat
Release: WSJT-X 2.0-rc5
November 26, 2018
-----------------------
@ -1675,6 +1304,7 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
to be CAT controlled by WSJT-X.
Release: WSJT-X Version 1.9.0-rc2
February 26, 2018
---------------------------------
@ -1844,6 +1474,8 @@ message from populating the Tx message boxes.
- Fix an issue with editing IARU regions in the working frequencies table.
Release: WSJT-X Version 1.8.0-rc2
September 2, 2017
---------------------------------

View File

@ -71,12 +71,12 @@ public:
void heartbeat ();
void closedown ();
StreamStatus check_status (QDataStream const&) const;
void send_message (QByteArray const&, bool queue_if_pending = true, bool allow_duplicates = false);
void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true, bool allow_duplicates = false)
void send_message (QByteArray const&, bool queue_if_pending = true);
void send_message (QDataStream const& out, QByteArray const& message, bool queue_if_pending = true)
{
if (OK == check_status (out))
{
send_message (message, queue_if_pending, allow_duplicates);
send_message (message, queue_if_pending);
}
else
{
@ -197,7 +197,7 @@ void MessageClient::impl::start ()
// clear any backlog
while (pending_messages_.size ())
{
send_message (pending_messages_.dequeue (), true, false);
send_message (pending_messages_.dequeue (), false);
}
}
@ -429,7 +429,7 @@ void MessageClient::impl::heartbeat ()
out << NetworkMessage::Builder::schema_number // maximum schema number accepted
<< version_.toUtf8 () << revision_.toUtf8 ();
TRACE_UDP ("schema:" << schema_ << "max schema:" << NetworkMessage::Builder::schema_number << "version:" << version_ << "revision:" << revision_);
send_message (out, message, false, true);
send_message (out, message, false);
}
}
@ -444,13 +444,13 @@ void MessageClient::impl::closedown ()
}
}
void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending, bool allow_duplicates)
void MessageClient::impl::send_message (QByteArray const& message, bool queue_if_pending)
{
if (server_port_)
{
if (!server_.isNull ())
{
if (allow_duplicates || message != last_message_) // avoid duplicates
if (message != last_message_) // avoid duplicates
{
if (is_multicast_address (server_))
{

47
README
View File

@ -13,28 +13,26 @@
Copyright (C) 2001 - 2021 by Joe Taylor, K1JT.
WSJT-X Version 2.5 offers eleven different protocols or modes: FT4,
FT8, JT4, JT9, JT65, Q65, FST4, MSK144, WSPR, FST4W, and Echo. The
WSJT-X Version 2.3 offers ten different protocols or modes: FT4, FT8,
JT4, JT9, JT65, QRA64, FST4, ISCAT, MSK144, WSPR, FST4W, and Echo. The
first seven are designed for making reliable QSOs under weak-signal
conditions. They use nearly identical message structure and source
encoding. JT65 and Q65 were designed for EME (“moonbounce”), but not
limited to just that propagation path, on the VHF/UHF bands and JT65
has also proven very effective for worldwide QRP communication on the
HF bands. Q65 has a number of advantages over JT65, including better
performance on the very weakest signals and variants with different
T/R period lengths. We imagine that over time it may replace JT65 for
EME use, it has also proved to be very effective for iono-scatter
paths on 6m. 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. FT4 is faster still (7.5 s T/R sequences) and especially
well suited for radio contesting. On the HF bands, world-wide QSOs are
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. FT4 is faster still (7.5 s T/R sequences) and especially well
suited for radio contesting. 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. QSOs are possible at signal
levels 10 to 15 dB below those required for CW. FST4 has similarities
@ -50,13 +48,14 @@ once per transmission. All fast modes in WSJT-X send their message
frames repeatedly, as many times as will fit into the Tx sequence
length.
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
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”. MSK144 uses the same
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.

View File

@ -42,27 +42,14 @@ namespace Radio
value = v.toDouble ();
if (ok) *ok = true;
}
if (ok && !*ok)
{
return value;
}
return frequency (value, scale, ok);
}
Frequency frequency (double value, int scale, bool * ok)
{
value *= std::pow (10., scale);
if (ok)
{
if (value < 0. || value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
if (value < 0. || value > std::numeric_limits<Frequency>::max ())
{
value = 0.;
*ok = false;
}
else
{
*ok = true;
}
}
return std::llround (value);
}
@ -79,28 +66,15 @@ namespace Radio
value = v.toDouble ();
if (ok) *ok = true;
}
if (ok && !*ok)
{
return value;
}
return frequency_delta (value, scale, ok);
}
FrequencyDelta frequency_delta (double value, int scale, bool * ok)
{
value *= std::pow (10., scale);
if (ok)
{
if (value < static_cast<double>(std::numeric_limits<Frequency>::min ())
|| value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
if (value < -std::numeric_limits<Frequency>::max ()
|| value > std::numeric_limits<Frequency>::max ())
{
value = 0.;
*ok = false;
}
else
{
*ok = true;
}
}
return std::llround (value);
}

View File

@ -34,12 +34,10 @@ namespace Radio
// QVariant argument is convertible to double and is assumed to
// be scaled by (10 ** -scale).
//
Frequency UDP_EXPORT frequency (QVariant const&, int scale = 0,
Frequency UDP_EXPORT frequency (QVariant const&, int scale,
bool * ok = nullptr, QLocale const& = QLocale ());
FrequencyDelta UDP_EXPORT frequency_delta (QVariant const&, int scale = 0,
FrequencyDelta UDP_EXPORT frequency_delta (QVariant const&, int scale,
bool * ok = nullptr, QLocale const& = QLocale ());
Frequency UDP_EXPORT frequency (double, int scale = 0, bool * ok = nullptr);
FrequencyDelta UDP_EXPORT frequency_delta (double, int scale = 0, bool * ok = nullptr);
//
// Frequency type formatting

View File

@ -9,376 +9,7 @@
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
Release: WSJT-X 2.6.0-rc2
July 21, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
well as some bug fixes.
- The "Measure" function in Echo mode now uses the computed Doppler
spread for DX grid, when available. This feature is especially
helpful for microwave EME tests, enabling accurate measurement of
SNR for a DX station.
- Settings for T/R period and Submode are now remembered by mode when
you switch directly between (for example) MSK144-15, Q65-60A,
JT65C, or FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency of 1500 Hz
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
FT4, FT8, Q65, JT65, or FST4.
- QSOs in the Contest Log can now be displayed in increasing or
decreasing order of logged time. By default the log is scrolled to
the latest logged QSO, ready for insertion of a new contact. The
total number of QSOs in the Contest Log is displayed at bottom left
of its window.
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
- Layout of mode buttons has been optimized for 4K screens.
- Display of Keyboard Shortcuts has been updated.
- The OK button now has default focus in the LogQSO dialog window.
You may just hit Enter to log the QSO.
- Bug fix: The Tx Freq spinbox remained red when coming back from
some Q65 submodes. Corrected.
- Hamlib bug fixes: make sure that VFOB is selected when required on
some rigs (e.g. IC7610, IC7100), and others.
Release: WSJT-X 2.6.0-rc1
June 20, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
International Digital Contest; performance enhancements for FT8, Q65,
and EME Echo mode; new controls and options on the GUI; and several
bug fixes.
In program WSJT-X:
- Improved decoding for FT8: additional messages are marked 'a7'
- Improved decoding for Q65 when AP is in use
- Optional new "Active Stations" window and other features
supporting ARRL International Digital Contest
- Accurate SNR measurements in Echo mode, including large Doppler
spreads
- Add mode selection buttons on main window for FT4, FT8, JT65,
MSK144, and Q65
- Add a button to toggle FT8's Hound mode ON or OFF
- Add a "Clr Avg" button for Echo mode
- Add optional highlighting of DX Call and DX Grid
- Add optional highlighting of messages containing RR73 or 73
- New options for writing to ALL.TXT: split the file yearly, monthly,
or disable writing altogether
- Add Russian to available translations of user interface
- Add a 90 s Tune watchdog with optional disable
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
Hold Tx Freq is enabled
- Suppress transmission of blank messages
- Suppress self-spotting when running multiple instances
- Correct the handling of messages starting with "CQ xxxx ..."
- Correct a flaw that could cause Windows to drop audio samples
- Correct a flaw that could send incorrect frequencies to ALL.TXT
and PSK Reporter after a band change
- Correct the auto-sequencing logic in several specific circumstances
- Correct a flaw in WSPR mode when handling three-character callsigns
- Correct a flaw that could cause OmniRig 1.19 or later to set
incorrect frequencies after initialization
- Clean up some ToolTips
- Fix an inconsistancy in the macOS installation package that caused
the pwr slider to behave incorrectly on macOS 12
In program MAP65 (Windows only):
- Send additional information to file azel.dat
- Allow optional scaling of digital I/Q data
- Suppress a bounds error caused by too-wide setting of display
bandwidth
Release: WSJT-X 2.5.4
Dec 28, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.3:
WSJTX:
- Repair a defect that caused occasional crashes when in QSO with
stations using nonstandard callsigns.
MAP65:
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
user.
Release: WSJT-X 2.5.3
Dec 7, 2021
----------------------
This release has the following changes since release 2.5.2:
- Add a note in memory of G4WJS to the About window
- Add a simple $DXCALL macro capability for Tx messages, and update
the User Guide accordingly
- Ensure that MAIN VFO is used for receiving on rigs that require it
- Repair a defect in reporting low-confidence decodes to PskReporter
- Updated CTY.DAT database, tnx to Jim AD1C
Release: WSJT-X 2.5.2
Nov 4, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.1:
- Repair a longstanding regression that caused signal reports from
tail-ended Tx2 messages to be omitted from logged information
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
n3=1 DXpedition mode) in regular 77-bit modes
- Repair a regression associated with setting the main window width
on program startup.
- Repair a problem with Q65 decodes of type 'q3' for messages of the
form "<Call_1> Call_2"
- Execute code associated with Q65 decodes of type 'q5' only when the
Max Drift control is set to 50. This fix prevents
double-incrementing of the message averaging counter on the first
decoding sequence.
- Polarization offset 'Dpol' from the astronomical data window is now
written to file azel.dat if environment variable
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
especially useful for EME on the higher microwave bands.
- The Auto Log QSO option in "Settings->Reporting" now behaves the
same as the Prompt to log QSO option when not in a special
operating context mode.
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
and is no longer reset to Fast on program startup or when Settings
has been opened. The user selection is used for automatic decodes,
but Deep is used for any subsequent manual decode attempts.
- New hamlib code to correct minor flaws in controlling several rigs.
- Update the Chinese and Hong Kong translations of the user
interface.
- Note that since the WSJT-X v2.5.0 GA release we have not been
providing pre-built 32-bit packages for Linux on Intel CPUs, this
is due to the mainstream Linux Desktop distributions no longer
providing updates for 32-bit only systems. 32-bit WSJT-X can still
be built for Linux Intel and is supported at least until some
prerequisite package is no longer available.
Release: WSJT-X 2.5.1
Oct 21, 2021
----------------------
This release mainly contains improvements and defect repairs related
to Q65 and JT65 modes when used with non-standard and compound
calls. Also included is a new feature for microwave aircraft scatter
and repairs for defects detected since the 2.5.0 GA release.
- Improved Q65 support for 10GHz Aircraft Scatter contributed by Rex,
VK7MO, and Roger, W3SZ. (See "10 GHz Terrestrial with Q65" in DUBUS
Vol 1/2021 page 64.) Decodes of type 'q3' may now include
corrections for frequency drift.
- Repair a defect that failed to pre-load the DE and DX calls to the
hash lookup tables in the Q65 decoder.
- Repair standard message Tx4 and Tx5 generation in Q65 mode when
using a non-standard call.
- Repair a defect in generation of the standard Tx2 JT65 message in
EME mode when using a compound call.
- Repair a defect when decoding 77-bit type 4 non-standard call
message.
- Repair a defect that could cause a crash when switching from Q65 to
JT65 mode and attempting a double-click decode.
- Enable 'q3' AP decoding in Q65 mode for messages containing a
non-standard call.
- Repair a defect that required a blank DX Grid to achieve Q65 'q3'
decodes of messages containing a non-standard call.
- Repair the logic that sets parameters for Q65 "Deep" decoding.
- In Q65 mode, allow 'q2' decodes when MyCall is compound or
non-standard.
- Repair a long-standing defect that could cause a crash when
reference spectrum correction is enabled.
- Updated UI translations from Xavi, EA3W, Oba-san, JA7UDE, and a new
translation for Traditional Chinese by Steven, BU2EL.
- Updated CTY.DAT database, tnx to Jim AD1C
- Improved main window layout to ensure TxN messages are fully
visible.
Release: WSJT-X 2.5.0
Sept 27, 2021
-------------------------
WSJT-X in this release is nearly identical to that in WSJT-X 2.4.0.
The Q65 decoder has been enhanced to measure and compensate for linear
frequency drift in Q65 signals. In addition, the Windows installation
package now includes version 3.0 of application MAP65 which has Q65
support to match and improve on its existing JT65 capabilities.
See the 2.5.0 release candidate notices below for a summaries of the
other changes included in this release. WSJT-X 2.5.0 is bundled with
Hamlib version 4.3.1 which includes important regression repairs over
the earlier 4.3 release.
Other changes in the package since WSJT-X 2.5.0-rc6 include the
following enhancements and defect repairs:
MAP65:
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
- Fix MAP65's generation of Tx3 message for abs(SNR)< 10.
WSJTX:
- Repair a defect that caused CAT errors when using WSPR band hopping
and auto tune-up with some Icom rigs.
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
Release: WSJT-X 2.5.0-rc6
Sept 6, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc5 include the following
enhancements and defect repairs:
MAP65:
- There are no functional changes to MAP65 in this release.
WSJT-X:
- Repair a file handle leak in wsprd (tnx Phil, KA9Q).
- Better handling of the Tx1 buttons when changing special operating
modes.
- Q65 mode now supports contest special operating modes.
- Repair an issue when non-ASCII characters used in account names.
- Repair a regression that prevented WSPR band-hopping working when
the Tx percentage is zero.
Release: WSJT-X 2.5.0-rc5
Aug 5, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc4 include the following
enhancements and defect repairs:
MAP65:
- When you double-click on lower waterfall, Ftol is set to 100
only if it is currently set to a higher value.
- Early decoding pass is skipped when data are read from disk.
- Duplicate decodes are suppressed only when at the same frequency.
WSJT-X:
- Repair a regression that caused some messages involving compound
or nonstandard callsigns to be encoded as free text
Release: WSJT-X 2.5.0-rc4
Aug 1, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc3 include the following
enhancements and defect repairs:
MAP65:
- Suppress display of duplicate decodes
- Increase the length of .tf2 & .iq files to 56 s
- Implement an early decoding pass at 52 s
- Clean up the output written to map65_rx.log
WSJT-X:
- Repair a defect in CALL3.TXT lookups that incorrectly matched
partial calls
- Instructions in macOS ReadMe.txt to suppress App Nap energy saving
- Revised User Guide using FT8 mode for the basic tutorial
- Allow contest and FD operating in Q65 mode
Release: WSJT-X 2.5.0-rc3
Jul 5, 2021
-------------------------
Remember that the WSJT-X 2.5.0 package includes MAP65 3.0.0. Changes
in the package since WSJT-X 2.5.0-rc2 include the following
enhancements and defect repairs:
MAP65:
- Correct two defects that could cause "hung decoder" status
- Translate reported frequencies so that |DF| <= 500 Hz for Q65
decodes.
- Provide access to Release Notes from the Help menu
- Correct the formatting of Q65 messages to livecq
- Repair an Xpol polarization finding hang
- Build MAP65 to start without an attached console
WSJT-X:
- Repair a long standing defect that caused UDP Protocol Heartbeat
messages to not be sent when no other intervening messages are
sent.
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.5.0-rc2
@ -392,7 +23,7 @@ enhancements and defect repairs:
MAP65:
- Compute polarization angle for Xpol systems and display to nearest
degree
- Compute and display the recommended Tx polarization
- Compute and display the recommended Tx polarization
- Protect against Fortran bounds errors in several places
- Insert leading 0 when needed in UTC hours and minutes on waterfall
- Wideband Q65 synchronization corrected to include single-polarization
@ -421,7 +52,6 @@ WSJT-X (including the decoder for Q65 used by MAP65):
series rigs, and support for the Icom IC-575 rig.
- Updated CTY.DAT database
Release: WSJT-X 2.5.0-rc1
Jun 3, 2021
-------------------------
@ -776,6 +406,7 @@ release candidate.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
Nov 16, 2020
-------------------------
@ -808,6 +439,7 @@ includes some new functionality that missed the RC1 cut off deadline.
choice.
Release: WSJT-X 2.3.0-rc1
Sept 28, 2020
-------------------------
@ -1240,7 +872,6 @@ prior v2.1.0 release.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------
@ -1262,7 +893,6 @@ There are numerous minor enhancements and bug fixes.
We now provide a separate installation package for 64-bit Windows 7
and later, with significant improvements in decoding speed.
Release: WSJT-X 2.1.0-rc7
June 3, 2019
-------------------------
@ -1393,7 +1023,6 @@ feedback to guide future development.
*Note* this release is not for general public release and we request
that it is not distributed.
Release: WSJT-X 2.1.0-rc1
March 25, 2019
-------------------------
@ -1527,7 +1156,6 @@ Some details of changes since WSJT-X-rc5 include the following:
- Update the WSJT-X User Guide to v2.0 (more to come...)
- Update cty.dat
Release: WSJT-X 2.0-rc5
November 26, 2018
-----------------------
@ -1757,6 +1385,7 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
to be CAT controlled by WSJT-X.
Release: WSJT-X Version 1.9.0-rc2
February 26, 2018
---------------------------------
@ -1926,6 +1555,8 @@ message from populating the Tx message boxes.
- Fix an issue with editing IARU regions in the working frequencies table.
Release: WSJT-X Version 1.8.0-rc2
September 2, 2017
---------------------------------

View File

@ -385,7 +385,7 @@ auto DXLabSuiteCommanderTransceiver::get_mode () -> MODE
void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
{
if (!commander_) return;
Q_ASSERT (commander_);
CAT_TRACE (cmd);
@ -398,7 +398,7 @@ void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
{
if (!commander_) return QString {};
Q_ASSERT (commander_);
if (!write_to_port (cmd))
{

View File

@ -1005,7 +1005,7 @@ void HRDTransceiver::do_poll ()
QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
{
if (!hrd_) return QString {};
Q_ASSERT (hrd_);
QString result;

View File

@ -882,12 +882,7 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
{
// for the 1st time as a band change may cause a recalled mode to be
// set
vfo_t target_vfo = RIG_VFO_CURR;
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
{
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
}
m_->error_check (rig_set_freq (m_->rig_.data (), target_vfo, f), tr ("setting frequency"));
m_->error_check (rig_set_freq (m_->rig_.data (), RIG_VFO_CURR, f), tr ("setting frequency"));
update_rx_frequency (f);
if (m_->mode_query_works_ && UNK != m)
@ -895,13 +890,13 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
rmode_t current_mode;
pbwidth_t current_width;
auto new_mode = m_->map_mode (m);
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, &current_mode, &current_width), tr ("getting current VFO mode"));
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, &current_mode, &current_width), tr ("getting current VFO mode"));
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode)
{
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
// for the 2nd time because a mode change may have caused a
// frequency change
@ -910,8 +905,7 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
// for the second time because some rigs change mode according
// to frequency such as the TS-2000 auto mode setting
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
rig_set_mode (m_->rig_.data (), RIG_VFO_B, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting VFOB mode");
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
}
update_mode (m);
}
@ -1043,22 +1037,16 @@ void HamlibTransceiver::do_mode (MODE mode)
pbwidth_t current_width;
auto new_mode = m_->map_mode (mode);
vfo_t target_vfo = RIG_VFO_CURR;
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
{
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
}
// only change when receiving or simplex if direct VFO addressing unavailable
if (!(state ().ptt () && state ().split () && m_->one_VFO_))
{
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, &current_mode, &current_width), tr ("getting current VFO mode"));
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, &current_mode, &current_width), tr ("getting current VFO mode"));
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode)
{
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
}
}
@ -1140,7 +1128,7 @@ void HamlibTransceiver::do_poll ()
{
m_->error_check (rig_get_freq (m_->rig_.data (), RIG_VFO_CURR, &f), tr ("getting current VFO frequency"));
f = std::round (f);
CAT_TRACE ("rig_get_freq frequency=" << Radio::frequency (f));
CAT_TRACE ("rig_get_freq frequency=" << f);
update_rx_frequency (f);
}

View File

@ -96,11 +96,11 @@ void OmniRigTransceiver::register_transceivers (logger_type *,
};
}
OmniRigTransceiver::OmniRigTransceiver (logger_type * the_logger,
OmniRigTransceiver::OmniRigTransceiver (logger_type * logger,
std::unique_ptr<TransceiverBase> wrapped,
RigNumber n, TransceiverFactory::PTTMethod ptt_type,
QString const& ptt_port, QObject * parent)
: TransceiverBase {the_logger, parent}
: TransceiverBase {logger, parent}
, wrapped_ {std::move (wrapped)}
, use_for_ptt_ {TransceiverFactory::PTT_method_CAT == ptt_type || ("CAT" == ptt_port && (TransceiverFactory::PTT_method_RTS == ptt_type || TransceiverFactory::PTT_method_DTR == ptt_type))}
, ptt_type_ {ptt_type}
@ -111,131 +111,173 @@ OmniRigTransceiver::OmniRigTransceiver (logger_type * the_logger,
, reversed_ {false}
{
CoInitializeEx (nullptr, 0 /*COINIT_APARTMENTTHREADED*/); // required because Qt only does this for GUI thread
CAT_TRACE ("constructed");
}
OmniRigTransceiver::~OmniRigTransceiver ()
{
CAT_TRACE ("destroying");
CoUninitialize ();
}
// returns false on time out
bool OmniRigTransceiver::await_notification_with_timeout (int timeout)
{
QEventLoop el;
connect (this, &OmniRigTransceiver::notified, &el, [&el] () {el.exit (1);});
QTimer::singleShot (timeout, Qt::CoarseTimer, &el, [&el] () {el.exit (0);});
return 1 == el.exec (); // wait for notify or timer
}
int OmniRigTransceiver::do_start ()
{
CAT_TRACE ("starting");
try
if (wrapped_) wrapped_->start (0);
omni_rig_.reset (new OmniRig::OmniRigX {this});
if (omni_rig_->isNull ())
{
if (wrapped_) wrapped_->start (0);
CAT_ERROR ("failed to start COM server");
throw_qstring (tr ("Failed to start OmniRig COM server"));
}
omni_rig_.reset (new OmniRig::OmniRigX {this});
if (omni_rig_->isNull ())
{
CAT_ERROR ("failed to start COM server");
throw_qstring (tr ("Failed to start OmniRig COM server"));
}
// COM/OLE exceptions get signaled
connect (&*omni_rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
// IOmniRigXEvent interface signals
connect (&*omni_rig_, SIGNAL (VisibleChange ()), this, SLOT (handle_visible_change ()));
connect (&*omni_rig_, SIGNAL (RigTypeChange (int)), this, SLOT (handle_rig_type_change (int)));
connect (&*omni_rig_, SIGNAL (StatusChange (int)), this, SLOT (handle_status_change (int)));
connect (&*omni_rig_, SIGNAL (ParamsChange (int, int)), this, SLOT (handle_params_change (int, int)));
connect (&*omni_rig_
, SIGNAL (CustomReply (int, QVariant const&, QVariant const&))
, this, SLOT (handle_custom_reply (int, QVariant const&, QVariant const&)));
CAT_INFO ("OmniRig s/w version: " << omni_rig_->SoftwareVersion ()
<< "i/f version: " << omni_rig_->InterfaceVersion ());
// fetch the interface of the RigX CoClass and instantiate a proxy object
switch (rig_number_)
{
case One: rig_.reset (new OmniRig::RigX (omni_rig_->Rig1 ())); break;
case Two: rig_.reset (new OmniRig::RigX (omni_rig_->Rig2 ())); break;
}
Q_ASSERT (rig_);
Q_ASSERT (!rig_->isNull ());
// COM/OLE exceptions get signaled
connect (&*rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
offline_timer_.reset (new QTimer); // instantiate here as
// constructor runs in wrong
// thread
offline_timer_->setSingleShot (true);
connect (offline_timer_.data (), &QTimer::timeout, [this] () {offline ("Rig went offline");});
if (use_for_ptt_ && (TransceiverFactory::PTT_method_DTR == ptt_type_ || TransceiverFactory::PTT_method_RTS == ptt_type_))
{
// fetch the interface for the serial port if we need it for PTT
port_.reset (new OmniRig::PortBits (rig_->PortBits ()));
Q_ASSERT (port_);
Q_ASSERT (!port_->isNull ());
// COM/OLE exceptions get signaled
connect (&*omni_rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
connect (&*port_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
// IOmniRigXEvent interface signals
connect (&*omni_rig_, SIGNAL (VisibleChange ()), this, SLOT (handle_visible_change ()));
connect (&*omni_rig_, SIGNAL (RigTypeChange (int)), this, SLOT (handle_rig_type_change (int)));
connect (&*omni_rig_, SIGNAL (StatusChange (int)), this, SLOT (handle_status_change (int)));
connect (&*omni_rig_, SIGNAL (ParamsChange (int, int)), this, SLOT (handle_params_change (int, int)));
connect (&*omni_rig_
, SIGNAL (CustomReply (int, QVariant const&, QVariant const&))
, this, SLOT (handle_custom_reply (int, QVariant const&, QVariant const&)));
CAT_TRACE ("OmniRig RTS state: " << port_->Rts ());
CAT_INFO ("OmniRig s/w version: " << static_cast<quint16> (omni_rig_->SoftwareVersion () >> 16)
<< '.' << static_cast<quint16> (omni_rig_->SoftwareVersion () & 0xffff)
<< " i/f version: " << static_cast<int> (omni_rig_->InterfaceVersion () >> 8 & 0xff)
<< '.' << static_cast<int> (omni_rig_->InterfaceVersion () && 0xff));
// remove locking because it doesn't seem to work properly
// if (!port_->Lock ()) // try to take exclusive use of the OmniRig serial port for PTT
// {
// CAT_WARNING ("Failed to get exclusive use of serial port for PTT from OmniRig");
// }
// fetch the interface of the RigX CoClass and instantiate a proxy object
switch (rig_number_)
// start off so we don't accidentally key the radio
if (TransceiverFactory::PTT_method_DTR == ptt_type_)
{
case One: rig_.reset (new OmniRig::RigX (omni_rig_->Rig1 ())); break;
case Two: rig_.reset (new OmniRig::RigX (omni_rig_->Rig2 ())); break;
port_->SetDtr (false);
}
Q_ASSERT (rig_);
Q_ASSERT (!rig_->isNull ());
// COM/OLE exceptions get signaled
connect (&*rig_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
offline_timer_.reset (new QTimer); // instantiate here as constructor runs in wrong thread
offline_timer_->setSingleShot (true);
connect (offline_timer_.data (), &QTimer::timeout, [this] () {offline ("Rig went offline");});
for (int i = 0; i < 5; ++i)
else // RTS
{
// leave some time for Omni-Rig to do its first poll
QThread::msleep (250);
if (OmniRig::ST_ONLINE == rig_->Status ())
{
break;
}
port_->SetRts (false);
}
}
if (OmniRig::ST_ONLINE != rig_->Status ())
rig_type_ = rig_->RigType ();
readable_params_ = rig_->ReadableParams ();
writable_params_ = rig_->WriteableParams ();
CAT_INFO (QString {"OmniRig initial rig type: %1 readable params=0x%2 writable params=0x%3 for rig %4"}
.arg (rig_type_)
.arg (readable_params_, 8, 16, QChar ('0'))
.arg (writable_params_, 8, 16, QChar ('0'))
.arg (rig_number_));
for (int i = 0; i < 5; ++i)
{
if (OmniRig::ST_ONLINE == rig_->Status ())
{
CAT_ERROR ("rig not online");
throw_qstring ("OmniRig: " + rig_->StatusStr ());
break;
}
if (use_for_ptt_ && (TransceiverFactory::PTT_method_DTR == ptt_type_ || TransceiverFactory::PTT_method_RTS == ptt_type_))
{
// fetch the interface for the serial port if we need it for PTT
port_.reset (new OmniRig::PortBits (rig_->PortBits ()));
Q_ASSERT (port_);
Q_ASSERT (!port_->isNull ());
// COM/OLE exceptions get signaled
connect (&*port_, SIGNAL (exception (int, QString, QString, QString)), this, SLOT (handle_COM_exception (int, QString, QString, QString)));
CAT_TRACE ("OmniRig RTS state: " << port_->Rts ());
// remove locking because it doesn't seem to work properly
// if (!port_->Lock ()) // try to take exclusive use of the OmniRig serial port for PTT
// {
// CAT_WARNING ("Failed to get exclusive use of serial port for PTT from OmniRig");
// }
// start off so we don't accidentally key the radio
if (TransceiverFactory::PTT_method_DTR == ptt_type_)
{
port_->SetDtr (false);
}
else // RTS
{
port_->SetRts (false);
}
}
rig_type_ = rig_->RigType ();
readable_params_ = rig_->ReadableParams ();
writable_params_ = rig_->WriteableParams ();
CAT_INFO (QString {"OmniRig initial rig type: %1 readable params=0x%2 writable params=0x%3 for rig %4"}
.arg (rig_type_)
.arg (readable_params_, 8, 16, QChar ('0'))
.arg (writable_params_, 8, 16, QChar ('0'))
.arg (rig_number_));
update_rx_frequency (rig_->GetRxFrequency ());
int resolution {0};
if (OmniRig::PM_UNKNOWN == rig_->Vfo ()
&& (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
== (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
{
// start with VFO A (probably MAIN) on rigs that we
// can't query VFO but can set explicitly
rig_->SetVfo (OmniRig::PM_VFOA);
}
auto f = state ().frequency ();
if (f % 10) return resolution; // 1Hz resolution
auto test_frequency = f - f % 100 + 55;
await_notification_with_timeout (1000);
}
if (OmniRig::ST_ONLINE != rig_->Status ())
{
throw_qstring ("OmniRig: " + rig_->StatusStr ());
}
QThread::msleep (500); // leave some time for Omni-Rig to get
// the rig status for the 1st. time
auto f = rig_->GetRxFrequency ();
for (int i = 0; (f == 0) && (i < 5); ++i)
{
await_notification_with_timeout (1000);
f = rig_->GetRxFrequency ();
}
update_rx_frequency (f);
int resolution {0};
if (OmniRig::PM_UNKNOWN == rig_->Vfo ()
&& (writable_params_ & (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
== (OmniRig::PM_VFOA | OmniRig::PM_VFOB))
{
// start with VFO A (probably MAIN) on rigs that we
// can't query VFO but can set explicitly
rig_->SetVfo (OmniRig::PM_VFOA);
}
f = state ().frequency ();
if (f % 10) return resolution; // 1Hz resolution
auto test_frequency = f - f % 100 + 55;
if (OmniRig::PM_FREQ & writable_params_)
{
rig_->SetFreq (test_frequency);
}
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
{
rig_->SetFreqB (test_frequency);
}
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
{
rig_->SetFreqA (test_frequency);
}
else
{
throw_qstring (tr ("OmniRig: don't know how to set rig frequency"));
}
if (!await_notification_with_timeout (1000))
{
CAT_ERROR ("do_start 1: wait timed out");
throw_qstring (tr ("OmniRig: timeout waiting for update from rig"));
}
switch (rig_->GetRxFrequency () - test_frequency)
{
case -5: resolution = -1; break; // 10Hz truncated
case 5: resolution = 1; break; // 10Hz rounded
case -15: resolution = -2; break; // 20Hz truncated
case -55: resolution = -2; break; // 100Hz truncated
case 45: resolution = 2; break; // 100Hz rounded
}
if (1 == resolution) // may be 20Hz rounded
{
test_frequency = f - f % 100 + 51;
if (OmniRig::PM_FREQ & writable_params_)
{
rig_->SetFreq (test_frequency);
@ -248,78 +290,34 @@ int OmniRigTransceiver::do_start ()
{
rig_->SetFreqA (test_frequency);
}
else
if (!await_notification_with_timeout (2000))
{
throw_qstring (tr ("OmniRig: don't know how to set rig frequency"));
CAT_ERROR ("do_start 2: wait timed out");
throw_qstring (tr ("OmniRig: timeout waiting for update from rig"));
}
switch (rig_->GetRxFrequency () - test_frequency)
if (9 == rig_->GetRxFrequency () - test_frequency)
{
case -5: resolution = -1; break; // 10Hz truncated
case 5: resolution = 1; break; // 10Hz rounded
case -15: resolution = -2; break; // 20Hz truncated
case -55: resolution = -2; break; // 100Hz truncated
case 45: resolution = 2; break; // 100Hz rounded
resolution = 2; // 20Hz rounded
}
if (1 == resolution) // may be 20Hz rounded
{
test_frequency = f - f % 100 + 51;
if (OmniRig::PM_FREQ & writable_params_)
{
rig_->SetFreq (test_frequency);
}
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
{
rig_->SetFreqB (test_frequency);
}
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
{
rig_->SetFreqA (test_frequency);
}
if (9 == rig_->GetRxFrequency () - test_frequency)
{
resolution = 2; // 20Hz rounded
}
}
// For OmniRig v1.19 or later we need a delay between GetRxFrequency () and SetFreq (f),
// otherwise rig QRG stays at f+55 Hz. 200 ms should do job for all modern transceivers.
// However, with very slow rigs, QRG may still stay at f+55 Hz. Such rigs should use v1.18.
// Due to the asynchronous nature of Omnirig commands, a better solution would be to implement
// an event handler for OmniRig's OnParamChange event and read the frequency inside that handler.
if (OmniRig::PM_FREQ & writable_params_)
{
QTimer::singleShot (200, [=] {
rig_->SetFreq (f);
});
}
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
{
QTimer::singleShot (200, [=] {
rig_->SetFreqB (f);
});
}
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
{
QTimer::singleShot (200, [=] {
rig_->SetFreqA (f);
});
}
update_rx_frequency (f);
CAT_TRACE ("started");
return resolution;
}
catch (...)
if (OmniRig::PM_FREQ & writable_params_)
{
CAT_TRACE ("start threw exception");
throw;
rig_->SetFreq (f);
}
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
{
rig_->SetFreqB (f);
}
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
{
rig_->SetFreqA (f);
}
update_rx_frequency (f);
return resolution;
}
void OmniRigTransceiver::do_stop ()
{
CAT_TRACE ("stopping");
QThread::msleep (200); // leave some time for pending
// commands at the server end
@ -339,7 +337,6 @@ void OmniRigTransceiver::do_stop ()
{
rig_->clear ();
rig_.reset ();
CAT_TRACE ("rig_ reset");
}
omni_rig_->clear ();
omni_rig_.reset ();
@ -399,6 +396,7 @@ void OmniRigTransceiver::handle_status_change (int rig_number)
else
{
offline_timer_->stop (); // good to go again
Q_EMIT notified ();
}
// else
// {
@ -469,6 +467,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params)
if (params & OmniRig::PM_FREQ)
{
CAT_TRACE ("FREQ");
need_frequency = true;
}
if (params & OmniRig::PM_FREQA)
@ -654,6 +653,7 @@ void OmniRigTransceiver::handle_params_change (int rig_number, int params)
}
CAT_TRACE ("OmniRig params change: state after:" << state ());
}
Q_EMIT notified ();
}
void OmniRigTransceiver::handle_custom_reply (int rig_number, QVariant const& command, QVariant const& reply)
@ -710,7 +710,7 @@ void OmniRigTransceiver::do_ptt (bool on)
void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
{
CAT_TRACE (f << ' ' << state ());
CAT_TRACE (f << state ());
if (!rig_ || rig_->isNull ()) return;
if (UNK != m)
{
@ -739,7 +739,7 @@ void OmniRigTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/)
void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore*/)
{
CAT_TRACE (tx << ' ' << state ());
CAT_TRACE (tx << state ());
if (!rig_ || rig_->isNull ()) return;
bool split {tx != 0};
if (split)
@ -804,7 +804,7 @@ void OmniRigTransceiver::do_tx_frequency (Frequency tx, MODE m, bool /*no_ignore
void OmniRigTransceiver::do_mode (MODE mode)
{
CAT_TRACE (mode << ' ' << state ());
CAT_TRACE (mode << state ());
if (!rig_ || rig_->isNull ()) return;
// TODO: G4WJS OmniRig doesn't seem to have any capability of tracking/setting VFO B mode
auto mapped = map_mode (mode);

View File

@ -44,6 +44,9 @@ public:
void do_ptt (bool on) override;
private:
bool await_notification_with_timeout (int timeout);
Q_SIGNAL void notified () const;
// Q_SLOT void timeout_check ();
Q_SLOT void handle_COM_exception (int, QString, QString, QString);
Q_SLOT void handle_visible_change ();
Q_SLOT void handle_rig_type_change (int rig_number);

View File

@ -23,12 +23,6 @@ QDebug operator << (QDebug d, Transceiver::TransceiverState const& s)
}
#endif
std::ostream& operator << (std::ostream& os, Transceiver::MODE m)
{
auto const& mo = Transceiver::staticMetaObject; \
return os << mo.enumerator (mo.indexOfEnumerator ("MODE")).valueToKey (static_cast<int> (m)); \
}
std::ostream& operator << (std::ostream& os, Transceiver::TransceiverState const& s)
{
return os

View File

@ -169,7 +169,6 @@ Q_DECLARE_METATYPE (Transceiver::TransceiverState);
QDebug operator << (QDebug, Transceiver::TransceiverState const&);
#endif
std::ostream& operator << (std::ostream&, Transceiver::MODE);
std::ostream& operator << (std::ostream&, Transceiver::TransceiverState const&);
ENUM_QDATASTREAM_OPS_DECL (Transceiver, MODE);

View File

@ -16,8 +16,6 @@ namespace
void TransceiverBase::start (unsigned sequence_number) noexcept
{
CAT_TRACE ("#: " << sequence_number);
QString message;
try
{
@ -28,12 +26,10 @@ void TransceiverBase::start (unsigned sequence_number) noexcept
}
catch (std::exception const& e)
{
CAT_TRACE ("#: " << sequence_number << " what: " << e.what ());
message = e.what ();
}
catch (...)
{
CAT_TRACE ("#: " << sequence_number);
message = unexpected;
}
if (!message.isEmpty ())
@ -45,7 +41,7 @@ void TransceiverBase::start (unsigned sequence_number) noexcept
void TransceiverBase::set (TransceiverState const& s,
unsigned sequence_number) noexcept
{
CAT_TRACE ("#: " << s);
CAT_TRACE ("#: " << sequence_number << " " << s);
QString message;
try
@ -81,7 +77,8 @@ void TransceiverBase::set (TransceiverState const& s,
}
if (s.frequency () // ignore bogus zero frequencies
&& ((s.frequency () != requested_.frequency () // and QSY
|| (s.mode () != UNK && s.mode () != requested_.mode ())))) // or mode change
|| (s.mode () != UNK && s.mode () != requested_.mode ())) // or mode change
|| ptt_off)) // or just returned to rx
{
do_frequency (s.frequency (), s.mode (), ptt_off);
do_post_frequency (s.frequency (), s.mode ());
@ -122,12 +119,10 @@ void TransceiverBase::set (TransceiverState const& s,
}
catch (std::exception const& e)
{
CAT_TRACE ("#: " << sequence_number << " what: " << e.what ());
message = e.what ();
}
catch (...)
{
CAT_TRACE ("#: " << sequence_number << " " << sequence_number);
message = unexpected;
}
if (!message.isEmpty ())
@ -138,7 +133,6 @@ void TransceiverBase::set (TransceiverState const& s,
void TransceiverBase::startup ()
{
CAT_TRACE ("startup");
QString message;
try
{
@ -150,12 +144,10 @@ void TransceiverBase::startup ()
}
catch (std::exception const& e)
{
CAT_TRACE ("startup" << " what: " << e.what ());
message = e.what ();
}
catch (...)
{
CAT_TRACE ("startup");
message = unexpected;
}
if (!message.isEmpty ())
@ -166,7 +158,6 @@ void TransceiverBase::startup ()
void TransceiverBase::shutdown ()
{
CAT_TRACE ("shutdown");
may_update u {this};
if (requested_.online ())
{
@ -186,7 +177,6 @@ void TransceiverBase::shutdown ()
}
catch (...)
{
CAT_TRACE ("shutdown");
// don't care about exceptions
}
}
@ -196,7 +186,6 @@ void TransceiverBase::shutdown ()
void TransceiverBase::stop () noexcept
{
CAT_TRACE ("stop");
QString message;
try
{
@ -204,12 +193,10 @@ void TransceiverBase::stop () noexcept
}
catch (std::exception const& e)
{
CAT_TRACE ("stop" << " what: " << e.what ());
message = e.what ();
}
catch (...)
{
CAT_TRACE ("stop");
message = unexpected;
}
if (!message.isEmpty ())
@ -224,7 +211,6 @@ void TransceiverBase::stop () noexcept
void TransceiverBase::update_rx_frequency (Frequency rx)
{
CAT_TRACE ("frequency: " << rx);
if (rx)
{
actual_.frequency (rx);
@ -234,35 +220,28 @@ void TransceiverBase::update_rx_frequency (Frequency rx)
void TransceiverBase::update_other_frequency (Frequency tx)
{
CAT_TRACE ("frequency: " << tx);
actual_.tx_frequency (tx);
}
void TransceiverBase::update_split (bool state)
{
CAT_TRACE ("state: " << state);
actual_.split (state);
}
void TransceiverBase::update_mode (MODE m)
{
CAT_TRACE ("mode: " << m);
actual_.mode (m);
requested_.mode (m); // track rig changes
}
void TransceiverBase::update_PTT (bool state)
{
CAT_TRACE ("state: " << state);
actual_.ptt (state);
}
void TransceiverBase::update_complete (bool force_signal)
{
CAT_TRACE ("force signal: " << force_signal);
if ((do_pre_update ()
&& actual_ != last_)
|| force_signal)
if ((do_pre_update () && actual_ != last_) || force_signal)
{
Q_EMIT update (actual_, last_sequence_number_);
last_ = actual_;
@ -271,7 +250,6 @@ void TransceiverBase::update_complete (bool force_signal)
void TransceiverBase::offline (QString const& reason)
{
CAT_TRACE ("reason: " << reason);
Q_EMIT failure (reason);
try
{
@ -279,7 +257,6 @@ void TransceiverBase::offline (QString const& reason)
}
catch (...)
{
CAT_TRACE ("reason: " << reason);
// don't care
}
}

2293
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,7 @@ JT4 11101000000011000011000000000000000000
JT4/VHF 11111001001011011011110000000000000000
JT9 11101000000011100001000000000000100000
JT9/VHF 11111010100011111001000000000000000000
JT9+JT65 11101000000111100001000000000000100000
JT65 11101000000011100001000000000000100000
JT65/VHF 11111001000011011010110001000000000000
Q65 11111101011011010011100000010000000011

View File

@ -49,11 +49,12 @@ set (UG_SRCS
system-requirements.adoc
transceiver-setup.adoc
tutorial-example1.adoc
tutorial-example2.adoc
tutorial-example3.adoc
tutorial-example4.adoc
tutorial-example5.adoc
tutorial-example6.adoc
tutorial-download-samples.adoc
tutorial-main-window.adoc
tutorial-wide-graph-settings.adoc
utilities.adoc
vhf-features.adoc
@ -62,7 +63,7 @@ set (UG_SRCS
)
set (UG_IMGS
images/active_stations.png
images/130610_2343-wav-80.png
images/AstroData_2.png
images/Astronomical_data.png
images/auto-seq.png
@ -71,6 +72,7 @@ set (UG_IMGS
images/colors.png
images/config-menu.png
images/decode-menu.png
images/decodes.png
images/download_samples.png
images/echo_144.png
images/EME_Deep_0.png

View File

@ -25,17 +25,16 @@ https://www.msys2.org/wiki/MSYS2-installation/
Take particular care to restart the MSYS2 shell window when directed
to.
Once MSYS2 is installed you will find a start menu entry labelled
"MSYS2 MinGW 64-bit", use that to start a fresh MSYS2 shell window for
the rest of these instructions.
The first step is to install some prerequisite packages which contain
the tools needed to prepare and build the portaudio DLL. Execute the
following command to do that:
pacman -S make diffutils unzip mingw-w64-x86_64-gcc sed tar curl
Once MSYS2 is installed and the prerequisite packages above are
installed you will find a new Windows Start Menu entry labelled "MSYS2
MinGW 64-bit", use that to start a fresh MSYS2 shell window for the
rest of these instructions.
Then make directories to put downloaded sources in and for building:
mkdir -p ~/src ~/build/portaudio

View File

@ -94,11 +94,10 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
:sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK]
:ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice]
:win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages]
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1L.msi[Win32 OpenSSL Light Package]
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1L.msi[Win64 OpenSSL Light Package]
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_1_1k.msi[Win32 OpenSSL Light Package]
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1k.msi[Win64 OpenSSL Light Package]
:writelog: https://writelog.com/[Writelog]
:wsjtx_group: https://groups.io/g/WSJTX[WSJTX Group]
:wsjtx_group2: https://groups.io/g/WSJTX[join the group]
:wsjtx: https://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]
:wspr0_guide: https://www.physics.princeton.edu/pulsar/K1JT/WSPR0_Instructions.TXT[WSPR0 Guide]
:wspr: https://physics.princeton.edu/pulsar/K1JT/wspr.html[WSPR Home Page]
@ -121,8 +120,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
:svn: https://subversion.apache.org/packages.html#windows[Subversion]
:win32: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
:win64: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win64.exe[wsjtx-{VERSION}-win64.exe]
:wsjt-devel: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[join the group]
:wsjt-devel2: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[subscribe to the list]
:wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
:wsjt_repo: https://sourceforge.net/p/wsjt/wsjt_orig/ci/master/tree/[WSJT Source Repository]
:wspr_code: https://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
:wspr_svn: https://sourceforge.net/p/wsjt/wspr/ci/master/tree/[WSPR Source Repository]

View File

@ -1,13 +1,12 @@
// Status=review
The _WSJT_ project was started by *K1JT* in 2001. Since 2005 it has
been an Open Source project, and it has included the programs _WSJT_,
been an Open Source project, which now includes the programs _WSJT_,
_MAP65_, _WSPR_, _WSJT-X_, and _WSPR-X_. *G4WJS* (since 2013), *K9AN*
(since 2015), *IV3NWV* (since 2016), *KG4IYS* (since 2021), and
*DG2YCB* (since 2021) have made major contributions to _WSJT-X_.
Together with K1JT they now form the core development team. *G4WJS*
and *W9MDB* have made major contributions to the _hamlib_ library, on
which _WSJT-X_ depends for rig control.
(since 2015), and *IV3NWV* (since 2016) have made major contributions
to _WSJT-X_. Together with K1JT they now form the core development
team. *G4WJS* and *W9MDB* have made major contributiions to _hamlib_,
on which _WSJT-X_ depends for rig control.
All code in the _WSJT_ project is licensed under the GNU Public
License (GPL). Many users of these programs, too numerous to mention
@ -16,9 +15,9 @@ greatly aided the development of _WSJT_ and its sister programs. For
_WSJT-X_ in particular, we acknowledge contributions from *AC6SL,
AE4JY, DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT, KA6MAL, KA9Q,
KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR, VE1SKY, VK3ACF, VK4BDJ,
VK7MO, W3DJS, W3SZ, W4TI, W4TV, and W9MDB*. Each of these amateurs
has helped to bring the programs design, code, testing, and/or
documentation to its present state.
VK7MO, W3DJS, W4TI, W4TV, and W9MDB*. Each of these amateurs has helped to
bring the programs 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*

View File

@ -1,10 +1,8 @@
// Status=edited
Controls related to frequency selection, received audio level, the
station being called, and date and time are found in the lower,
left-hand section of the main window. Buttons are provided for making
quick changes among the modes FT8, FT4, MSK144, Q65, and JT65, and
for toggling FT8 Hound mode ON or OFF.
station being called, and date and time are found in the lower, left-hand section of the
main window:
//.Misc Controls Left
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]

View File

@ -1,7 +1,7 @@
// Status=edited
The following controls appear just under the decoded text windows on
the main screen. Some of them are visible only in certain modes.
the main screen:
//.Main UI
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
@ -11,9 +11,7 @@ image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
* *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 *File -> Settings -> Reporting* tab, the program
raises the confirmation screen automatically when you send a message
containing +73+. *Start Date* and *Start Time* are set when you click
me to log QSO* on the *File -> Settings -> Reporting* tab, the program raises 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.)

View File

@ -37,18 +37,7 @@ examples for configurations `FT8` and `Echo`:
==== View Menu
image::view-menu.png[align="left",alt="View Menu"]
*Active Stations* displays a window that can help you to work the most
distant stations, in particular for the distance-scored ARRL
International Digital Contest. Controls are provided to set the
maximum length of the list and the maximum "`age`" of decodes in Rx
sequences. You can request display of only ready-to-be-called
stations. For the ARRL International Digital Contest the window
displays scoring rate (points in the most recent hour), total score,
and the number of band changes in the past hour.
image::active_stations.png[align="left",alt="Active Stations"]
*SWL Mode* reduces the _WSJT-X_ main window to a minimum
The *SWL Mode* action reduces the _WSJT-X_ main window to a minimum
size with just the menus, decodes windows, and status bar visible. You
may find this useful when running multiple instances of the
application. Both size and location of the main window are saved and

View File

@ -1,9 +1,10 @@
// Status=edited
The following controls appear at the bottom of the Wide Graph window.
Decoding occurs only in the displayed frequency range; otherwise,
controls on the Wide Graph window have no effect on the decoding
process.
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"]
@ -12,6 +13,11 @@ 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.

View File

@ -24,22 +24,20 @@ 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. Type `a7`, used only in FT8 mode,
uses information from the previous Rx sequence.
hypothetically known information.
[[FT8_AP_INFO_TABLE]]
.FST4, FT4, and FT8 AP information types
[width="35%",cols="1h,<10m",frame=topbot,options="header"]
|===
|aP|Message components
|a1|CQ &#160; &#160; ? &#160; &#160; ?
|a2|MyCall &#160; &#160; ? &#160; &#160; ?
|a3|MyCall DxCall &#160; &#160; ?
|a4|MyCall DxCall RRR
|a5|MyCall DxCall 73
|a6|MyCall DxCall RR73
|a7|(Call_1 or CQ) Call_2 &#160; &#160; ?
|===
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|===============================================
|aP | Message components
|a1 | CQ &#160; &#160; ? &#160; &#160; ?
|a2 | MyCall &#160; &#160; ? &#160; &#160; ?
|a3 | MyCall DxCall &#160; &#160; ?
|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
@ -55,8 +53,8 @@ is the same except that it omits the decoding attempts for AP types
[[FT8_AP_DECODING_TYPES_TABLE]]
.FT4 and FT8 AP decoding types for each QSO state
[width="35%",cols="10h,<20m",frame=topbot,options="header"]
|===
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|===========================================
|State |AP type
|CALLING STN | 2, 3
|REPORT | 2, 3
@ -64,15 +62,15 @@ is the same except that it omits the decoding attempts for AP types
|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="1h,<10m",frame=topbot,options="header"]
|===
[width="35%",cols="h10,<m20",frame=topbot,options="header"]
|===============================================
|aP | Message components
|a1 | CQ &#160; &#160; ? &#160; &#160; ?
|a2 | MyCall &#160; &#160; ? &#160; &#160; ?
@ -81,20 +79,20 @@ in JT65. Some details are provided in Tables 3 and 4.
|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="10h,<20m",frame=topbot,options="header"]
|===
[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
|===
|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
@ -111,18 +109,18 @@ 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
|FST4 | ` | | ? &#160; aP
|FT4 | + | | ? &#160; aP
|FT8 | ~ | | ? &#160; aP
|JT4 | $ | *, # | f, fN, dCN
|JT9 | @ | |
|JT65 | # | |
|JT65 VHF| # | *, # | f, fN, dCN
|Q65 | : | | qP
|MSK144 | & | |
|===
|FST4 | ` | | ? &#160; aP
|FT4 | + | | ? &#160; aP
|FT8 | ~ | | ? &#160; aP
|JT4 | $ | *, # | f, fN, dCN
|JT9 | @ | |
|JT65 | # | |
|JT65 VHF| # | *, # | f, fN, dCN
|Q65 | : | | qP
|MSK144 | & | |
|===========================================
Sync character::
`*` - Normal sync +
`#` - Alternate sync
@ -138,13 +136,12 @@ End of line information::
[[Q65_AP_INFO_TABLE]]
.Q65 end-of-line codes
[width="50%",cols="1h,<10m",frame=topbot,options="header"]
|===
|qP|Message components
|q0|? &#160; &#160; ? &#160; &#160; ?
|q1|CQ &#160; &#160; ? &#160; &#160; ?
|q2|MyCall &#160; &#160; ? &#160; &#160; ?
|q3|MyCall DxCall &#160; &#160; ?
|q4|MyCall DxCall &#160; &#160; [<blank> \| RRR \| RR73 \| 73]
|q5|MyCall DxCall &#160; &#160; ? &#160; &#160; &#160; &#160; (*Max Drift* = 50)
|===
[width="45%",cols="h10,<m20",frame=topbot,options="header"]
|===============================================
| | Message components
|q0 | ? &#160; &#160; ? &#160; &#160; ?
|q1 | CQ &#160; &#160; ? &#160; &#160; ?
|q2 | MyCall &#160; &#160; ? &#160; &#160; ?
|q3 | MyCall DxCall &#160; &#160; ?
|q4 | MyCall DxCall &#160; &#160; [<blank> \| RRR \| RR73 \| 73]
|===============================================

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -10,6 +10,12 @@ with the release for details of the targeted Linux distributions and
versions. If the binary package is not compatible with your Linux
distribution or version, you must build the application from sources.
* 32-bit Intel/AMD: {debian32}
- To install:
+
[example]
sudo dpkg -i wsjtx_{VERSION}_i386.deb
* 64-bit Intel/AMD: {debian64}
- To install:
+
@ -39,18 +45,24 @@ You may also need to execute the following command in a terminal:
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
libqt5sql5-sqlite libfftw3-single3 libgomp1 libboost-all-dev \
libusb-1.0-0 libportaudio2
libusb-1.0-0
....
Fedora, CentOS, Red Hat, and other rpm-based systems:
* 32-bit: {fedora32}
- To install:
+
[example]
sudo rpm -i wsjtx-{VERSION}-i686.rpm
* 64-bit: {fedora64}
- To install:
+
[example]
sudo rpm -i wsjtx-{VERSION}-x86_64.rpm
* Uninstall:
* Uninstall for either of the above platforms:
+
[example]
sudo rpm -e wsjtx
@ -60,5 +72,5 @@ You may also need to execute the following command in a terminal:
....
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
qt5-qtserialport libgomp boost libusbx portaudio
qt5-qtserialport libgomp boost libusbx
....

View File

@ -1,13 +1,5 @@
=== Documentation Conventions
We include screen shots that illustrate many of the settings and
features of _WSJT-X_. Keep in mind that _WSJT-X_ is a multi-platform
application: the detailed appearance of windows and user controls may
be significantly different in Windows, Linux, or macOS environments.
The underlying functionality is the same on all operating systems,
however. Where desirable we call special attention to important
platform differences.
In this manual the following icons call attention to particular types
of information:
@ -22,14 +14,9 @@ consequences.
=== User Interface in Other Languages
The _WSJT-X_ user interface (UI) is now available in many languages.
When a translated UI is available for the computer's default System
Language, it will appear automatically on program startup. The UI
language may be overridden if desired by starting _WSJT-X_ with a
command line option. For example, to start _WSJT-X_ with its user
interface in Spanish, enter this command at the prompt: +
`wsjtx --language es`
The _WSJT-X_ user interface is now available in many languages. When
a translated user interface is available for the computer's default
System Language, it will appear automatically on program startup.
=== How You Can Contribute

View File

@ -89,11 +89,3 @@ Release candidates should be used _only_ during a short testing
period. They carry an implied obligation to provide feedback to the
program development group. Candidate releases should not be used on
the air after a full release with the same number is made.
A companion program _MAP65_, written by K1JT, is designed for EME
communication using the JT65 and Q65 protocols. When used with RF
hardware providing coherent signal channels for two orthogonal
polarizations, the program provides automatic polarization-matched
reception for every JT65 or Q65 signal in a 90 kHz passband. On the
Windows platform, _MAP65_ is installed automatically along with
_WSJT-X_.

View File

@ -69,9 +69,9 @@ Check *Auto Seq* on the main window to enable this feature:
image::auto-seq.png[align="center",alt="AutoSeq"]
When calling CQ you may choose to select *CQ: First* to reply
automatically to the first decoded responder, or *CQ: Max Dist*
to reply to the most distant responder.
When calling CQ you may also choose to check the box *Call 1st*.
_WSJT-X_ will then respond automatically to the first decoded
responder to your CQ.
NOTE: When *Auto-Seq* is enabled, the program de-activates *Enable Tx*
at the end of each QSO. It is not intended that _WSJT-X_ should make
@ -83,14 +83,14 @@ operator replacement.
The FT4, FT8, and MSK144 protocols support special messages optimized
for *NA VHF* and *EU VHF* contests. FT4 and FT8 also support messages
for *ARRL Field Day*, *FT Roundup*, and the *WW Digi* contest.
for *ARRL Field Day*, *ARRL RTTY Roundup*, and the *WW Digi* contest.
The decoders recognize and decode these messages at any time.
Configure the program to automatically generate the required message
types for contest exchanges and carry out suitable auto-sequencing by
selecting a supported operating activity on the *Settings | Advanced*
tab. Model QSOs then proceed as follows, for each event type:
*NA VHF Contest* and *ARRL International Digital Contest*
*NA VHF Contest*
CQ TEST K1ABC FN42
K1ABC W9XYZ EN37
@ -98,9 +98,8 @@ tab. Model QSOs then proceed as follows, for each event type:
K1ABC W9XYZ RRR
W9XYZ K1ABC 73
Either callsign (or both) may have /R appended to signify a Rover in a
VHF contest. You can use RR73 in place of RRR, and the final 73 is
optional.
Either callsign (or both) may have /R appended. You can use RR73 in
place of RRR, and the final 73 is optional.
*EU VHF Contest*
@ -125,7 +124,7 @@ to upgrade _WSJT-X_ if you will use *EU VHF Contest* messages.
W9XYZ K1ABC R 2B EMA
K1ABC W9XYZ RR73
*FT Roundup*
*ARRL RTTY Roundup*
CQ RU K1ABC FN42
K1ABC W9XYZ 579 WI
@ -145,7 +144,7 @@ station's log and not the supposed QSO partner's. To avoid Not-in-Log
(NIL) penalties for yourself and others, we recommend the following
guidelines for contest logging with FT4, FT8, and MSK144:
- Activate and learn to use the *Alternate F1-F6 bindings* selectable
- Activate and learn to use the alternate F1-F6 bindings selectable
on the *Settings | General* tab.
- Always log a QSO when you have received RRR, RR73, or 73 from a
@ -154,9 +153,8 @@ guidelines for contest logging with FT4, FT8, and MSK144:
- Log a QSO when you send RR73 or 73 if you are reasonably confident
it will be copied. But be sure to watch for any indication that it
was not copied, and then take appropriate action. For example, if
you receive the Tx3 message (R plus contest exchange) again, and if
you have activated the *Alternate F1-F6 bindings*, hit *F4* to
re-send your RR73.
you receive the Tx3 message (R plus contest exchange) again, hit F4
to re-send your RR73.
[[COMP-CALL]]
=== Nonstandard Callsigns

View File

@ -1,48 +1,27 @@
[[NEW_FEATURES]]
=== New in Version {VERSION_MAJOR}.{VERSION_MINOR}
=== New in Version {VERSION}
- _WSJT-X 2.6_ implements new features supporting the ARRL
International Digital Contest and its distance based scoring. The
*Call 1st* checkbox has been replaced by a drop-down control offering
*CQ Max Dist* as an alternative. With this option selected, the
program will select the reply to your CQ that yields the most contest
points. In addition, a new window labeled *Active Stations* displays
a list of received but unworked callsigns, sorted in decreasing order
of potential contest points. Click on a line in this window to call
that station.
- Decoding performance for FT8 and Q65 has been improved in a variety
of situations with available _a priori_ (AP) information.
- *Echo* mode now offers a *Clear Avg* button and produces reliable
measurements of SNR even when Doppler spread is large. The *Measure*
function can be used to measure SNR for a received unmodulated carrier
-- for example, a key-down test signal emitted by another station and
reflected from the Moon.
- New buttons on the main window allow quick changes between modes
FT4, FT8, MSK144, Q65, and JT65. Another new button allows toggling
FT8 Hound mode ON or OFF.
- Optional color highlighting is provided for specified DX Call and DX
Grid, and for messages containing RR73 or 73.
- New options are provided for writing to file ALL.TXT. You can
request automatic starting of a new file every month or every year,
and you can disable writing altogether.
- Settings for T/R period and Submode are remembered by mode when you
switch directly between (for example) MSK144-15, Q65-60A, JT65-C, or
FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency 1500 Hz (MSK144,
FST4W, Echo, WSPR, FreqCal), then switching back to FT4, FT8, Q65,
JT65, or FST4.
- Other changes include bug fixes and rig control for some new radios.
- _MAP65 3.0_ (available for Windows only) now sends additional
information to file azel.dat and offers digital scaling of input I/Q
data.
_WSJT-X 2.5.0_ introduces an enhanced Q65 decoder that measures and
compensates for linear frequency drifts of Q65 signals. Activate this
feature by setting a spinner control *Max Drift* on the _WSJT-X_ main
window to a number greater than 0. We suggest a setting of 10 for
submode Q65-60A, the recommended submode for EME on 50 and 144 MHz,
which will accommodate drift rates up to 20 Hz/minute. Similarly, we
suggest *Max Drift* = 40 for submode Q65-15C, used for for 10 GHz QSOs
(up to 900 km) via aircraft scatter and drift rates up to about 20
Hz/s.
On the Windows platform only, _WSJT-X 2.5.0_ installations now include
an early version of _MAP65 3.0_. This program works together with
suitable hardware that converts RF to baseband. The hardware/software
combination implements a wideband, highly optimized receiver for the
Q65 and JT65 protocols, with matching transmitting features that
require a standard SSB transceiver. _MAP65_ is effective in both
single-polarization and dual-polarization systems. If two
polarization channels are available, _MAP65_ determines and matches
the linear polarization angle of each decodable signal. This
capability provides a major advantage for efficient EME communication
on bands up to 432 MHz. A single-channel _MAP65_ system works
extremely well for EME on 1296 MHz and higher bands, displaying all
signals in a 90 kHz sub-band and decoding all the Q65 and JT65
signals.

View File

@ -263,8 +263,8 @@ which the probability of decoding is 50% or higher.
[[SLOW_TAB]]
.Parameters of Slow Modes
[width="100%",cols="3h,^3,^2,^1,6*^2",frame=topbot,options="header"]
|===
[width="100%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2,^2",frame=topbot,options="header"]
|===============================================================================
|Mode |FEC Type |(n,k) | Q|Modulation type|Keying rate (Baud)|Bandwidth (Hz)
|Sync Energy|Tx Duration (s)|S/N Threshold (dB)
|FST4-15 |LDPC | (240,101)| 4| 4-GFSK| 16.67 | 66.7 | 0.25| 9.6 | -20.7
@ -289,7 +289,7 @@ which the probability of decoding is 50% or higher.
|FST4W-300 |LDPC | (240,74)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -36.8
|FST4W-900 |LDPC | (240,74)| 4| 4-GFSK| 0.180 | 0.72 | 0.25| 887.5 | -41.7
|FST4W-1800 |LDPC | (240,74)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -44.8
|===
|===============================================================================
LDPC = Low Density Parity Check
RS = Reed Solomon
@ -304,7 +304,7 @@ comparable to tone spacing.
[[SLOW_SUBMODES]]
.Parameters of Slow Submodes JT4, JT9, and JT65 with Selectable Tone Spacings
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|===
|=====================================
|Mode |Tone Spacing |BW (Hz)|S/N (dB)
|JT4A |4.375| 17.5 |-23
|JT4B |8.75 | 30.6 |-22
@ -324,18 +324,18 @@ comparable to tone spacing.
|JT65A |2.692| 177.6 |-25
|JT65B |5.383| 352.6 |-25
|JT65C |10.767| 702.5 |-25
|===
|=====================================
.Parameters of Q65 Submodes
[width="100%",cols="h,5*^",frame=topbot,options="header"]
|===
|=====================================
|T/R Period (s) |A Spacing Width (Hz)|B Spacing Width (Hz)|C Spacing Width (Hz)|D Spacing Width (Hz)|E Spacing Width (Hz)
|15|6.67 &#160; &#160; 4.33|13.33 &#160; &#160; 867|26.67 &#160; &#160; 1733|N/A|N/A
|30|3.33 &#160; &#160; 217|6.67 &#160; &#160; 433|13.33 &#160; &#160; 867| 26.67 &#160; &#160; 1733| N/A
|60|1.67 &#160; &#160; 108|3.33 &#160; &#160; 217|6.67 &#160; &#160; 433|13.33 &#160; &#160; 867|26.67 &#160; &#160; 1733
|120|0.75 &#160; &#160; 49|1.50 &#160; &#160; 98|3.00 &#160; &#160; 195|6.00 &#160; &#160; 390| 12.00 &#160; &#160; 780
|300|0.29 &#160; &#160; 19|0.58 &#160; &#160; 38|1.16 &#160; &#160; 75|2.31 &#160; &#160; 150|4.63 &#160; &#160; 301
|===
|=====================================
[[FAST_MODES]]
=== Fast Modes
@ -390,8 +390,8 @@ and your QSO partner ± 200 Hz.
==== Summary
.Parameters of Fast Modes
[width="90%",cols="3h,^3,^2,^1,5*^2",frame="topbot",options="header"]
|===
[width="90%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2",frame="topbot",options="header"]
|=====================================================================
|Mode |FEC Type |(n,k) | Q|Modulation Type|Keying rate (Baud)
|Bandwidth (Hz)|Sync Energy|Tx Duration (s)
|JT9E |K=32, r=1/2|(206,72)| 8| 9-FSK| 25.0 | 225 | 0.19| 3.400
@ -400,4 +400,4 @@ and your QSO partner ± 200 Hz.
|JT9H |K=32, r=1/2|(206,72)| 8| 9-FSK|200.0 | 1800 | 0.19| 0.425
|MSK144 |LDPC |(128,90)| 2| OQPSK| 2000 | 2400 | 0.11| 0.072
|MSK144 Sh|LDPC |(32,16) | 2| OQPSK| 2000 | 2400 | 0.20| 0.020
|===
|=====================================================================

View File

@ -38,14 +38,15 @@ with twice or four times the normal tone spacing. This feature is
intended for use with specialized LF/MF transmitters that divide
generated frequencies by 2 or 4 as part of the transmission process.
_Special Operating Activity_
_Special Operating Activity: Generation of FT4, FT8, and MSK144
messages_
- Check this box and select the type of activity to enable
auto-generation of special message formats for contesting and
DXpeditions. For *ARRL Field Day*, enter your operating Class and
ARRL/RAC section; for *FT Roundup*, enter your state or province.
ARRL/RAC section; for *ARRL RTTY Roundup*, enter your state or province.
Use “DX” for section or state if you are not in the US or Canada. In
the FT Roundup, Stations in Alaska and Hawaii should enter “DX”.
the RTTY Roundup, Stations in Alaska and Hawaii should enter “DX”.
- Check *Fox* if you are a DXpedition station operating in FT8
DXpedition Mode. Check *Hound* if you wish to make QSOs with such a

View File

@ -39,7 +39,7 @@ image::RadioTab.png[align="center",alt="Radio Tab"]
+
NOTE: A special value of *USB* is available for custom USB devices
like those used by some SDR kits. This is not the same as the virtual
like those used by some SDR kits. This is not the same a virtual
serial port provided by USB connected transceivers and CAT
interfaces, for those use the COM or serial port name that
refers to them.

View File

@ -7,11 +7,8 @@ messages such as the examples shown below.
image::tx-macros.png[align="center",alt="Tx Macros Screen"]
- To add a new message to the list, enter the desired text in the
entry field at top, then click *Add*.
- Remember that a transmitted free-text message is limited to 13
characters, including blanks.
- To add a new message to the list, enter the desired text (up to 13
characters) in the entry field at top, then click *Add*.
- To remove an unwanted message, click on the message and then on
*Delete*.
@ -21,7 +18,3 @@ new order will be preserved when _WSJT-X_ is restarted.
- Messages can also be added from the main window's *Tx5*
field. Simply hit [Enter] after the message has been entered.
- If the first word of a message is $DXCALL (or the shortened form
$DX), that word will be replaced on transmission by the base callsign
in the *DxCall* field.

View File

@ -4,8 +4,8 @@ The best source of help in setting up your station or configuring
_WSJT-X_ is the {wsjtx_group} at email address
wsjtx@groups.io. The chances are good that someone with
similar interests and equipment has already solved your problem and
will be happy to help. To post messages here you will need to
{wsjt-devel}.
will be happy to help. To post messages here you will need to join
the group.
=== Bug Reports
@ -13,7 +13,8 @@ One of your responsibilities as a _WSJT-X_ user is to help the
volunteer programmers to make the program better. Bugs may be
reported to the WSJTX forum on Groups.io {wsjtgroup_mail} or the WSJT
Developers list (wsjt-devel@lists.sourceforge.net). Again, you will
need to {wsjtx_group2} or {wsjt-devel2}.
need to join the group or subscribe to the list. You can register for
the list {wsjt-devel}.
To be useful, bug reports should include at least the following
information:

View File

@ -1,16 +0,0 @@
// Status=review
[[DOWNLOAD_SAMPLES]]
=== Download Samples
The following steps will download sample audio Wave files that were originally recorded
by WSJT-X. These files can be read in and processed by WSJT-X to simulate realtime
operation.
- Select *Download samples...* from the *Help* menu.
- Download some or all of the available sample files using checkboxes
on the screen shown below. For this tutorial you will need at least
the FT8 files.
image::download_samples.png[width=400,align="center",alt="Download Samples"]

View File

@ -0,0 +1,121 @@
// Status=review
.Main Window:
- Select *JT9+JT65* on the *Mode* menu.
- Toggle the *Tx mode* button to read *Tx JT65 #*, and set the Tx and Rx
frequencies to 1718 Hz.
- Double-click on *Erase* to clear both text windows.
.Wide Graph Settings:
- *Bins/Pixel* = 7
- *JT65 .... JT9* = 2500
- Adjust the width of the Wide Graph window so that the upper
frequency limit is approximately 4000 Hz.
.Open a Wave File:
- Select *File | Open* and navigate to +...\save\samples\JT9+JT65\130610_2343.wav+.
The waterfall should look something like this:
//.130610_2343.wav Decode
[[X14]]
image::130610_2343-wav-80.png[align="left",alt="Wide Graph Decode 130610_2343"]
The position of the blue marker on the waterfall scale is
set by the spinner control *JT65 nnnn JT9*, where nnnn is an audio
frequency in Hz. In *JT9+JT65* mode the program will automatically
decode JT9 signals only above this frequency. JT65 signals will be
decoded over the full displayed frequency range.
JT9 signals appear in the *Cumulative* spectrum as nearly rectangular
shapes about 16 Hz wide. They have no clearly visible sync tone like
the one at the low-frequency edge of all JT65 signals. By convention
the nominal frequency of both JT9 and JT65 signals is taken to be that
of the lowest tone, at the left edge of its spectrum.
This sample file contains 17 decodable signals — nine in JT65 mode
(flagged with the character # in the decoded text windows), and eight
in JT9 mode (flagged with @). On multi-core computers the decoders
for JT9 and JT65 modes run simultaneously, so their results will be
interspersed. The *Band Activity* window contains all decodes (you
might need to scroll back in the window to see some of them). A
signal at the frequency specified by the green marker is given
decoding priority, and its message is displayed also in the *Rx
Frequency* window.
[[FigDecodes]]
image::decodes.png[align="center"]
- Confirm that mouse-click behavior is similar to that described
earlier, in <<TUT_EX1,Example 1>>. _WSJT-X_ automatically determines
the mode of each JT9 or JT65 message.
+
TIP: When you double-click on a signal in the waterfall it will be
properly decoded even if on the "`wrong`" side of the *JT65 nnnn JT9*
marker. The Tx mode automatically switches to that of the decoded
signal and the Rx and Tx frequency markers on the waterfall scale
resize themselves accordingly. When selecting a JT65 signal, click on
the sync tone at its left edge.
- Double-click on the waterfall near 815 Hz: a JT65 message
originating from W7VP will be decoded and appear in the *Rx Frequency*
window. Between the *UTC* and *Freq* columns on the decoded text line
you will find *dB*, the measured signal-to-noise ratio, and *DT*, the
signal's time offset in seconds relative to your computer clock.
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|===
|UTC|dB|DT|Freq|Mode|Message
|+2343+|+-7+|+0.3+|+815+|+#+|+KK4DSD W7VP -16+
|===
- Double-click on the waterfall at 3196 Hz. The program will decode a
JT9 message from IZ0MIT:
[width="80%",align="center",cols="^10,2*^8,2*^10,54",options="header"]
|===
|UTC|dB|DT|Freq|Mode|Message
|+2343+|+-8+|+0.3+|+3196+|+@+|+WB8QPG IZ0MIT -11+
|===
- Scroll back in the *Band Activity* window and double-click on the
message `CQ DL7ACA JO40`. The program will set *Tx mode* to JT65 and
the Rx frequency to that of DL7ACA, 975 Hz. If you hold down the
*Ctrl* key, both Rx and Tx frequencies will be moved. If you had
checked *Double-click on call sets Tx Enable* on the *Setup* menu, the
program would configure itself to begin a transmission and start a QSO
with DL7ACA.
- Hold *Ctrl* down and double-click on the decoded JT65 message `CQ
TA4A KM37`. The program will set Tx mode to JT9 and the Rx and Tx
frequencies to 3567 Hz. The program is now configured properly for a
JT9 QSO with TA4A.
.Reopen the First Sample File:
- Select *File | Open* and navigate to `...\save\samples\130418_1742.wav`.
Taking full advantage of the wide-band, dual-mode capability of
_WSJT-X_ requires a receiver bandwidth of at least 4 kHz. These
data were recorded with a much narrower Rx bandwidth, roughly 200 to
2400 Hz. If you have no Rx filter wider than about 2.7 kHz, you will
be using data like this. For best viewing, adjust *Bins/Pixel* and the
width of the Wide Graph so that only the active part of the spectrum
shows, say 200 to 2400 Hz. Re-open the example file after any change of
*Bins/Pixel* or Wide Graph width, to refresh the waterfall.
The signals in this file are all JT9 signals. To decode them
automatically in *JT9+JT65* mode youll need to move the *JT65 nnnn JT9*
delimiter down to 1000 Hz or less.
.Waterfall Controls
Now is a good time to experiment with the *Start* control and the
sliders controlling gain and zero-point of the waterfall and spectrum
plots. *Start* determines the frequency displayed at the left side of
the waterfall scale. Sliders set the baseline level and gain for the
waterfall and the several types of spectra. Good starting values
should be close to mid-scale. You might want to uncheck *Flatten*
when adjusting the sliders. Re-open the wave file after each change,
to see the new results.

View File

@ -1,92 +1,27 @@
// Status=review
.Main Window:
- Click the *Stop* button on the main window to halt any data acquisition.
- Select *FT8* from the *Mode* menu and *Deep* from the *Decode* menu.
- Select *FT8* on the *Mode* menu.
- Double-click on *Erase* to clear both text windows.
.Wide Graph Settings:
- *Bins/Pixel* = 5, *Start* = 100 Hz, *N Avg* = 2
- Adjust the width of the Wide Graph window so that the upper
frequency limit is approximately 3300 Hz.
.Open a Wave File:
- Select *File | Open log directory* and navigate to
+...\save\samples\FT8\210703_133430.wav+. The waterfall and Band
Activity/Rx Frequency windows should look something like the following screen shots:
- You may want to pretend you are K1JT
by entering that callsign temporarily as *My Call* on the
*Settings | General* tab. Your results should then be identical to
those shown in the screen shot below. Don't forget to change *My Call*
back to your own call when you are done!
- Select *File | Open* and navigate to
+...\save\samples\FT8\181201_180245.wav+. The waterfall and Band
Activity window should look something like the following screen shots.
(This recording was made during the "FT8 Roundup" contest, so most
transmissions happen to be using *RTTY Roundup* message formats.)
[[X15]]
image::FT8_waterfall.png[align="left",alt="Wide Graph Decode 210703_133430"]
image::FT8_waterfall.png[align="left",alt="Wide Graph Decode 170709_135615"]
image::ft8_decodes.png[align="left"]
.Decoding Overview
Decoding takes place at the end of a receive sequence. With *Decode* set
to *Deep*, three decoding passes will be done and the *Decode* button on the
mainwindow will illuminate three times, once for each pass.
The first decoding attempt in each decoding pass is done at the selected Rx frequency,
indicated by the U-shaped green marker on the waterfall frequency
scale. All decodes appear in the left (*Band Activity*) window. The right
(*Rx Frequency*) text window displays any decodes obtained at the current
Rx frequency along with any decodes addressed to *My Call* (K1JT in this case).
The red marker on the waterfall scale indicates your
Tx frequency.
Twenty one FT8 signals are decoded from the example file. The number
of decodes is shown in a box at the bottom of the main window.
When this file was recorded HA5WA was finishing a QSO with K1JT, and
his 73 message is shown in red because it is addressed to *My Call* (in this case K1JT).
By default, lines containing `CQ`
are highlighted in green, and lines with *My Call* (K1JT)
in red. Notice that K1JT has two callers; HA0DU and EA3AGB.
[[X13]]
.Decoding Controls
To gain some feeling for controls frequently used when making QSOs,
try double-clicking with the mouse on the decoded text lines and on the
waterfall spectral display. You should be able to confirm the
following behavior:
- Double-click on one of the decoded *CQ* messages highlighted in
green. These actions produce the following results:
** Callsign and locator of the station calling CQ are copied to the *DX
Call* and *DX Grid* entry fields.
** Messages are generated for a standard minimal QSO.
** The *Tx even* box is checked or cleared appropriately, so that you
will transmit in the proper (odd or even) minutes.
** The Rx frequency marker is moved to the frequency of the CQing
station.
** You can modify the double-click behavior by holding down the
*Shift* key to move only the Tx frequency or the *Ctrl* key to move
both Rx and Tx frequencies. (On a Mac computer, use the *command* key
instead of *Ctrl*).
** In addition, if *Double-click on call sets Tx enable* is checked on the
*Settings | General* tab then *Enable Tx* will be activated
so that a transmission will start automatically at the proper time.
+
NOTE: You can prevent your Tx frequency from being changed by checking the
box *Hold Tx Freq*.
- Double-click on the decoded message `K1JT HA0DU KN07`, highlighted
in red. Results will be similar to those in the previous step. The Tx
frequency (red marker) is not moved unless *Shift* or *Ctrl* is held
down. Messages highlighted in red are usually in response to your own
CQ or from a tail-ender, and you probably want your Tx frequency to
stay where it was.
- Click with the mouse anywhere on the waterfall display. The green Rx
frequency marker will jump to your selected frequency, and the Rx
frequency control on the main window will be updated accordingly.
@ -103,12 +38,11 @@ things just described and also invokes the decoder in a small range
around the Rx frequency. To decode a particular signal, double-click
near the left edge of its waterfall trace.
- Ctrl-double-click on a signal to set both Rx and Tx frequencies and
decode at the new frequency.
- Click *Erase* to clear the right window.
- Double-click *Erase* to clear both text windows.
- Now double-click on any of the lines of decoded text in the Band
Activity window. Any line will show the same behavior, setting
Rx frequency to that of the selected message and leaving Tx frequency
unchanged. To change both Rx and Tx frequencies, hold *Ctrl* down
when double-clicking.
TIP: To avoid QRM from competing callers, it is usually best
to answer a CQ on a different frequency from that of the CQing
@ -119,11 +53,6 @@ box *Hold Tx Freq*.
TIP: Keyboard shortcuts *Shift+F11* and *Shift+F12* provide an easy
way to move your Tx frequency down or up in 60 Hz steps.
TIP: Sliders and spinner controls respond to *Arrow* key presses
and *Page Up/Down* key presses, with the *Page* keys moving the
controls in larger steps. You can also type numbers directly into
the spinner controls or use the mouse wheel.
TIP: An online {ft8_tips} by ZL2IFB offers many additional tips on
operating procedures.

View File

@ -19,7 +19,7 @@ frequency limit is approximately 3300 Hz.
+...\save\samples\FT4\200514_182053.wav+. The waterfall and Band
Activity window should look something like the following screen shots.
This sample file was recorded during a practice contest test session, so
most of the decoded messages use the *FT Roundup* message formats.
most of the decoded messages use the *RTTY Roundup* message formats.
[[X16]]
image::ft4_waterfall.png[align="left",alt="Wide Graph Decode FT4"]
@ -56,7 +56,7 @@ and treat it as if you had double-clicked on that line of decoded
text. Here "best potential QSO partner" means "New Multiplier" (1st
priority) or "New Call on Band" (2nd priority). "New Multiplier" is
currently interpreted to mean "New DXCC"; a more broadly defined
multiplier category (for the FT Roundup rules) will be
multiplier category (for the ARRL RTTY Roundup rules) will be
implemented in due course. We may provide additional priority
rankings, for example “New Grid on Band” (useful for North American
VHF contests), sorting by signal strength, etc.
@ -66,7 +66,7 @@ supposed to mean. This is done by configuring suitable options on the
*Settings | Colors* tab. Selection and ordering of color-highlighting
options determines what potential QSO partners will be chosen by the
"Best S+P" feature. Optimum choices will be different for different
contests. In a contest using FT Roundup rules we recommend
contests. In a contest using RTTY Roundup rules we recommend
activating *My Call in message*, *New DXCC*, *New Call on Band*, *CQ
in message* and *Transmitted message*, reading from top to bottom.

View File

@ -31,7 +31,7 @@ image::FST4_center.png[align="center"]
It's best to keep the decoding range fairly small, since QRM and
transmissions in other modes or sequence lengths will slow down the
decoding process (and of course will be undecodable). By checking
*Single decode* on the *File | Settings | General* tab, you can
*Single decode* on the the *File | Settings | General* tab, you can
further limit the decoding range to the setting of *F Tol* on
either side of *Rx Freq*.

View File

@ -0,0 +1,25 @@
// Status=review
- Click the *Stop* button on the main window to halt any data acquisition.
- Select *JT9* from the *Mode* menu and *Deep* from the *Decode* menu.
- Set the audio frequencies to *Tx 1224 Hz* and *Rx 1224 Hz*.
+
TIP: Sliders and spinner controls respond to *Arrow* key presses
and *Page Up/Down* key presses, with the *Page* keys moving the
controls in larger steps. You can also type numbers directly into
the spinner controls or use the mouse wheel.
[[DOWNLOAD_SAMPLES]]
=== Download Samples
- Select *Download samples...* from the *Help* menu.
- Download some or all of the available sample files using checkboxes
on the screen shown below. For this tutorial you will need at least
the JT9 and JT9+JT65 files.
image::download_samples.png[align="center",alt="Downlod Samples"]

View File

@ -1,46 +1,13 @@
// Status=review
The WSJT-X Wide Graph window displays the frequency spectrum of the received audio. Usually, the
upper portion of the window shows a waterfall plot of the frequency spectrum (a spectrogram) and
a line plot of the current or average spectrum. Controls at the bottom of the window are used to
set up the displayed audio frequency range, color palette, and scaling of the spectrum displays.
A control on the bottom right of the Wide Graph (displayed as *Spec nn%*) lets you control
the vertical fraction of the window occupied by the spectrum line plot.
It is important to set appropriate lower and upper
audio frequency limits for the Wide Graph because these limits define the FT8 decoder's search window.
For this tutorial, the limits will be set to cover 100-3300 Hz:
- Set *Start* = 100 Hz.
- Set *Bins/Pixel* = 5. Smaller/larger values make the Wide Graph cover a smaller/larger
frequency range.
- Use the mouse to grab the left or right edge of the *Wide Graph*, and
adjust its width so that the upper frequency limit is about 3300 Hz.
The *N Avg* setting controls how many spectra are averaged to produce each line in the spectrogram.
Smaller values make the spectrogram update more frequently, resulting in signals being more spread
out in the vertical (time) direction.
On the other hand, larger values make it easier to detect very weak signals:
- Set *N Avg* = 2.
The *Palette* setting controls the color scheme used for the spectrogram:
- Set *Palette* = Fldigi
When *Flatten* is checked, WSJT-X attempts to correct for slope or curvature in the receiver's
passband shape.
- *Flatten* = checked
The line plot can be set to display the current (un-averaged) spectrum or the cumulative (averaged)
spectrum:
- *Bins/Pixel* = 4
- *Start* = 200 Hz
- *N Avg* = 5
- *Palette* = Digipan
- *Flatten* = checked
- Select *Cumulative* for data display
- Set the *Gain* and *Zero* sliders for the waterfall and spectrum to near midscale
The *Spec nn%* setting determines what fraction of the vertical extent of the Wide Graph will
be used for the line plot of the spectrum. Setting *Spec* to 0 will eliminate the line plot and
a setting of 100 will eliminate the spectrogram and show only the line plot:
- Set *Spec* = 50%
- *Gain* and *Zero* sliders for waterfall and spectrum set near midscale
- *Spec* = 25%
- Use the mouse to grab the left or right edge of the *Wide Graph*, and
adjust its width so that the upper frequency limit is about 2400 Hz.

View File

@ -333,27 +333,6 @@ correlation algorithm. JT65 and Q65 offer _a priori_ (AP)
decoding, which takes advantage of naturally accumulating information
during a QSO.
For CW mode on SHF and microwave EME WSJT-X can be used to do Doppler
shift correction if desired:
- Check the *Settings -> Radio -> Mode -> None* option, this stops _WSJT-X_
from trying to set the mode of your rig.
- Put you rig into CW mode as normal.
- Before transmitting press *Tune* in _WSJT-X_, no tones will be
transmitted as the rig is in CW mode, but importantly WSJT-X knows
your are transmitting and adjusts the Doppler shift correction as
needed for the currently selected Doppler shift correction mode in
transmit.
- When you have finish transmitting CW press *Tune* again to revert to
receive mode and the correct Doppler shift correction for receiving.
NOTE: The above assumes you are already set up for _WSJT-X_
<<VHF_SETUP,Doppler shift correction>> with working CAT control, and
*Monitor* enabled etc..
////
The following tutorial aims to familiarize you with
these program features, all of which are of special interest for EME

View File

@ -141,20 +141,31 @@ include::transceiver-setup.adoc[]
== Basic Operating Tutorial
This section introduces the basic user controls and program behavior
of _WSJT-X_, with particular emphasis on the FT8 mode.
of _WSJT-X_, with particular emphasis on the JT9, JT65, and FT8 modes.
We suggest that new users should go through the full HF-oriented
tutorial, preferably while at your radio.
tutorial, preferably while at your radio. Note that as of late 2018,
digital usage on the HF bands has mostly moved from JT65 and JT9 to FT8. So
you may wish to pay particular attention to *FT8*, in Section 6.6.
Subsequent sections cover additional details on <<MAKE_QSOS,Making
QSOs>>, <<WSPR,WSPR mode>> and <<VHF_AND_UP,VHF+ Features>>.
[[TUT_SAMPLES]]
include::tutorial-download-samples.adoc[]
[[TUT_MAIN]]
=== Main Window Settings
include::tutorial-main-window.adoc[]
[[TUT_WIDE_GRAPH]]
=== Wide Graph Settings
include::tutorial-wide-graph-settings.adoc[]
[[TUT_EX1]]
=== JT9
include::tutorial-example1.adoc[]
[[TUT_EX2]]
=== JT9+JT65
include::tutorial-example2.adoc[]
[[TUT_EX3]]
=== FT8
include::tutorial-example3.adoc[]

569
g4wjs.txt
View File

@ -1,569 +0,0 @@
Joe Taylor, K1JT:
I am very sorry to convey the sad news that Bill Somerville,
G4WJS, died suddenly and unexpectedly a few days ago. He was only
about 65 years old.
Bill was a dear friend and very close colleague, though (as is often
the case with worldwide ham radio friendships) we had met in person
only a few times. In 2013 he was the first to join me in forming a
core development group for WSJT-X, which at that time was at program
version 0.99. Bill has been closely involved with WSJT-X and related
software projects ever since.
Our free, open-source software could not have achieved its extensive
worldwide popularity and influence in ham radio without Bill's
essential contributions. In addition to writing code for important
portions of the Qt-based user interface for WSJT-X, Bill helped to
bring the overall program structure more nearly up to professional
standards. Moreover, he devoted countless hours to program support,
patiently answering user's questions on WSJT-related forums.
I have only started to think about the many ways in which I will miss
Bill -- not no mention how we all will miss his immense and positive
impact on WSJT-X and related projects. For more than eight years Bill
and I communicated closely and regularly on ham radio topics,
sometimes many times per day. Perhaps I will be able to write more
about it in the near future.
Rest in peace, dear friend G4WJS.
Stan Gammons, KM4HQE:
So sad to hear that Joe. Bill will be greatly missed.
Prayers for his family and friends.
Rest in peace Bill
Colin Haig, VE3MSC:
Joe, this is truly sad news. Bill has been a wonderful resource and
supported all of us. Please pass condolences to his family.
PA3GCU:
May he rest in peace.
Philip Hazelton, G8PJH
This is shocking news, he was such talent, he will be sorely missed,
condolences to his family.
Philip Rose, GM3ZZA
You have provided an excellent service to the WSJT-X community. I
think your last post was a couple of days ago. We will all miss you,
and your incisive resolution of all our problems.
Requiescat in pace.
Dave, AA6YQ:
A huge loss for all of us. Bill always took the time to provide a
friendly, accurate, and helpful answer to any question that came his
way. He set one good example after another.
Reino Talarmo, OH3MA:
RIP Bill, We will miss your kind advice.
Tom V. Segalstad, LA4LN:
The silent key of Bill is very sad news.
Bill has been extremely helpful for radio amateurs to make WSJT-X fit
their different radios and computers. We have seen E-mail answers from
him coming at all times during borh day and night. And we wonder if he
ever got time to sleep or eat, in-between his good answers and advices
to radio amateurs world wide.
So rest in peace Bill, and thank you very much for all the help you
have provided to radio amateurs world wide, for making their digital
radio amateur activity very successful.
John, VE7KKQ:
So long, Bill, condolences to his family.
Tom, M0LTE:
Unreal. Deeply shocking.
Heartfelt condolences from us all at the Reading club, where Bill was
a member.
Борис Романов (Boris Romanov), UX8IW:
Sad news. Condolences to Bill's family and friends.
Ken Cox, WA8OMR:
Sorry to hear about Bill's passing. I will miss reading his answers to
the many questions posted. I have learned a lot from them.Ken WA8OMR.
Gary Trock:
Very Sad.
Ive been reading his posts since I joined.
RIP.
Dave Sellars, KB4JB:
Very sad news indeed. Amateur Radio worldwide has lost a tremendous
ham and friend. His contributions to WSJT-X and this group will never
be forgotten.
Lynn Mears, K0CLM:
Extremely sad news. I havent been involved with WSJT that long, but
it was obvious that Bill donated a lot of time and effort towards WSJT
and helping in many different ways. He will be missed greatly.
Peter, M0PWX:
Sad news indeed, Bill was a great resource and font of so much
knowledge, as well as having the patience of a saint when dealing with
some members / questions
Will be greatly missed on here
Russ Ravella:
Incredibly sad news. What a wonderful, valuable and kind man Bill
was. How much better the world would be with more Bills in it.
Thank you and Rest In Peace Bill Somerville.
Sam Birnbaum, W2JDB:
So very sorry to hear this sad news. Bill has been very extremely
helpful to me in providing the information that allowed me to provide
a complimentary program for WSJT-X so that visually impaired/blind
hams can also partake in this fantastic program and its modes.
Rest In Peace Bill, you will be sorely missed by all.
Jack Trampler, N2JT
I never worked Bill. Did he even have time to operate? I never met
Bill. But I would have liked to. I never sent him an email, either
personal or on this group. I wish I had.
I enjoyed my daily (actually several times a day) reading of the
messages posted in this group and his replies. I learned a lot from
them. This man had so much knowledge and the fact that he took the
time to deal with almost every post in this group and share that
knowledge, its truly a testament to this man. I for one will surely
miss him.
I wish I knew him better. Rest in Peace, Bill.
Pete Smith, N4ZR:
Terrible news. Though I'm not a great devotee of the digital modes
(except CW), without Bill I'm convinced I would not have made a single
QSO using WSJT-X. My sympathy to his family and friends.
Neil Zampella, KN3ILZ:
I agree. Bill was patient with everyone, even me when I replied to a
post and chewed my foot up to the ankle.
His passing will affect much done within WSJT-X, as well as Hamlib.
He was a font of knowledge and 'corporate' memory.
We may not see his like again.
Jim Brown, K9YC:
If Bill had done nothing more than provide what seemed like 24/7
support here, his contribution would have been monumental. Thanks
Bill, RIP.
Jeff, K3JRZ:
Wow. Very sad to hear.
I had sent many emails to him looking for help with WSJT-X when I
first started having my first issues with it when I started with the
software and then again after several macOS updates. Always a great
guy to get help from. He will surely be missed. My condolences to his
family and to all that knew him.
Lance Collister, W7GJ:
Our heart-felt condolences to you, Joe, and to all the folks like me
whom he so patiently helped over the years. He was an amazing member
of the WSJT-X team, and I found myself always amazed at how in the
world he was able to answer all the questions posed to him by users of
WSJT-X on such a myriad of different rigs with different software. His
contributions will be long remembered, and very much appreciated. So
sad to see someone go who gave so much so freely to our
community. RIP, Bill.
Klaus Werner, G7RTI:
Thanks to Bills helpful explanations I was able to get going on
WSJTX.
I didnt know him or anything about him except what has been written
in previous comments.
May he rest in peace.
Wayne Rash, N4HCR:
This is so sad. Bill always showed great patience with my dumb
questions. He played a big role in making WSJTX a joy to use. Ham
radio owes him a huge debt.
Rest In Peace, Bill.
Dave:
Very sad to hear. He will live in our memories and our operating.
Ed Radlo, AJ6V:
Bill always answered the various online queries vey quickly, and his
vast knowledge helped many of us get on track with all of these new
digital modes.
A great loss to ham radio.
Bob Bownes: (?)
Very sad to hear. May his memory be a blessing to his family and all
who knew him.
In the Law Enforcement, Fire and Emergency Medical Services, the
passing on of one such is often marked with a 'Last Call' or 'Final
Dispatch' in which the departed's call sign is requested thrice for
one last time. Usually at a pre-arranged or significant time. Seems
appropriate in this case as well. Perhaps you could do that for us
Joe.
Rick, I2BRT:
Very sad news and a great loss for our cumunity. Thanks for all the
effort and friendship Bill. Rest in peace.
Andy, GD0TEP:
I never worked Bill. Did he even have time to operate?
Yes, I worked him on 15m in August just gone, and on 6m back in
May. Both on FT8 of course.
Gwen, KI5PXQ:
I also worked him, 1600Z on the 24th of October, 15 meters, FT8.
Ria, N2RJ:
This is truly awful news. Bill will certainly be missed.
Walter, OE6IWG:
VY sad News :-(
Bill was a GREAT helper - also for me. My condolences to his family
and friends.
Ed Wilson, K0KC:
This is a tremendous loss to the amateur radio community, but as
someone who lost his brother only a few weeks ago, I know that the
loss is much greater to his family and close friends...my condolences
to each of them. RIP, Bill...
Amos Sobel, 4X4MF:
Me and the WSJT-X community mourn the departure of Bill Somerville
Bob, K4RCG:
I deeply regret not sending Bill a "personal thank you" e-mail for his
support of our hobby. I had planned on doing so, but didn't want to
add traffic to his in-box admin! He will be missed, but fondly
remembered.
Hamish, G0GLG:
Very sad day for amateur radio.
Paul Welford, G4YKQ:
A Tribute to my dearest friend Bill Somerville G4WJS.
I apologize for length of this post. This might answer a few previous
posts Knowing Bill he will be still reading all these posts from a
better place.
I thank you for your speedy post Joe.
Bill G4WJS was one of my dearest friends living just 4 miles apart.We
spoke 2/3 times a week and at times several times a day.
After a 20 year plus break Bill spurred me on to come back into the
radio family. I OWE HIM A LOT. Thanks to him my major interest in the
last 10 years has been WSJT-X. Bill also had a passion for Photography
and me being a Photographer for The Sun Newspaper In London before I
retired had another common interest we liked to have a good natter but
I often came off the worst.Bill lived on his own so we kept a close
eye on each other.
Bill had a degree in Chemistry but as I understand was self taught in
computing and electronics.Please see his QRZ page.
He was a whizz. He was a great natural teacher and Joe I think this was
one of the reasons he got on so well with you and the group.He
remarked to me many times "I never mind helping anyone provided they
help themselves" At times glaring at me muttering under his breath
"Read the notes and the posts" Sometimes it so annoyed him when I
could not keep a straight face..we all know the story.Bill always
willing to help with a computer grafted to his hand. Over the last
ten years he has like others in the group spent hours and hours
involved with WSJX-X.He had a great admiration for open source
programs.Made many friends within the digital community and a big
respect for Dxlabs {Dave] JTalert [Laurie] among others. I was always
giving him praise for taking a break and TXing winding up this 4 ele
,of late not often[Bill head in PC} every day I would have a crafty
check on his PSK. Bill was very much in favour of Using L.O.T.W but
never collected awards,but on receiving a trophy for technical
achievement announced at Dayton when he told me there was no emotion
but I knew Bill just to well he was chuffed !
Sadly last Friday after never responding to my calls I found Bill
seated in his shack at peace surrounded by the things he loved most.
I am still total shock!!!
Such a loss of a talented and loyal friend and as I have said he shall
be greatly missed by many in our radio family.
R.I.P.William [Bill ] G4WJS.
God Bless you and till we meet again 73.................. Cheers mate!
Ronnie Hull:
I am greatly saddened to hear this news.
Keith Wood, W4RPE:
Great tribute to a wonderful man.
Carlos, OE3JAG:
May I also do my sadly condolences to his family and his friends ! He
will surely be missed by all the hams. Thanks for got in touch with
you, dear Bill.
Good luck in your new place, Bill, I miss you,
William Hensley, WG8S:
A great tribute, Paul! I'm sorry you were the one to find him, yet I
sense you would both want it that way. I did not know Bill, but he
made a tremendous contribution to the WSJT-X community. He will be
missed.
RIP, Bill. Thank you, Paul.
Bernd, KB7AK:
Thank you for your tribute Paul, we will all miss Bill dearly.
Philip Rose, GM3ZZA:
As far as I can see we as amateurs who have been helped by Bill,
should keep up his good work. I know I cant alone.
His advice was definitive. Others not so.
Jim Brown, K9YC:
Thanks very much, Paul, for this lovely and loving post. As you and
Joe have so eloquently written, Bill exemplified the best of the ham
spirit, by giving and sharing far more than he received.
Erik, VA7QI:
Very sorry to hear about Bill. I enjoyed reading his comments and
very much appreciate his contribution for WSTJ-X.
His name and callsign will be remembered for a long time as a shining
light of the ham radio community.
73 de va7qi, ....Erik.
Marco, PY1ZRJ:
My God! Whats terrible news is this!
Bill helped me in many occasions with WSJT-X always with a very pure
"ham-spirit" and availability.
My very sincere condolence to all his family and friends, I will miss
him a lot despite I never had the pleasure to meet him.
Martin Davies, G0HDB:
That is truly unwelcome and most distressing news, Joe; I'm sure the
vast amounts of time and effort that Bill devoted to the development
and support of WSJT-X will be very sorely missed by everyone in the
community, whether or not they had ever had any direct dealings with
Bill.
Please convey all our sympathies and our deepest condolences to Bill's
relatives and friends.
John Nelson, G4KLA:
I am saddened to learn of your news. This is blow to the WSJT-X
community.
In the early days of Bills involvement with WSJT he often logged into
my Macs at home to test his software modifications on a Mac until he
got a VM working. He and I had numerous discussions while testing new
versions on various Mac OS. He was generous with his time in helping
folks with problems either running the codes or attempting to build
the software on various platforms. The multitude of emails to the
development list is a tribute to his commitment to ensure that the
various programs operated flawlessly.
His involvement with the development of WSJT-X code especially with
modernising the structure of the whole program has been immense. I
will certainly miss his advice.
A sad day…
Alan, G0TLK:
Shocking and saddening news, he will be greatly missed.
My condolences to his family and friends, and RIP Bill.
Robin, G8DQX:
I only knew Bill through his contributions to the WSJT lists. Those
contributions were sharp, radical, and usually encouraging. He was a
clearly essential part of a team that is helping Amateur Radio to
grow, expand and develop, far beyond what you and I knew when,
soldering iron in hand, we first played with radio, all those years
ago.
My condolences to his family and friends. We shall all miss him.
Robin, G8DQX
Charlie Suckling, G3WDG/DL3WDG:
We were also shocked and very sorry to hear of Bill's sudden
passing. I never had the pleasure of meeting him in person. Like Bob,
he attended the same University and read the same degree.
We are so grateful for his contributions over many years to
WSJT-X. His support for users was first class, and he even joined the
EME reflectors to give support to EME users during the roll-out of
Q65, despite not being active himself on EME. He was contributing
there regularly, and some of his last efforts were to support the use
of WSJT-X for Doppler control on CW on the microwave bands.
He was also a very patient and diligent teacher, tutoring and helping
those who wished to make small contributions to the project. I am very
grateful for the time he spent in such ways.
Bill will surely be greatly missed, and sincere condolences to his
family and many friends.
RIP Bill.
James Shaver, N2ADV:
I had the pleasure of talking to Bill over Skype a few times during
the development of 1.7 and later 1.8 to chase down some CAT control
gremlins with several radios I happen to own. His patience and
intelligence was incredible. Such a huge loss to us all.
My sincerest condolences to his family and friends.
He will definitely be missed but his contributions to the advancement
of amateur radio will live on indefinitely.
Alessandro Gorobey, IK2
Very sad news and a great loss.
A great teacher.
My sincerest condolences to his family and friends.
Jim Preston, N6VH:
This is definitely very sad news. Bill was a very important part of
the WSJT team. He will be missed very much.
My condolences to his family.
Gary Lane, VK4OO
Very sad news, my condolences to Bills friends and family….
Bob Atkins, KA1GT:
I was shocked and saddened by the news of Bill's passing. We chatted
on line quite often though we never met in person. He attended the
same university as I didn't, reading the same subjects, but was a hear
of two behind me, so we never met their either. Bill will be greatly
missed and I send my condolences to his friends and family.
RIP Bill.
Dave Schmocker, KJ9I:
This is incredibly sad news. Bill was always so helpful, highly
responsive, and on-target with deep technical solutions.
What a wonderful asset Bill was to the hobby and to all with whom he
interfaced.
Jim, WB4CGS:
I am very sorry for this loss.
Conrad Farlow, Jim WB4GCS
Joe I am absolutely lost for words. What a terrible shock. I cannot
imagine him not being there. My condolences to you, Bill's family and
well the whole dev team. We will all miss him Most of all I am sorry
that you lost such a good friend.
Sam Jewell, G4DDK:
So sad to hear this news. One of the team who have revolutionised ham
radio operation, popularised digital and helped realise what we
thought should be possible.
Vale Bill.
Nick, NN3Y:
R I. P. Bill. He'll be missed. My sincere condolences to his family
and friends.
Jay, KA9CFD:
Shocking and very sorry news. RIP Bill.
Mirek, OK2AQ:
Very sad news for us WSJT-X users. R.I.P. Bill
OH6KTL, Lasse:
ge and sad to hear about Bill

View File

@ -94,7 +94,3 @@ KA1ABC/VEX 37
<W3CCX/P> <K1JT> 590001 FN20QI
<W3CCX/P> <K1JT/P> 590001 FN20QI
<W3CCX/QRP> <K1JT/QRO> 590001 FN20QI
CQ OE21FTDMC
K9AN K1JT R-
K9AN K1JT R+
K1AN K1JT WXY

View File

@ -8,7 +8,6 @@ module packjt77
character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
character (len=13) :: mycall13=''
character (len=13) :: dxcall13=''
character (len=6) :: dxbase=''
integer, dimension(1:MAXHASH) :: ihash22=-1
integer :: nzhash=0
integer n28a,n28b
@ -125,11 +124,6 @@ subroutine pack77(msg0,i3,n3,c77)
integer ntel(3)
msg=msg0
if(msg(1:3).eq.'$DX') then
i1=index(msg,' ')
msg=trim(dxbase)//' '//msg(i1+1:)
endif
i3_hint=i3
n3_hint=n3
i3=-1
@ -830,9 +824,7 @@ subroutine split77(msg,nwords,nw,w)
iz=j !Message length
nwords=k !Number of words in msg
if(nwords.le.0) go to 900
do i=1,nwords
nw(i)=len(trim(w(i)))
enddo
nw(k)=len(trim(w(k)))
msg(iz+1:)=' '
if(nwords.lt.3) go to 900
call chkcall(w(3),bcall_1,ok1)
@ -841,7 +833,7 @@ subroutine split77(msg,nwords,nw,w)
w(2:12)=w(3:13) !Move all remaining words down by one
nwords=nwords-1
endif
900 return
end subroutine split77
@ -1126,7 +1118,7 @@ subroutine pack77_1(nwords,w,i3,n3,c77)
irpt=irpt+35
else if(c2.eq.'R+' .or. c2.eq.'R-') then
ir=1
read(w(nwords)(2:),*,err=900) irpt
read(w(nwords)(2:),*) irpt
if(irpt.ge.-50 .and. irpt.le.-31) irpt=irpt+101
irpt=irpt+35
else if(trim(w(nwords)).eq.'RRR') then
@ -1284,7 +1276,6 @@ subroutine pack77_4(nwords,w,i3,n3,c77)
if(call_2(1:1).eq.'<') call_2=w(2)(2:len(trim(w(2)))-1)
call chkcall(call_1,bcall_1,ok1)
call chkcall(call_2,bcall_2,ok2)
if(call_1.eq.bcall_1 .and. call_2.eq.bcall_2 .and. ok1 .and. ok2) go to 900
icq=0
if(trim(w(1)).eq.'CQ' .or. (ok1.and.ok2)) then
if(trim(w(1)).eq.'CQ' .and. len(trim(w(2))).le.4) go to 900

View File

@ -11,7 +11,6 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
real*8 uth8,techo8,freq8
real*8 xl,b
common/librcom/xl(2),b(2)
common/echocom2/fspread_self,fspread_dx
data uth8z/0.d0/
save
@ -45,9 +44,6 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
width1=0.5*6741*fghz*rate1
rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2)
width2=0.5*6741*fghz*rate2
if(hisgrid(1:4).eq.' ') width2=width1 !No hisgrid, use self width
fspread_self=width1 !Save for avecho()
fspread_dx=width2 !Save for avecho()
AzSun8=AzSun
ElSun8=ElSun

View File

@ -4,9 +4,6 @@ module astro_module
private
public :: astrosub
logical :: initialized = .false.
integer :: azel_extra_lines = 0
contains
subroutine astrosub(nyear,month,nday,uth8,freq8,mygrid_cp, &
@ -31,18 +28,11 @@ contains
character(len=6) :: mygrid, hisgrid
character(len=:), allocatable :: AzElFileName
character(len=1) :: c1
character(len=32) :: envvar
integer :: ih, im, imin, is, isec, nfreq, env_status
integer :: ih, im, imin, is, isec, nfreq, nRx
real(dp) :: AzAux, ElAux, dbMoon8, dfdt, dfdt0, doppler, doppler00, HA8, sd8, xlst8
character*256 jpleph_file_name
common/jplcom/jpleph_file_name
if (.not.initialized) then
call get_environment_variable ('WSJT_AZEL_EXTRA_LINES', envvar, status=env_status)
if (env_status.eq.0) read (envvar, *, iostat=env_status) azel_extra_lines
initialized = .true.
end if
mygrid = mygrid_cp
hisgrid = hisgrid_cp
AzElFileName = C_string_value (AzElFileName_cp)
@ -54,12 +44,6 @@ contains
width1,width2,xlst8,techo8)
if (len_trim(AzElFileName) .eq. 0) go to 999
if(len(trim(hisgrid)).eq.0) then !If DX grid is blank, set these to zero:
AzMoonB8=0
ElMoonB8=0
ndop=0
width2=0
endif
imin=60*uth8
isec=3600*uth8
ih=uth8
@ -67,8 +51,10 @@ contains
is=mod(isec,60)
open(15,file=AzElFileName,status='unknown',err=900)
c1='R'
nRx=1
if(bTx) then
c1='T'
nRx=0
endif
AzAux=0.
ElAux=0.
@ -79,13 +65,13 @@ contains
ih,im,is,AzSun8,ElSun8, &
ih,im,is,AzAux,ElAux, &
nfreq,doppler,dfdt,doppler00,dfdt0,c1
if (azel_extra_lines.ge.1) write(15, 1020, err=10) poloffset8,xnr8,Dgrd8
! TXFirst,TRPeriod,poloffset,Dgrd,xnr,ave,rms,nRx
1010 format( &
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Moon'/ &
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Sun'/ &
i2.2,':',i2.2,':',i2.2,',',f5.1,',',f5.1,',Source'/ &
i5,',',f8.1,',',f8.2,',',f8.1,',',f8.2,',Doppler, ',a1)
1020 format(f8.1,','f8.1,',',f8.1,',Pol')
! i1,',',i3,',',f8.1,','f8.1,',',f8.1,',',f12.3,',',f12.3,',',i1,',RPol')
10 close(15)
go to 999

View File

@ -1,5 +1,4 @@
subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
dfreq,width)
subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
integer TXLENGTH
parameter (TXLENGTH=27648) !27*1024
@ -14,23 +13,11 @@ subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
real s(8192)
real x(NFFT)
integer ipkv(1)
logical ex
complex c(0:NH)
equivalence (x,c),(ipk,ipkv)
common/echocom/nclearave,nsum,blue(NZ),red(NZ)
common/echocom2/fspread_self,fspread_dx
save dop0,sa,sb
fspread=fspread_dx !### Use the predicted Doppler spread ###
if(nauto.eq.1) fspread=fspread_self
inquire(file='fspread.txt',exist=ex)
if(ex) then
open(39,file='fspread.txt',status='old')
read(39,*) fspread
close(39)
endif
fspread=min(max(0.1,fspread),700.0)
width=fspread
dop=ndop
sq=0.
do i=1,TXLENGTH
@ -61,28 +48,69 @@ subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
if(ia.gt.7590 .or. ib.gt.7590) go to 900
nsum=nsum+1
do i=1,NZ
sa(i)=sa(i) + s(ia+i-2048) !Center at initial doppler freq
sb(i)=sb(i) + s(ib+i-2048) !Center at expected echo freq
enddo
call echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,dfreq,snr_detect)
nqual=snr_detect-2
if(nqual.lt.0) nqual=0
call pctile(sb,200,50,r0)
call pctile(sb(1800),200,50,r1)
sum=0.
sq=0.
do i=1,NZ
y=r0 + (r1-r0)*(i-100.0)/1800.0
blue(i)=sa(i)/y
red(i)=sb(i)/y
if(i.le.500 .or. i.ge.3597) then
sum=sum+red(i)
sq=sq + (red(i)-1.0)**2
endif
enddo
ave=sum/1000.0
rms=sqrt(sq/1000.0)
redmax=maxval(red)
ipkv=maxloc(red)
fac=10.0/max(redmax,10.0)
dfreq=(ipk-2048)*df
snr=(redmax-ave)/rms
sigdb=-99.0
if(ave.gt.0.0) sigdb=10.0*log10(redmax/ave - 1.0) - 35.7
nqual=0
if(nsum.ge.2 .and. nsum.lt.4) nqual=(snr-4)/5
if(nsum.ge.4 .and. nsum.lt.8) nqual=(snr-3)/4
if(nsum.ge.8 .and. nsum.lt.12) nqual=(snr-3)/3
if(nsum.ge.12) nqual=(snr-2.5)/2.5
if(nqual.lt.0) nqual=0
if(nqual.gt.10) nqual=10
! Scale for plotting
redmax=maxval(red)
fac=10.0/max(redmax,10.0)
blue=fac*blue
red=fac*red
nsmo=max(0.0,0.25*width/df)
sum=0.
do i=ipk,ipk+300
if(i.gt.NZ) exit
if(red(i).lt.1.0) exit
sum=sum+(red(i)-1.0)
enddo
do i=ipk-1,ipk-300,-1
if(i.lt.1) exit
if(red(i).lt.1.0) exit
sum=sum+(red(i)-1.0)
enddo
bins=sum/(red(ipk)-1.0)
width=df*bins
nsmo=max(0.0,0.25*bins)
do i=1,nsmo
call smo121(red,NZ)
call smo121(blue,NZ)
enddo
! write(*,3001) snrdb,db_err,dfreq,snr_detect,redmax,nqual,nsmo,nclearave,nsum
!3001 format('A',5f10.1,4i4)
900 return
end subroutine avecho

View File

@ -7,7 +7,7 @@ subroutine averms(x,n,nskip,ave,rms)
sq=0.
ipk=maxloc(x)
do i=1,n
if((nskip.lt.0) .or. (abs(i-ipk(1)).gt.nskip)) then
if(abs(i-ipk(1)).gt.nskip) then
s=s + x(i)
sq=sq + x(i)**2
ns=ns+1

View File

@ -12,8 +12,8 @@ subroutine calibrate(data_dir,iz,a,b,rms,sigmaa,sigmab,irc)
real*8 fd(NZ),deltaf(NZ),r(NZ),rmsd(NZ)
integer nn(NZ)
infile=trim(data_dir)//'/'//'fmt.all'
outfile=trim(data_dir)//'/'//'fcal2.out'
infile=trim(data_dir)//'fmt.all'
outfile=trim(data_dir)//'fcal2.out'
open(10,file=trim(infile),status='old',err=996)
open(12,file=trim(outfile),status='unknown',err=997)

View File

@ -34,9 +34,7 @@ subroutine chkcall(w,bc,cok)
! One of first two characters (c1 or c2) must be a letter
if((.not.isletter(bc(1:1))) .and. (.not.isletter(bc(2:2)))) go to 100
! Real calls don't start with Q, but we'll allow the placeholder
! callsign QU1RK to be considered a standard call:
if(bc(1:1).eq.'Q' .and. bc(1:5).ne.'QU1RK') go to 100
if(bc(1:1).eq.'Q') go to 100 !Calls don't start with Q
! Must have a digit in 2nd or 3rd position
i1=0

View File

@ -1,51 +0,0 @@
subroutine echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,fpeak,snr_detect)
parameter (NZ=4096)
real sa(NZ)
real sb(NZ)
real blue(NZ)
real red(NZ)
integer ipkv(1)
equivalence (ipk,ipkv)
df=12000.0/32768.0
wh=0.5*fspread+10.0
i1=nint((1500.0 - 2.0*wh)/df) - 2048
i2=nint((1500.0 - wh)/df) - 2048
i3=nint((1500.0 + wh)/df) - 2048
i4=nint((1500.0 + 2.0*wh)/df) - 2048
! call pctile(sb(i1),i2-i1,50,r0)
! call pctile(sb(i3+1),i4-i3,50,r1)
! ave=0.5*(r0+r1)
! blue=sa/ave
! red=sb/ave
baseline=(sum(sb(i1:i2-1)) + sum(sb(i3+1:i4)))/(i2+i4-i1-i3)
blue=sa/baseline
red=sb/baseline
psig=sum(red(i2:i3)-1.0)
pnoise_2500 = 2500.0/df
snrdb=db(psig/pnoise_2500)
smax=0.
mh=max(1,nint(0.2*fspread/df))
do i=i2,i3
ssum=sum(red(i-mh:i+mh))
if(ssum.gt.smax) then
smax=ssum
ipk=i
endif
enddo
fpeak=ipk*df - 750.0
call averms(red(i1:i2-1),i2-i1,-1,ave1,rms1)
call averms(red(i3+1:i4),i4-i3,-1,ave2,rms2)
perr=0.707*(rms1+rms2)*sqrt(float(i2-i1+i4-i3))
snr_detect=psig/perr
db_err=99.0
if(psig.gt.perr) db_err=snrdb - db((psig-perr)/pnoise_2500)
if(db_err.lt.0.5) db_err=0.5
return
end subroutine echo_snr

View File

@ -21,7 +21,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
use fftw3
parameter (NPMAX=2100) !Max numberf of stored plans
parameter (NSMALL=16385) !Max half complex size of "small" FFTs
parameter (NSMALL=16384) !Max size of "small" FFTs
complex a(nfft) !Array to be transformed
complex aa(NSMALL) !Local copy of "small" a()
integer nn(NPMAX),ns(NPMAX),nf(NPMAX) !Params of stored plans
@ -67,7 +67,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
if(nfft.le.NSMALL) then
jz=nfft
if(iform.le.0) jz=nfft/2+1
if(iform.eq.0) jz=nfft/2
aa(1:jz)=a(1:jz)
endif
@ -87,7 +87,7 @@ subroutine four2a(a,nfft,ndim,isign,iform)
if(nfft.le.NSMALL) then
jz=nfft
if(iform.le.0) jz=nfft/2+1
if(iform.eq.0) jz=nfft/2
a(1:jz)=aa(1:jz)
endif
end if

View File

@ -1,161 +0,0 @@
program chkdec
parameter(NMAX=100)
character*88 line
character*37 msg(NMAX),msg0,msg1
character*2 c2(NMAX)
character*1 c1(NMAX)
character*1 only
integer nsnr(NMAX,0:1),nf(NMAX,0:1)
real dt(NMAX,0:1)
logical found,eof
! These files are sorted by freq within each Rx sequence
open(10,file='all.wsjtx',status='old')
open(11,file='all.jtdx',status='old')
write(20,1030)
1030 format(' iseq B w j W W+ J E B w j W', &
' W+ J E'/80('-'))
nutc0=-1
nbt=0 !Both
nwt=0 !WSJT-X only
njt=0 !JTDX only
net=0 !Either
n7t=0 !a7
eof=.false.
do iseq=1,9999
j=0
msg=' '
nsnr=-99
nf=-99
dt=-99
c1=' '
c2=' '
do i=1,NMAX
read(10,'(a88)',end=8) line !Read from the WSJT-X file
if(line(25:30).ne.'Rx FT8') cycle !Ignore any line not an FT8 decode
read(line(8:13),*) nutc
if(nutc0.lt.0) nutc0=nutc !First time only
if(nutc.ne.nutc0) then
backspace(10)
go to 10 !Finished WSJT-X for this sequence
endif
j=j+1
if(j.eq.1) then
nf(j,0)=-1
j=j+1
endif
read(line,1001) nsnr(j,0),dt(j,0),nf(j,0),msg(j),c2(j)
1001 format(30x,i7,f5.1,i5,1x,a36,2x,a2)
! if(nutc.eq.180215 .and. c2(j).eq.'a7') print*,'aaa',j,nf(j,0),c2(j)
nutc0=nutc
enddo ! i
8 eof=.true.
10 jz=j
do i=1,NMAX
read(11,'(a88)',end=20) line !Read from the JTDX file
if(line(31:31).ne.'~') cycle !Ignore any line not an FT8 decode
read(line(10:15),*) nutc
if(nutc.ne.nutc0) then
backspace(11)
go to 20 !Finished JTDX for this sequence
endif
msg1=line(33:58)
read(line(25:29),*) nf1
found=.false.
do j=1,jz
if(msg(j).eq.msg1) then
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
1002 format(15x,i4,f5.1,i5,29x,a1)
found=.true.
exit
endif
i1=index(msg(j),'<')
if(i1.gt.0) then
i2=index(msg(j),'>')
msg0=msg(j)(1:i1-1)//msg(j)(i1+1:i2-1)//msg(j)(i2+1:)
if(msg0.eq.msg1) then
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
found=.true.
exit
endif
endif
enddo ! j
if(.not.found) then !Insert this one as a new message
do j=1,jz
if(nf1.ge.nf(j,0) .and. nf1.lt.nf(j+1,0)) then
jj=j+1
exit
endif
enddo
do j=jz+1,jj+1,-1
nsnr(j,0)=nsnr(j-1,0)
dt(j,0)=dt(j-1,0)
nf(j,0)=nf(j-1,0)
msg(j)=msg(j-1)
c1(j)=c1(j-1)
c2(j)=c2(j-1)
enddo ! j
read(line,1004) nsnr(jj,1),dt(jj,1),nf(jj,1),msg(jj),c1(jj)
1004 format(15x,i4,f5.1,i5,3x,a26,a1)
c2(jj)=' '
nsnr(jj,0)=-99
dt(jj,0)=-99.0
nf(jj,0)=-99
jz=jz+1
endif
enddo ! i
20 nb=0
nw=0
nj=0
ne=0
n7=0
do j=2,jz
write(line,1020) nutc0,j,nsnr(j,:),dt(j,:),nf(j,:),msg(j)(1:26), &
c2(j),c1(j)
1020 format(i6.6,i3,1x,2i4,1x,2f6.1,1x,2i5,1x,a26,1x,a2,1x,a1)
if(c2(j).eq.'a7') n7=n7+1
only=' '
if(line(12:14).eq.'-99') then
line(12:14)=' '
only='j'
nj=nj+1
! if(c2(j).eq.'a7') print*,'aaa ',trim(line)
endif
if(line(16:18).eq.'-99') then
line(16:18)=' '
only='w'
nw=nw+1
endif
if(line(12:14).ne.' ' .or. line(16:19).ne.' ') ne=ne+1
if(line(12:14).ne.' ' .and. line(16:19).ne.' ') nb=nb+1
if(line(21:25).eq.'-99.0') line(21:25)=' '
if(line(27:31).eq.'-99.0') line(27:31)=' '
if(line(35:37).eq.'-99') line(35:37)=' '
if(line(40:42).eq.'-99') line(40:42)=' '
! if(line(12:14).ne.' ') nw=nw+1
! if(line(16:18).ne.' ') nj=nj+1
write(*,'(a74,1x,a1)') line(1:74),only
enddo ! j
nbt=nbt+nb
nwt=nwt+nw
n7t=n7t+n7
njt=njt+nj
net=net+ne
nutc0=nutc
write(*,*)
write(20,1031) iseq,nb,nw,nj,nb+nw-n7,nb+nw,nb+nj,ne,nbt,nwt,njt, &
nbt+nwt-n7t,nbt+nwt,nbt+njt,net
1031 format(i5,2x,7i4,2x,7i6)
if(eof) exit
! if(iseq.eq.2) exit
enddo ! iseq
end program chkdec

View File

@ -1,378 +0,0 @@
module ft8_a7
parameter(MAXDEC=100)
! For the following three arrays
! First index i=decode number in this sequence
! Second index j=0 or 1 for even or odd sequence
! Third index k=0 or 1 for previous or current tally for this j
real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k)
real f0(MAXDEC,0:1,0:1) !f0(i,j,k)
character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k)
integer itone_a7(79)
integer jseq !even=0, odd=1
integer ndec(0:1,0:1) !ndec(j,k)
data ndec/4*0/,jseq/0/
contains
subroutine ft8_a7_save(nutc,dt,f,msg)
use packjt77
character*37 msg,msg1
character*13 w(19)
character*4 g4
integer nw(19)
logical isgrid4
! Statement function:
isgrid4(g4)=(len_trim(g4).eq.4 .and. &
ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. &
ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. &
ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. &
ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9'))
if(index(msg,'/').ge.1 .or. index(msg,'<').ge.1) go to 999
call split77(msg,nwords,nw,w) !Parse msg into words
if(nwords.lt.1) go to 999
if(w(1)(1:3).eq.'CQ_') go to 999
j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence
jseq=j
! Add this decode to current table for this sequence
ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence
i=ndec(j,1) !i is index of a new table entry
if(i.ge.MAXDEC-1) return !Prevent table overflow
dt0(i,j,1)=dt !Save dt in table
f0(i,j,1)=f !Save f in table
msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2"
if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then
msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2"
endif
msg1=msg0(i,j,1) !Message without grid
nn=len(trim(msg1)) !Message length without grid
! Include grid as part of message
if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords))
! If a transmission at this frequency with message fragment "call_1 call_2"
! was decoded in the previous sequence, flag it as "DO NOT USE" because
! we have already decoded and subtracted that station's next transmission.
call split77(msg0(i,j,1),nwords,nw,w) !Parse msg into words
do i=1,ndec(j,0)
if(f0(i,j,0).le.-98.0) cycle
i2=index(msg0(i,j,0),' '//trim(w(2)))
if(abs(f-f0(i,j,0)).le.3.0 .and. i2.ge.3) then
f0(i,j,0)=-98.0 !Flag as "do not use" for a potential a7 decode
endif
enddo
999 return
end subroutine ft8_a7_save
subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors,dmin, &
msg37,xsnr)
! Examine the raw data in dd0() for possible "a7" decodes.
use crc
use timer_module, only: timer
use packjt77
include 'ft8_params.f90'
parameter(NP2=2812)
character*37 msg37,msg,msgsent,msgbest
character*12 call_1,call_2
character*4 grid4
real a(5)
real s8(0:7,NN)
real s2(0:511)
real dmm(206)
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols
real dd0(15*12000)
real ss(9)
real rcw(174)
integer*1 cw(174)
integer*1 msgbits(77)
integer*1 nxor(174),hdec(174)
integer itone(NN)
integer icos7(0:6),ip(1)
logical one(0:511,0:8)
integer graymap(0:7)
integer iloc(1)
complex cd0(0:3199)
complex ctwk(32)
complex csymb(32)
complex cs(0:7,NN)
logical std_1,std_2
logical first,newdat
data icos7/3,1,4,0,6,5,2/ !Sync array
data first/.true./
data graymap/0,1,3,2,5,6,4,7/
save one
if(first) then
one=.false.
do i=0,511
do j=0,8
if(iand(i,2**j).ne.0) one(i,j)=.true.
enddo
enddo
first=.false.
endif
call stdcall(call_1,std_1)
if(call_1(1:3).eq.'CQ ') std_1=.true.
call stdcall(call_2,std_2)
fs2=12000.0/NDOWN
dt2=1.0/fs2
twopi=8.0*atan(1.0)
delfbest=0.
ibest=0
call timer('ft8_down',0)
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
smax=0.0
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
call sync8d(cd0,idt,ctwk,0,sync) !NB: ctwk not used here
if(sync.gt.smax) then
smax=sync
ibest=idt
endif
enddo
! Peak up in frequency
smax=0.0
do ifr=-5,5 !Search over +/- 2.5 Hz
delf=ifr*0.5
dphi=twopi*delf*dt2
phi=0.0
do i=1,32
ctwk(i)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
enddo
call sync8d(cd0,ibest,ctwk,1,sync)
if( sync .gt. smax ) then
smax=sync
delfbest=delf
endif
enddo
a=0.0
a(1)=-delfbest
call twkfreq1(cd0,NP2,fs2,a,cd0)
f1=f1+delfbest !Improved estimate of DF
call timer('ft8_down',0)
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
smax=0.0
do idt=-4,4 !Search over +/- one quarter symbol
call sync8d(cd0,ibest+idt,ctwk,0,sync)
ss(idt+5)=sync
enddo
smax=maxval(ss)
iloc=maxloc(ss)
ibest=iloc(1)-5+ibest
xdt=(ibest-1)*dt2 - 0.5
sync=smax
do k=1,NN
i1=ibest+(k-1)*32
csymb=cmplx(0.0,0.0)
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
call four2a(csymb,32,1,-1,1)
cs(0:7,k)=csymb(1:8)/1e3
s8(0:7,k)=abs(csymb(1:8))
enddo
! sync quality check
is1=0
is2=0
is3=0
do k=1,7
ip=maxloc(s8(:,k))
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
ip=maxloc(s8(:,k+36))
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
ip=maxloc(s8(:,k+72))
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
enddo
! hard sync sum - max is 21
nsync=is1+is2+is3
! if(nsync .le. 6) return ! bail out
do nsym=1,3
nt=2**(3*nsym)
do ihalf=1,2
do k=1,29,nsym
if(ihalf.eq.1) ks=k+7
if(ihalf.eq.2) ks=k+43
amax=-1.0
do i=0,nt-1
i1=i/64
i2=iand(i,63)/8
i3=iand(i,7)
if(nsym.eq.1) then
s2(i)=abs(cs(graymap(i3),ks))
elseif(nsym.eq.2) then
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
elseif(nsym.eq.3) then
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
else
print*,"Error - nsym must be 1, 2, or 3."
endif
enddo
i32=1+(k-1)*3+(ihalf-1)*87
if(nsym.eq.1) ibmax=2
if(nsym.eq.2) ibmax=5
if(nsym.eq.3) ibmax=8
do ib=0,ibmax
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
if(i32+ib .gt.174) cycle
if(nsym.eq.1) then
bmeta(i32+ib)=bm
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
if(den.gt.0.0) then
cm=bm/den
else ! erase it
cm=0.0
endif
bmetd(i32+ib)=cm
elseif(nsym.eq.2) then
bmetb(i32+ib)=bm
elseif(nsym.eq.3) then
bmetc(i32+ib)=bm
endif
enddo
enddo
enddo
enddo
call normalizebmet(bmeta,174)
call normalizebmet(bmetb,174)
call normalizebmet(bmetc,174)
call normalizebmet(bmetd,174)
scalefac=2.83
llra=scalefac*bmeta
llrb=scalefac*bmetb
llrc=scalefac*bmetc
llrd=scalefac*bmetd
! apmag=maxval(abs(llra))*1.01
MAXMSG=206
pbest=0.
dmin=1.e30
nharderrors=-1
do imsg=1,MAXMSG
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QU1RK '//trim(call_2)
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) then
msg='CQ '//trim(call_2)
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
endif
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
i3=-1
n3=-1
call genft8(msg,i3,n3,msgsent,msgbits,itone) !Source-encode this message
call encode174_91(msgbits,cw) !Get codeword for this message
rcw=2*cw-1
pow=0.0
do i=1,79
pow=pow+s8(itone(i),i)**2
enddo
hdec=0
where(llra.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
da=sum(nxor*abs(llra))
hdec=0
where(llrb.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dbb=sum(nxor*abs(llrb))
hdec=0
where(llrc.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dc=sum(nxor*abs(llrc))
hdec=0
where(llrd.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dd=sum(nxor*abs(llrd))
dm=min(da,dbb,dc,dd)
dmm(imsg)=dm
if(dm.lt.dmin) then
dmin=dm
msgbest=msgsent
pbest=pow
if(dm.eq.da) then
nharderrors=count((2*cw-1)*llra.lt.0.0)
else if(dm.eq.dbb) then
nharderrors=count((2*cw-1)*llrb.lt.0.0)
else if(dm.eq.dc) then
nharderrors=count((2*cw-1)*llrc.lt.0.0)
else if(dm.eq.dd) then
nharderrors=count((2*cw-1)*llrd.lt.0.0)
endif
endif
enddo ! imsg
iloc=minloc(dmm)
dmm(iloc(1))=1.e30
iloc=minloc(dmm)
dmin2=dmm(iloc(1))
xsnr=-24.
arg=pbest/xbase/3.0e6-1.0
if(arg.gt.0.0) xsnr=max(-24.0,db(arg)-27.0)
! write(41,3041) nharderrors,dmin,dmin2,dmin2/dmin,xsnr,trim(msgbest)
!3041 format(i3,2f7.1,f7.2,f7.1,1x,a)
if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1
msg37=msgbest
if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1
if(msg37(1:6).eq.'QU1RK ') nharderrors=-1
return
end subroutine ft8_a7d
end module ft8_a7

View File

@ -6,19 +6,20 @@ subroutine ft8apset(mycall12,hiscall12,ncontest,apsym,aph10)
character*13 hc13
character*10 c10
integer apsym(58),aph10(10)
logical nohiscall,unpk77_success,std
logical nohiscall,unpk77_success
apsym=0
apsym(1)=99
apsym(30)=99
aph10=0
aph10(1)=99
if(len(trim(mycall12)).lt.3) return
nohiscall=.false.
hiscall=hiscall12
if(len(trim(hiscall)).lt.3) then
hiscall='KA1ABC' !Use a dummy hiscall
hiscall=mycall12 ! use mycall for dummy hiscall - mycall won't be hashed.
nohiscall=.true.
else
hc13=hiscall
@ -33,9 +34,7 @@ subroutine ft8apset(mycall12,hiscall12,ncontest,apsym,aph10)
! Encode a dummy standard message: i3=1, 28 1 28 1 1 15
!
msg=trim(mycall12)//' '//trim(hiscall)//' RRR'
call stdcall(mycall12,std)
if(.not.std) msg='<'//trim(mycall12)//'> '//trim(hiscall)//' RRR'
msg=trim(mycall12)//' '//trim(hiscall)//' RRR'
i3=0
n3=0
call pack77(msg,i3,n3,c77)

View File

@ -1,261 +0,0 @@
subroutine ft8c(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, &
msg37,xsnr)
use crc
use timer_module, only: timer
use packjt77
include 'ft8_params.f90'
parameter(NP2=2812)
character*37 msg37,msg,msgsent,msgbest
character*12 call_1,call_2
character*4 grid4
real a(5)
real s8(0:7,NN)
real s2(0:511)
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols
real dd0(15*12000)
real ss(9)
real rcw(174)
integer*1 cw(174)
integer*1 msgbits(77)
integer*1 nxor(174),hdec(174)
integer itone(NN)
integer icos7(0:6),ip(1)
logical one(0:511,0:8)
integer graymap(0:7)
integer iloc(1)
complex cd0(0:3199)
complex ctwk(32)
complex csymb(32)
complex cs(0:7,NN)
logical std_1,std_2
logical first,newdat
data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array
data first/.true./
data graymap/0,1,3,2,5,6,4,7/
save one
if(first) then
one=.false.
do i=0,511
do j=0,8
if(iand(i,2**j).ne.0) one(i,j)=.true.
enddo
enddo
first=.false.
endif
call stdcall(call_1,std_1)
if(call_1(1:3).eq.'CQ ') std_1=.true.
call stdcall(call_2,std_2)
nharderrors=-1
fs2=12000.0/NDOWN
dt2=1.0/fs2
twopi=8.0*atan(1.0)
delfbest=0.
ibest=0
call timer('ft8_down',0)
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
smax=0.0
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
call sync8d(cd0,idt,ctwk,0,sync)
if(sync.gt.smax) then
smax=sync
ibest=idt
endif
enddo
! Now peak up in frequency
smax=0.0
do ifr=-5,5 !Search over +/- 2.5 Hz
delf=ifr*0.5
dphi=twopi*delf*dt2
phi=0.0
do i=1,32
ctwk(i)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
enddo
call sync8d(cd0,ibest,ctwk,1,sync)
if( sync .gt. smax ) then
smax=sync
delfbest=delf
endif
enddo
a=0.0
a(1)=-delfbest
call twkfreq1(cd0,NP2,fs2,a,cd0)
f1=f1+delfbest !Improved estimate of DF
call timer('ft8_down',0)
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
smax=0.0
do idt=-4,4 !Search over +/- one quarter symbol
call sync8d(cd0,ibest+idt,ctwk,0,sync)
ss(idt+5)=sync
enddo
smax=maxval(ss)
iloc=maxloc(ss)
ibest=iloc(1)-5+ibest
xdt=(ibest-1)*dt2 - 0.5
sync=smax
do k=1,NN
i1=ibest+(k-1)*32
csymb=cmplx(0.0,0.0)
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
call four2a(csymb,32,1,-1,1)
cs(0:7,k)=csymb(1:8)/1e3
s8(0:7,k)=abs(csymb(1:8))
enddo
! sync quality check
is1=0
is2=0
is3=0
do k=1,7
ip=maxloc(s8(:,k))
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
ip=maxloc(s8(:,k+36))
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
ip=maxloc(s8(:,k+72))
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
enddo
! hard sync sum - max is 21
nsync=is1+is2+is3
! if(nsync .le. 6) return ! bail out
do nsym=1,3
nt=2**(3*nsym)
do ihalf=1,2
do k=1,29,nsym
if(ihalf.eq.1) ks=k+7
if(ihalf.eq.2) ks=k+43
amax=-1.0
do i=0,nt-1
i1=i/64
i2=iand(i,63)/8
i3=iand(i,7)
if(nsym.eq.1) then
s2(i)=abs(cs(graymap(i3),ks))
elseif(nsym.eq.2) then
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
elseif(nsym.eq.3) then
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
else
print*,"Error - nsym must be 1, 2, or 3."
endif
enddo
i32=1+(k-1)*3+(ihalf-1)*87
if(nsym.eq.1) ibmax=2
if(nsym.eq.2) ibmax=5
if(nsym.eq.3) ibmax=8
do ib=0,ibmax
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
if(i32+ib .gt.174) cycle
if(nsym.eq.1) then
bmeta(i32+ib)=bm
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
if(den.gt.0.0) then
cm=bm/den
else ! erase it
cm=0.0
endif
bmetd(i32+ib)=cm
elseif(nsym.eq.2) then
bmetb(i32+ib)=bm
elseif(nsym.eq.3) then
bmetc(i32+ib)=bm
endif
enddo
enddo
enddo
enddo
call normalizebmet(bmeta,174)
call normalizebmet(bmetb,174)
call normalizebmet(bmetc,174)
call normalizebmet(bmetd,174)
scalefac=2.83
llra=scalefac*bmeta
llrb=scalefac*bmetb
llrc=scalefac*bmetc
llrd=scalefac*bmetd
! apmag=maxval(abs(llra))*1.01
MAXMSG=206
pbest=0.
do imsg=1,MAXMSG
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2)
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) then
msg='CQ '//trim(call_2)
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
endif
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
! Source-encode, then get codeword
i3=-1
n3=-1
call genft8(msg,i3,n3,msgsent,msgbits,itone)
call encode174_91(msgbits,cw)
rcw=2*cw-1
pa=sum(llra*rcw)
pb=sum(llrb*rcw)
pc=sum(llrc*rcw)
pd=sum(llrd*rcw)
if(pa.gt.pbest) then
pbest=pa
msgbest=msgsent
llrbest=llra
nharderrors=count((2*cw-1)*llra.lt.0.0)
hdec=0
where(llra.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dmin=sum(nxor*abs(llra))
endif
enddo ! imsg
! write(*,4001) pbest,nharderrors,dmin,trim(msgbest)
!4001 format('$$$',f7.1,i4,f7.1,2x,a)
msg37=msgbest
return
end subroutine ft8c

View File

@ -1,109 +0,0 @@
subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr)
! Get q3-style decodes for FT8.
use packjt77
parameter(NN=79,NSPS=32)
parameter(NWAVE=NN*NSPS) !2528
parameter(NZ=3200,NLAGS=NZ-NWAVE)
character*12 call_1,call_2
character*4 grid4
character*37 msg,msgbest,msgsent
character c77*77
complex cwave(0:NWAVE-1)
complex cd(0:NZ-1)
complex z
real xjunk(NWAVE)
real ccf(0:NLAGS-1)
real ccfmsg(206)
integer itone(NN)
integer*1 msgbits(77)
logical std_1,std_2
if(xdt.eq.-99.0) return !Silence compiler warning
call stdcall(call_1,std_1)
call stdcall(call_2,std_2)
fs=200.0 !Sample rate (Hz)
dt=1.0/fs !Sample interval (s)
bt=2.0
ccfbest=0.
lagbest=-1
do imsg=1,206
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) msg='CQ '//trim(call_2)//' '//grid4
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7 .and. i.le.206) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
! Source-encode, then get itone()
i3=-1
n3=-1
call pack77(msg,i3,n3,c77)
call genft8(msg,i3,n3,msgsent,msgbits,itone)
! Generate complex cwave
call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE)
lagmax=-1
ccfmax=0.
nsum=32*2
do lag=0,nlags-1
z=0.
s=0.
do i=0,NWAVE-1
z=z + cd(i+lag)*conjg(cwave(i))
if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then
s=s + abs(z)
z=0.
endif
enddo
ccf(lag)=s
if(ccf(lag).gt.ccfmax) then
ccfmax=ccf(lag)
lagmax=lag
endif
enddo ! lag
ccfmsg(imsg)=ccfmax
if(ccfmax.gt.ccfbest) then
ccfbest=ccfmax
lagbest=lagmax
msgbest=msg
endif
enddo ! imsg
call pctile(ccfmsg,207,50,base)
call pctile(ccfmsg,207,67,sigma)
sigma=sigma-base
ccfmsg=(ccfmsg-base)/sigma
! do imsg=1,207
! write(44,3044) imsg,ccfmsg(imsg)
!3044 format(i5,f10.3)
! enddo
snr=maxval(ccfmsg)
return
end subroutine ft8q3

View File

@ -9,12 +9,11 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
real pulse(23040)
real dphi(0:(nsym+2)*nsps-1)
integer itone(nsym)
data fchk0/0.0/
save pulse,twopi,dt,hmod,fchk0,ctab
data ibt0/0/
save pulse,twopi,dt,hmod,ibt0,ctab
ibt=nint(10*bt)
fchk=nsym+nsps+bt+fsample
if(fchk.ne.fchk0) then
if(ibt0.ne.ibt) then
twopi=8.0*atan(1.0)
dt=1.0/fsample
hmod=1.0
@ -23,11 +22,11 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
tt=(i-1.5*nsps)/real(nsps)
pulse(i)=gfsk_pulse(bt,tt)
enddo
ibt0=nint(10*bt)
do i=0,NTAB-1
phi=i*twopi/NTAB
ctab(i)=cmplx(cos(phi),sin(phi))
enddo
fchk0=fchk
endif
! Compute the smoothed frequency waveform.

View File

@ -58,8 +58,6 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt)
sq0=sqf(0) !Do the subtraction with idt=0
endif
dd0=dd !Return dd0 with this signal subtracted
! write(44,3044) nint(f0),dt-0.5,1.e-8*sum(dd*dd)
!3044 format(i4,f7.2,f10.6)
return
contains

View File

@ -1,41 +0,0 @@
program test_ft8q3
! Test q3-style decodes for FT8.
use packjt77
parameter(NN=79,NSPS=32)
parameter(NWAVE=NN*NSPS) !2528
parameter(NZ=3200,NLAGS=NZ-NWAVE)
character arg*12
character*37 msg
character*12 call_1,call_2
character*4 grid4
complex cd(0:NZ-1)
! Get command-line argument(s)
nargs=iargc()
if(nargs.ne.4 .and. nargs.ne.5) then
print*,'Usage: ft8q3 DT f0 call_1 call_2 [grid4]'
go to 999
endif
call getarg(1,arg)
read(arg,*) xdt !Time offset from nominal (s)
call getarg(2,arg)
read(arg,*) f0 !Frequency (Hz)
call getarg(3,call_1) !First callsign
call getarg(4,call_2) !Second callsign
grid4=' '
if(nargs.eq.5) call getarg(5,grid4) !Locator for call_2
do i=0,NZ-1
read(40,3040) cd(i)
3040 format(17x,2f10.3)
enddo
call sec0(0,t)
call ft8q3(cd,xdt,f0,call_1,call_2,grid4,msg,snr)
call sec0(1,t)
write(*,1100) t,snr,trim(msg)
1100 format('Time:',f6.2,' S/N:',f6.1,' msg: ',a)
999 end program test_ft8q3

View File

@ -38,7 +38,6 @@ contains
use iso_c_binding, only: c_bool, c_int
use timer_module, only: timer
use shmem, only: shmem_lock, shmem_unlock
use ft8_a7
include 'ft8/ft8_params.f90'
@ -54,8 +53,7 @@ contains
logical newdat,lsubtract,ldupe,lrefinedt
logical*1 ldiskdat
logical lsubtracted(MAX_EARLY)
character*12 mycall12,hiscall12,call_1,call_2
character*4 grid4
character*12 mycall12,hiscall12
integer*2 iwave(15*12000)
integer apsym2(58),aph10(10)
character datetime*13,msg37*37
@ -66,33 +64,13 @@ contains
integer itone_save(NN,MAX_EARLY)
real f1_save(MAX_EARLY)
real xdt_save(MAX_EARLY)
data nutc0/-1/
save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,&
allmessages
save s,dd,dd1,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,allmessages
this%callback => callback
write(datetime,1001) nutc !### TEMPORARY ###
1001 format("000000_",i6.6)
if(nutc0.eq.-1) then
msg0=' '
dt0=0.
f0=0.
endif
if(nutc.ne.nutc0) then
! New UTC. Move previously saved 'a7' data from k=1 to k=0
iz=ndec(jseq,1)
dt0(1:iz,jseq,0) = dt0(1:iz,jseq,1)
f0(1:iz,jseq,0) = f0(1:iz,jseq,1)
msg0(1:iz,jseq,0) = msg0(1:iz,jseq,1)
ndec(jseq,0)=iz
ndec(jseq,1)=0
nutc0=nutc
dt0(:,jseq,1)=0.
f0(:,jseq,1)=0.
endif
if(ndepth.eq.1 .and. nzhsym.lt.50) then
ndec_early=0
return
@ -200,7 +178,7 @@ contains
hiscall12,f1,xdt,xbase,apsym2,aph10,nharderrors,dmin, &
nbadcrc,iappass,msg37,xsnr,itone)
call timer('ft8b ',1)
nsnr=nint(xsnr)
nsnr=nint(xsnr)
xdt=xdt-0.5
hd=nharderrors+dmin
if(nbadcrc.eq.0) then
@ -220,11 +198,6 @@ contains
qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
if(emedelay.ne.0) xdt=xdt+2.0
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
! ii=ndec(jseq,1)
! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),&
! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22)
!3041 format(3i5,2x,a22,i5,2x,a22)
endif
endif
call timestamp(tsec,tseq,ctime)
@ -236,43 +209,7 @@ contains
800 ndec_early=0
if(nzhsym.lt.50) ndec_early=ndecodes
900 continue
if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then
newdat=.true.
do i=1,ndec(jseq,0)
if(f0(i,jseq,0).eq.-99.0) exit
if(f0(i,jseq,0).eq.-98.0) cycle
if(index(msg0(i,jseq,0),'<').ge.1) cycle !### Temporary ###
msg37=msg0(i,jseq,0)
i1=index(msg37,' ')
i2=index(msg37(i1+1:),' ') + i1
call_1=msg37(1:i1-1)
call_2=msg37(i1+1:i2-1)
grid4=msg37(i2+1:i2+4)
if(grid4.eq.'RR73' .or. index(grid4,'+').gt.0 .or. &
index(grid4,'-').gt.0) grid4=' '
xdt=dt0(i,jseq,0)
f1=f0(i,jseq,0)
xbase=10.0**(0.1*(sbase(max(1,nint(f1/3.125)))-40.0))
msg37=' '
call timer('ft8_a7d ',0)
call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors, &
dmin,msg37,xsnr)
call timer('ft8_a7d ',1)
if(nharderrors.ge.0) then
if(associated(this%callback)) then
nsnr=xsnr
iaptype=7
qual=1.0
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
endif
endif
enddo
endif
return
900 return
end subroutine decode
subroutine timestamp(tsec,tseq,ctime)

View File

@ -1,10 +1,9 @@
subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
subroutine gen65(msg0,ichk,msgsent,itone,itype)
! Encodes a JT65 message to yieild itone(1:126)
! Temporarily, does not implement EME shorthands
use packjt
character*1 msg00(23),msgsent0(23)
character*22 msg0
character*22 message !Message to be generated
character*22 msgsent !Message as it will be received
@ -22,10 +21,6 @@ subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
1,1,1,1,1,1/
save
do i=1,22
msg0(i:i)=msg00(i)
enddo
if(msg0(1:1).eq.'@') then
read(msg0(2:5),*,end=1,err=1) nfreq
go to 2
@ -53,7 +48,7 @@ subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
call unpackmsg(dgen,msgsent) !Unpack to get message sent
msgsent(20:22)=cok
call fmtmsg(msgsent,iz)
if(ichk.ne.0) go to 900 !Return if checking only
if(ichk.ne.0) go to 999 !Return if checking only
call rs_encode(dgen,sent) !Apply Reed-Solomon code
call interleave63(sent,1) !Apply interleaving
@ -84,10 +79,5 @@ subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
endif
endif
900 do i=1,22
msgsent0(i)=msgsent(i:i)
enddo
msgsent0(23)=char(0)
return
999 return
end subroutine gen65

View File

@ -3,8 +3,7 @@ subroutine grid2deg(grid0,dlong,dlat)
! Converts Maidenhead grid locator to degrees of West longitude
! and North latitude.
character*(*) grid0
character*6 grid
character*6 grid0,grid
character*1 g1,g2,g3,g4,g5,g6
grid=grid0

View File

@ -20,7 +20,7 @@ subroutine hspec(id2,k,nutc0,ntrpdepth,nrxfreq,ntol,bmsk144, &
parameter (JZ=703)
character*80 line1
character*(*) datadir
character*512 datadir
character*12 mycall,hiscall
integer*2 id2(0:120*12000-1)
logical*1 bmsk144,bshmsg,btrain,bswl

View File

@ -162,7 +162,6 @@ contains
ib=min(NSZ,nint((nfb+100)/df))
nz=ib-ia+1
if(nz.lt.50) go to 900
if(isnan(sum(savg(ia:ia+nz-1)))) go to 900
call lorentzian(savg(ia),nz,a)
baseline=a(1)
amp=a(2)

View File

@ -55,8 +55,7 @@ subroutine jt9a()
if(.not.ok) call abort
call flush(6)
call timer('decoder ',0)
if(local_params%nmode.eq.8 .and. local_params%ndiskdat .and. &
.not. local_params%nagain) then
if(local_params%nmode.eq.8 .and. local_params%ndiskdat) then
! Early decoding pass, FT8 only, when wsjtx reads from disk
nearly=41
local_params%nzhsym=nearly

View File

@ -1,19 +1,20 @@
subroutine makepings(pings,nTRperiod,npts,width,sig)
subroutine makepings(pings,npts,width,sig)
real pings(npts)
real*8 t
real t0(29)
real t0(14)
iping0=-999
dt=1.0/12000.0
do i=1,nTRperiod-1
do i=1,14
t0(i)=i !Make pings at t=1, 2, ... 14 s.
enddo
amp=sig
do i=1,npts
iping=min(max(1,i/12000),nTRperiod-1)
iping=min(max(1,i/12000),14)
t=(i*dt-t0(iping))/width
if(t.lt.0.d0 .or. t.gt.10.0) then
if(t.lt.0.d0 .and. t.lt.10.0) then !????
fac=0.
else
fac=2.718*t*dexp(-t)

View File

@ -9,7 +9,7 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
character*8 date
character*10 time
character*5 zone
character*(*) datadir
character*512 datadir
complex cframe(864)
complex cross(864)
@ -191,7 +191,9 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
write(pcoeff_filename,'(i2.2,i2.2,i2.2,"_",i2.2,i2.2,i2.2)') &
values(1)-2000,values(2),values(3),values(5),values(6),values(7)
pcoeff_filename=trim(trained_dxcall)//"_"//trim(pcoeff_filename)//".pcoeff"
pcoeff_filename=datadir//'/'//trim(pcoeff_filename)
l1=index(datadir,char(0))-1
datadir(l1+1:l1+1)="/"
pcoeff_filename=datadir(1:l1+1)//trim(pcoeff_filename)
!write(*,*) 'trained - writing coefficients to: ',pcoeff_filename
open(17,file=pcoeff_filename,status='new')
write(17,'(i4,2f10.2,3i5,5e25.16)') navg,sqrt(chisqr),rmsdiff,NFREQLOW,NFREQHIGH,nterms,a

View File

@ -1,7 +1,7 @@
program msk144sim
use wavhdr
parameter (NMAX=30*12000)
parameter (NMAX=15*12000)
real pings(0:NMAX-1)
real waveform(0:NMAX-1)
character arg*8,msg*37,msgsent*37,fname*40
@ -12,28 +12,25 @@ program msk144sim
integer itone(144) !Message bits
nargs=iargc()
if(nargs.ne.6) then
print*,'Usage: msk144sim message TRp freq width snr nfiles'
print*,'Example: msk144sim "K1ABC W9XYZ EN37" 15 1500 0.12 2 1'
print*,' msk144sim "K1ABC W9XYZ EN37" 30 1500 2.5 15 1'
if(nargs.ne.5) then
print*,'Usage: msk144sim message freq width snr nfiles'
print*,'Example: msk144sim "K1ABC W9XYZ EN37" 1500 0.12 2 1'
print*,' msk144sim "K1ABC W9XYZ EN37" 1500 2.5 15 1'
go to 999
endif
call getarg(1,msg)
call getarg(2,arg)
read(arg,*) nTRperiod
call getarg(3,arg)
read(arg,*) freq
call getarg(4,arg)
call getarg(3,arg)
read(arg,*) width
call getarg(5,arg)
call getarg(4,arg)
read(arg,*) snrdb
call getarg(6,arg)
call getarg(5,arg)
read(arg,*) nfiles
!sig is the peak amplitude of the ping.
sig=sqrt(2.0)*10.0**(0.05*snrdb)
npts=nTRperiod*12000
h=default_header(12000,npts)
h=default_header(12000,NMAX)
i1=len(trim(msg))-5
ichk=0
itype=1
@ -58,7 +55,7 @@ program msk144sim
dphi1=twopi*(freq+0.25d0*baud)/12000.d0
phi=0.0
k=0
nreps=npts/(nsym*nsps)
nreps=NMAX/(nsym*nsps)
do jrep=1,nreps
do i=1,nsym
@ -80,7 +77,7 @@ program msk144sim
go to 999
endif
call makepings(pings,nTRperiod,npts,width,sig)
call makepings(pings,NMAX,width,sig)
! call sgran()
do ifile=1,nfiles !Loop over requested number of files
@ -91,14 +88,13 @@ program msk144sim
wave=0.0
iwave=0
fac=sqrt(6000.0/2500.0)
do i=0,npts-1
do i=0,NMAX-1
xx=gran()
wave(i)=pings(i)*waveform(i) + fac*xx
iwave(i)=30.0*wave(i)
enddo
write(10) h,iwave(0:npts-1) !Save the .wav file
endfile(10)
write(10) h,iwave !Save the .wav file
close(10)
enddo

Some files were not shown because too many files have changed in this diff Show More