Compare commits
317 Commits
wsjtx-2.5.
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
994e3f1c3d | ||
|
3c98c9df41 | ||
|
2e4a6c3c32 | ||
|
c296bca73a | ||
|
215208636c | ||
|
c60aa83aa5 | ||
|
8bd3dd65bb | ||
|
aa16455320 | ||
|
8e4f293127 | ||
|
af3e06144c | ||
|
a4792074e4 | ||
|
47a89bc2c9 | ||
|
fadda93f2f | ||
|
320ddc0338 | ||
|
5759f06d6d | ||
|
a5f963233b | ||
|
e5bf51abf6 | ||
|
e1fde92ea2 | ||
|
fffc88de69 | ||
|
f20687f9fb | ||
|
a1106aff46 | ||
|
cd0a0e6db4 | ||
|
c85ed8cc7d | ||
|
68a534221b | ||
|
d81a3d799c | ||
|
31696388b9 | ||
|
9d90ede3de | ||
|
dd384d0765 | ||
|
4545195a32 | ||
|
4822b94350 | ||
|
566d01aa23 | ||
|
da282209f1 | ||
|
f84ba8a0d0 | ||
|
1f575bbe67 | ||
|
8b767b4c75 | ||
|
599cf1b7d6 | ||
|
c97c53db89 | ||
|
9adb1c8256 | ||
|
bc635f0cd7 | ||
|
3caaf785bd | ||
|
951d17b20c | ||
|
0ef914fb5c | ||
|
345e539074 | ||
|
219c04f5a4 | ||
|
e575005291 | ||
|
6744bc5468 | ||
|
121091c14e | ||
|
3beeb06dec | ||
|
6ca7523adf | ||
|
f77eb1ddf8 | ||
|
bdf33b6ab3 | ||
|
b968fe2b76 | ||
|
14bf6d5ec1 | ||
|
43cd871413 | ||
|
014a8e5104 | ||
|
0aeee4cdf8 | ||
|
a3d57024d5 | ||
|
9667fd837b | ||
|
ba03e471bc | ||
|
372b43df26 | ||
|
0fa2cf2166 | ||
|
95282f062e | ||
|
c5fe615a7b | ||
|
d6299e8a78 | ||
|
d4beab04bf | ||
|
fa111e6e87 | ||
|
f1497fbabb | ||
|
4664aec597 | ||
|
53bb5268ca | ||
|
8164e27909 | ||
|
ce13ca8800 | ||
|
148066135e | ||
|
cac0ea44ea | ||
|
c7e7062b8a | ||
|
a6e6b91cee | ||
|
f5291f280e | ||
|
bbb280b4f3 | ||
|
b9b3d1d6f5 | ||
|
eef441ec87 | ||
|
855daf92c4 | ||
|
a469b67afb | ||
|
b100a11835 | ||
|
c073fefa74 | ||
|
062f3a8037 | ||
|
f5ec31d3a1 | ||
|
df502242f2 | ||
|
7cdd2da5d5 | ||
|
7d8d0b8b94 | ||
|
581ef8b6e5 | ||
|
87dcde7564 | ||
|
03b680dee5 | ||
|
3b361b6d24 | ||
|
d0dd88de40 | ||
|
64a124ff20 | ||
|
7021477e21 | ||
|
4331594e4a | ||
|
d1c7efb1aa | ||
|
1da80c0631 | ||
|
d45d0b6b8f | ||
|
ab72238132 | ||
|
cf27347656 | ||
|
400957af0c | ||
|
708342f40a | ||
|
afa020558f | ||
|
fc4a70cf9c | ||
|
9b8b604a8c | ||
|
36d11fc561 | ||
|
70959a9796 | ||
|
1930271350 | ||
|
6e344fdec8 | ||
|
a78f5d06c4 | ||
|
cb03c837d0 | ||
|
36e54bf3a0 | ||
|
2d906247d7 | ||
|
cf9233b650 | ||
|
55bc403f83 | ||
|
dd81db1e95 | ||
|
ec1e521ba7 | ||
|
8a6a8e8bdf | ||
|
1068988bf1 | ||
|
74ae5f98de | ||
|
30047ecfeb | ||
|
dbeec73e86 | ||
|
3a8991ab80 | ||
|
95f75c8e49 | ||
|
432a501bf6 | ||
|
e9f1cbf375 | ||
|
a9e29327b7 | ||
|
675a768de1 | ||
|
4fb06dda43 | ||
|
218479f093 | ||
|
f32f2393ea | ||
|
d399b172a4 | ||
|
b219b59296 | ||
|
2d3914eb2d | ||
|
c909eb0845 | ||
|
91a39dd0a1 | ||
|
6414a8624b | ||
|
b317ea241b | ||
|
f43c1e97ae | ||
|
3c3c450839 | ||
|
02961a2ccc | ||
|
c5b6a6ae45 | ||
|
1cee98162a | ||
|
4957face2f | ||
|
190dca5501 | ||
|
be2ce2a6c4 | ||
|
ffe8927a30 | ||
|
f3ee013e43 | ||
|
f47596b2eb | ||
|
d6208b43e2 | ||
|
ae217cb2d9 | ||
|
aa9cc8e885 | ||
|
edd7fadd5a | ||
|
aceac2ccb5 | ||
|
07ab7de018 | ||
|
653ea56a77 | ||
|
6ca1b14477 | ||
|
304a04328a | ||
|
db33624da1 | ||
|
f6c608b227 | ||
|
ab48d77d0f | ||
|
fd7caa8cd6 | ||
|
bc92cd54f3 | ||
|
f3e838cdc6 | ||
|
e366b0a6af | ||
|
48312bc620 | ||
|
6e193ab0e1 | ||
|
2c0d05e05d | ||
|
5668e74f61 | ||
|
f3bac687ba | ||
|
15e33d22af | ||
|
ceb13110c5 | ||
|
e732c5ba62 | ||
|
38e65b747a | ||
|
689b040cc5 | ||
|
9761c10648 | ||
|
04836a447d | ||
|
38174ed6dc | ||
|
d96a1a1173 | ||
|
c8574b5890 | ||
|
66d1497558 | ||
|
22b86544be | ||
|
b12b1dec39 | ||
|
e529ad8df9 | ||
|
114aeda3f8 | ||
|
e8c08c24a5 | ||
|
f180d30126 | ||
|
4e96e58d57 | ||
|
f26b1c424f | ||
|
658f23b813 | ||
|
bc9e8f89bc | ||
|
d6bcf9767a | ||
|
df445297d2 | ||
|
283d7d32e4 | ||
|
0b951a05e7 | ||
|
e081c15716 | ||
|
4e7d282980 | ||
|
c952bee07e | ||
|
1af4e46793 | ||
|
ce5ecaf99d | ||
|
7d66232ec7 | ||
|
5e9645091d | ||
|
16d97aad3b | ||
|
561240763c | ||
|
c5bc704342 | ||
|
33d3955086 | ||
|
5471cb3534 | ||
|
8e6f027c5e | ||
|
5e1795ff5c | ||
|
5dc70b18db | ||
|
2545103ba5 | ||
|
2e3cec2201 | ||
|
cab1bb8aed | ||
|
22b580af56 | ||
|
5b97226b33 | ||
|
7a6f0344da | ||
|
d023c80109 | ||
|
56414dda30 | ||
|
a9f895ca6b | ||
|
78cd7824ae | ||
|
1ca81f4610 | ||
|
d3020efdef | ||
|
540d16302e | ||
|
5118e64fde | ||
|
fd6ebff4d9 | ||
|
76a1dd3c44 | ||
|
9c58135868 | ||
|
0c98c2d2ff | ||
|
81b4659de9 | ||
|
b10aa136d4 | ||
|
1ff74b2cd5 | ||
|
0309b4f826 | ||
|
35df81a858 | ||
|
8545cdb96d | ||
|
fde103da2d | ||
|
194ad5c7b4 | ||
|
5c09e55351 | ||
|
5c1b7a8d8f | ||
|
c84aac0c62 | ||
|
12cbf366fe | ||
|
a3fa2cef88 | ||
|
4b6886cdd0 | ||
|
7081f9cf9b | ||
|
151f0f0ab3 | ||
|
47b5cc21f2 | ||
|
ea3a6b272a | ||
|
f7dd8a86a8 | ||
|
de2ba14ca0 | ||
|
6266b8d80e | ||
|
c26aa9160b | ||
|
fc40770960 | ||
|
3a765e3b12 | ||
|
947ab4eb25 | ||
|
fb4eb56508 | ||
|
11b23ae9cd | ||
|
39fecf92c9 | ||
|
9d7f323231 | ||
|
d992c9bbaf | ||
|
39b63f4190 | ||
|
9ffa81e59a | ||
|
96974e0537 | ||
|
b68e90ae88 | ||
|
ab89d70b6a | ||
|
3e49dfacc5 | ||
|
5797e51fe3 | ||
|
d774733636 | ||
|
500e565d77 | ||
|
99861082f2 | ||
|
a3dedc81de | ||
|
6b2df37137 | ||
|
98b3cd9a05 | ||
|
1a794c7ce9 | ||
|
82d9ae9629 | ||
|
d28164e92a | ||
|
e2f601a01c | ||
|
204672375b | ||
|
7e8a405dc6 | ||
|
b68c544ef7 | ||
|
d99c6adf4d | ||
|
69f9ec89d4 | ||
|
48baf47a88 | ||
|
53b280ea53 | ||
|
a12a72836a | ||
|
f66858a813 | ||
|
a91dbe87be | ||
|
77704621aa | ||
|
e1928f3206 | ||
|
adcc8c4bd7 | ||
|
43c0752140 | ||
|
3e43e57858 | ||
|
6020552473 | ||
|
c13407612e | ||
|
e93cd45d19 | ||
|
d541286ba2 | ||
|
f68a4bb1a1 | ||
|
21f8303511 | ||
|
669b3d972e | ||
|
9aa4786f11 | ||
|
4a68d3c4cf | ||
|
393265a0e0 | ||
|
5b406effcf | ||
|
77c532b1a3 | ||
|
8097f25c9c | ||
|
7e078c805f | ||
|
994e00c5d2 | ||
|
93ade73af7 | ||
|
c30b91cb69 | ||
|
f13e318204 | ||
|
48b1ad1e46 | ||
|
2b25c51169 | ||
|
5a0cb0f0a0 | ||
|
f51a7d4f7d | ||
|
901e9dbc38 | ||
|
384899754f | ||
|
0ed62e4f80 | ||
|
a5be2fb4ef |
@ -45,7 +45,7 @@ if (POLICY CMP0075)
|
||||
endif ()
|
||||
|
||||
project (wsjtx
|
||||
VERSION 2.5.2.0
|
||||
VERSION 2.6.0.0
|
||||
LANGUAGES C CXX Fortran
|
||||
)
|
||||
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
|
||||
@ -71,7 +71,7 @@ message (STATUS "******************************************************")
|
||||
|
||||
include (set_build_type)
|
||||
# RC 0 or omitted is a development build, GA is a General Availability release build
|
||||
set_build_type (RC GA)
|
||||
set_build_type (RC 2)
|
||||
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
|
||||
|
||||
#
|
||||
@ -126,7 +126,8 @@ 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
|
||||
@ -273,6 +274,7 @@ set (wsjtx_CXXSRCS
|
||||
widgets/about.cpp
|
||||
widgets/astro.cpp
|
||||
widgets/messageaveraging.cpp
|
||||
widgets/activeStations.cpp
|
||||
widgets/colorhighlighting.cpp
|
||||
WSPR/WsprTxScheduler.cpp
|
||||
widgets/mainwindow.cpp
|
||||
@ -336,6 +338,7 @@ 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
|
||||
@ -382,6 +385,7 @@ 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
|
||||
@ -460,7 +464,6 @@ 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
|
||||
@ -505,6 +508,7 @@ 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
|
||||
@ -539,6 +543,7 @@ 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
|
||||
@ -649,6 +654,7 @@ set (wsjtx_UISRCS
|
||||
widgets/echograph.ui
|
||||
widgets/fastgraph.ui
|
||||
widgets/messageaveraging.ui
|
||||
widgets/activeStations.ui
|
||||
widgets/widegraph.ui
|
||||
widgets/logqso.ui
|
||||
Configuration.ui
|
||||
@ -1126,6 +1132,9 @@ 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)
|
||||
|
||||
@ -1258,6 +1267,7 @@ set (LANGUAGES
|
||||
ja # Japanese
|
||||
#no # Norwegian
|
||||
#pt # Portuguese
|
||||
ru # Russian
|
||||
#sv # Swedish
|
||||
zh # Chinese
|
||||
zh_HK # Chinese per Hong Kong
|
||||
@ -1441,7 +1451,7 @@ set_target_properties (wsjtx PROPERTIES
|
||||
)
|
||||
|
||||
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
|
||||
if (APPLE)
|
||||
if ((NOT ${OPENMP_FOUND}) OR APPLE)
|
||||
target_link_libraries (wsjtx wsjt_fort)
|
||||
else ()
|
||||
target_link_libraries (wsjtx wsjt_fort_omp)
|
||||
|
@ -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,6 +593,7 @@ 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_;
|
||||
@ -645,6 +646,7 @@ private:
|
||||
bool TX_messages_;
|
||||
bool enable_VHF_features_;
|
||||
bool decode_at_52s_;
|
||||
bool Tune_watchdog_disabled_;
|
||||
bool single_decode_;
|
||||
bool twoPass_;
|
||||
bool bSpecialOp_;
|
||||
@ -670,6 +672,8 @@ private:
|
||||
bool bLowSidelobes_;
|
||||
bool pwrBandTxMemory_;
|
||||
bool pwrBandTuneMemory_;
|
||||
bool highlight_DXcall_;
|
||||
bool highlight_DXgrid_;
|
||||
|
||||
QAudioDeviceInfo audio_input_device_;
|
||||
QAudioDeviceInfo next_audio_input_device_;
|
||||
@ -750,6 +754,7 @@ 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_;}
|
||||
@ -787,6 +792,9 @@ 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)
|
||||
{
|
||||
@ -893,7 +901,7 @@ QString Configuration::Field_Day_Exchange() const
|
||||
{
|
||||
return m_->FD_exchange_;
|
||||
}
|
||||
|
||||
/*
|
||||
void Configuration::setEU_VHF_Contest()
|
||||
{
|
||||
m_->bSpecialOp_=true;
|
||||
@ -902,6 +910,7 @@ void Configuration::setEU_VHF_Contest()
|
||||
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::EU_VHF);
|
||||
m_->write_settings();
|
||||
}
|
||||
*/
|
||||
|
||||
QString Configuration::RTTY_Exchange() const
|
||||
{
|
||||
@ -920,6 +929,30 @@ 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)
|
||||
@ -984,6 +1017,7 @@ 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}
|
||||
@ -1122,6 +1156,7 @@ 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));
|
||||
|
||||
@ -1320,6 +1355,7 @@ 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_);
|
||||
@ -1397,7 +1433,10 @@ 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 ();
|
||||
}
|
||||
@ -1492,6 +1531,7 @@ 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_);
|
||||
|
||||
@ -1531,6 +1571,7 @@ 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 ();
|
||||
@ -1554,6 +1595,8 @@ 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 ()
|
||||
@ -1626,6 +1669,7 @@ 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_);
|
||||
@ -1662,6 +1706,7 @@ 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_);
|
||||
@ -1685,6 +1730,8 @@ 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 ();
|
||||
}
|
||||
|
||||
@ -2088,6 +2135,7 @@ 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 ();
|
||||
@ -2163,6 +2211,7 @@ 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_);
|
||||
|
||||
@ -2172,7 +2221,8 @@ 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
|
||||
}
|
||||
|
||||
|
@ -134,6 +134,7 @@ 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;
|
||||
@ -181,8 +182,14 @@ 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, FOX, HOUND};
|
||||
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, ARRL_DIGI, FOX, HOUND};
|
||||
SpecialOperatingActivity special_op_id () const;
|
||||
|
||||
struct CalibrationParams
|
||||
|
518
Configuration.ui
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>554</width>
|
||||
<height>560</height>
|
||||
<width>588</width>
|
||||
<height>642</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -171,46 +171,6 @@
|
||||
<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>&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 &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><html><head/><body><p>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.</p><p>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.</p></body></html></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>
|
||||
@ -285,6 +245,60 @@
|
||||
</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><html><head/><body><p>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.</p><p>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.</p></body></html></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>&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 &DXCC, grid, and worked-before status</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@ -489,6 +503,16 @@ 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><html><head/><body><p>Disable the Tune watchdog.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Disable Tune watchdog</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@ -2302,6 +2326,23 @@ 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">
|
||||
@ -2349,20 +2390,10 @@ Right click for insert and delete options.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="include_WAE_check_box">
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="highlight_73_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>
|
||||
<string>Highlight also messages with 73 or RR73</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -2483,78 +2514,10 @@ 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><html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html></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><html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html></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><html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html></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: Generation of FT4, FT8, and MSK144 messages</string>
|
||||
<string>Special operating activity</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
@ -2563,47 +2526,6 @@ 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><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></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><html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html></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">
|
||||
@ -2645,6 +2567,28 @@ 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><html><head/><body><p>North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.</p></body></html></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">
|
||||
@ -2658,74 +2602,24 @@ Right click for insert and delete options.</string>
|
||||
</property>
|
||||
</spacer>
|
||||
</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><html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></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><html><head/><body><p>ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>NJ</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="0" column="3">
|
||||
<widget class="QRadioButton" name="rbHound">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></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="3">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
|
||||
@ -2818,6 +2712,88 @@ 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><html><head/><body><p>FT Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></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><html><head/><body><p>FT Roundup and similar contests. Exchange is US state, Canadian province, or &quot;DX&quot;.</p></body></html></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><html><head/><body><p>ARRL International Digital Contest</p></body></html></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>
|
||||
@ -2993,6 +2969,74 @@ 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><html><head/><body><p>User-selectable parameters for JT65 VHF/UHF/Microwave decoding.</p></body></html></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><html><head/><body><p>Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).</p></body></html></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><html><head/><body><p>Higher levels will increase the probability of decoding, but will also increase probability of a false decode.</p></body></html></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">
|
||||
@ -3234,12 +3278,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>
|
||||
|
@ -13,25 +13,32 @@ namespace
|
||||
{
|
||||
QRegularExpression tokens_re {R"(
|
||||
^
|
||||
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)?
|
||||
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
|
||||
(?:
|
||||
(?<word1>
|
||||
(?:CQ|DE|QRZ)
|
||||
(?:\s?DX|\s
|
||||
(?:[A-Z]{1,4}|\d{3})
|
||||
(?:[A-Z]{1,4}|\d{3}) # directional CQ
|
||||
)
|
||||
| [A-Z0-9/]+
|
||||
|\.{3}
|
||||
| [A-Z0-9/]+ # DX call
|
||||
|\.{3} # unknown hash code
|
||||
)\s
|
||||
)
|
||||
(?:
|
||||
(?<word2>[A-Z0-9/]+)
|
||||
(?<word2>[A-Z0-9/]+) # DE call
|
||||
(?:\s
|
||||
(?<word3>[-+A-Z0-9]+)
|
||||
(?<word3>[-+A-Z0-9]+) # report
|
||||
(?:\s
|
||||
(?<word4>
|
||||
(?:OOO | (?!RR73)[A-R]{2}[0-9]{2})
|
||||
(?:
|
||||
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
|
||||
)?
|
||||
)?
|
||||
)?
|
||||
)?
|
||||
@ -48,13 +55,15 @@ DecodedText::DecodedText (QString const& the_string)
|
||||
, is_standard_ {false}
|
||||
{
|
||||
// discard appended AP info
|
||||
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?(?:a|q)[0-9].*$)"}, "\\1");
|
||||
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?[aq][0-9].*$)"}, "\\1");
|
||||
|
||||
// qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
|
||||
if (message_.length() >= 1)
|
||||
{
|
||||
message0_ = message_.left(36);
|
||||
message_ = message_.left(36).remove (QRegularExpression {"[<>]"});
|
||||
// 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 {"[<>]"});
|
||||
int i1 = message_.indexOf ('\r');
|
||||
if (i1 > 0)
|
||||
{
|
||||
@ -85,13 +94,13 @@ 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);
|
||||
auto res = tokens_re.match(t).capturedTexts();
|
||||
qDebug () << "captured texts:" << res;
|
||||
return res;
|
||||
return tokens_re.match(t).capturedTexts();
|
||||
}
|
||||
// simple word split for free text messages
|
||||
auto words = message_.split (' ', SkipEmptyParts);
|
||||
// add whole message as item 0 to mimic RE capture list
|
||||
// add whole message and two empty strings as item 0 & 1 to mimic RE
|
||||
// capture list
|
||||
words.prepend (QString {});
|
||||
words.prepend (message_);
|
||||
return words;
|
||||
}
|
||||
@ -121,7 +130,7 @@ bool DecodedText::isTX() const
|
||||
|
||||
bool DecodedText::isLowConfidence () const
|
||||
{
|
||||
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 21, 1);
|
||||
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 36, 1);
|
||||
}
|
||||
|
||||
int DecodedText::frequencyOffset() const
|
||||
|
169
NEWS
@ -9,7 +9,159 @@
|
||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||
|
||||
|
||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
|
||||
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
|
||||
@ -60,6 +212,7 @@ release 2.5.1:
|
||||
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
|
||||
@ -111,6 +264,7 @@ and repairs for defects detected since the 2.5.0 GA release.
|
||||
|
||||
- Improved main window layout to ensure TxN messages are fully
|
||||
visible.
|
||||
|
||||
|
||||
Release: WSJT-X 2.5.0
|
||||
Sept 27, 2021
|
||||
@ -141,6 +295,7 @@ WSJTX:
|
||||
- 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
|
||||
-------------------------
|
||||
@ -161,6 +316,7 @@ WSJT-X:
|
||||
- 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
|
||||
-------------------------
|
||||
@ -178,6 +334,7 @@ MAP65:
|
||||
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
|
||||
@ -199,6 +356,7 @@ WSJT-X:
|
||||
- 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
|
||||
-------------------------
|
||||
@ -221,6 +379,7 @@ WSJT-X:
|
||||
messages to not be sent when no other intervening messages are
|
||||
sent.
|
||||
|
||||
|
||||
Release: WSJT-X 2.5.0-rc2
|
||||
Jun 28, 2021
|
||||
-------------------------
|
||||
@ -261,6 +420,7 @@ 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
|
||||
-------------------------
|
||||
@ -615,7 +775,6 @@ release candidate.
|
||||
- Several updates to international UI translations.
|
||||
|
||||
|
||||
|
||||
Release: WSJT-X 2.3.0-rc2
|
||||
Nov 16, 2020
|
||||
-------------------------
|
||||
@ -1080,6 +1239,7 @@ 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
|
||||
-------------------
|
||||
@ -1149,6 +1309,7 @@ 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
|
||||
-------------------------
|
||||
@ -1282,6 +1443,7 @@ 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
|
||||
-----------------------
|
||||
@ -1513,7 +1675,6 @@ 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
|
||||
---------------------------------
|
||||
@ -1683,8 +1844,6 @@ 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
|
||||
---------------------------------
|
||||
|
@ -54,7 +54,7 @@ namespace Radio
|
||||
value *= std::pow (10., scale);
|
||||
if (ok)
|
||||
{
|
||||
if (value < 0. || value > std::numeric_limits<Frequency>::max ())
|
||||
if (value < 0. || value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
|
||||
{
|
||||
value = 0.;
|
||||
*ok = false;
|
||||
@ -91,8 +91,8 @@ namespace Radio
|
||||
value *= std::pow (10., scale);
|
||||
if (ok)
|
||||
{
|
||||
if (value < -std::numeric_limits<Frequency>::max ()
|
||||
|| value > std::numeric_limits<Frequency>::max ())
|
||||
if (value < static_cast<double>(std::numeric_limits<Frequency>::min ())
|
||||
|| value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
|
||||
{
|
||||
value = 0.;
|
||||
*ok = false;
|
||||
|
@ -9,7 +9,159 @@
|
||||
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
|
||||
|
||||
|
||||
Copyright 2001 - 2021 by Joe Taylor, K1JT.
|
||||
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
|
||||
@ -60,6 +212,7 @@ release 2.5.1:
|
||||
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
|
||||
@ -111,6 +264,7 @@ and repairs for defects detected since the 2.5.0 GA release.
|
||||
|
||||
- Improved main window layout to ensure TxN messages are fully
|
||||
visible.
|
||||
|
||||
|
||||
Release: WSJT-X 2.5.0
|
||||
Sept 27, 2021
|
||||
@ -141,6 +295,7 @@ WSJTX:
|
||||
- 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
|
||||
-------------------------
|
||||
@ -160,6 +315,7 @@ WSJT-X:
|
||||
- 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
|
||||
@ -179,6 +335,7 @@ 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
|
||||
-------------------------
|
||||
@ -200,6 +357,7 @@ WSJT-X:
|
||||
- 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
|
||||
-------------------------
|
||||
@ -222,6 +380,7 @@ WSJT-X:
|
||||
messages to not be sent when no other intervening messages are
|
||||
sent.
|
||||
|
||||
|
||||
Release: WSJT-X 2.5.0-rc2
|
||||
Jun 28, 2021
|
||||
-------------------------
|
||||
@ -262,6 +421,7 @@ 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
|
||||
-------------------------
|
||||
@ -616,7 +776,6 @@ release candidate.
|
||||
- Several updates to international UI translations.
|
||||
|
||||
|
||||
|
||||
Release: WSJT-X 2.3.0-rc2
|
||||
Nov 16, 2020
|
||||
-------------------------
|
||||
@ -649,7 +808,6 @@ includes some new functionality that missed the RC1 cut off deadline.
|
||||
choice.
|
||||
|
||||
|
||||
|
||||
Release: WSJT-X 2.3.0-rc1
|
||||
Sept 28, 2020
|
||||
-------------------------
|
||||
@ -1082,6 +1240,7 @@ 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
|
||||
-------------------
|
||||
@ -1103,6 +1262,7 @@ 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
|
||||
-------------------------
|
||||
@ -1233,6 +1393,7 @@ 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
|
||||
-------------------------
|
||||
@ -1366,6 +1527,7 @@ 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
|
||||
-----------------------
|
||||
@ -1595,7 +1757,6 @@ 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
|
||||
---------------------------------
|
||||
@ -1765,8 +1926,6 @@ 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
|
||||
---------------------------------
|
||||
|
@ -882,7 +882,12 @@ 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
|
||||
m_->error_check (rig_set_freq (m_->rig_.data (), RIG_VFO_CURR, f), tr ("setting frequency"));
|
||||
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"));
|
||||
update_rx_frequency (f);
|
||||
|
||||
if (m_->mode_query_works_ && UNK != m)
|
||||
@ -890,13 +895,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 (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
||||
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_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 (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||
|
||||
// for the 2nd time because a mode change may have caused a
|
||||
// frequency change
|
||||
@ -905,7 +910,8 @@ 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 (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO 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");
|
||||
}
|
||||
update_mode (m);
|
||||
}
|
||||
@ -1037,16 +1043,22 @@ 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 (), RIG_VFO_CURR, ¤t_mode, ¤t_width), tr ("getting current VFO mode"));
|
||||
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, ¤t_mode, ¤t_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 (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -280,17 +280,30 @@ int OmniRigTransceiver::do_start ()
|
||||
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_)
|
||||
{
|
||||
rig_->SetFreq (f);
|
||||
QTimer::singleShot (200, [=] {
|
||||
rig_->SetFreq (f);
|
||||
});
|
||||
}
|
||||
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
|
||||
{
|
||||
rig_->SetFreqB (f);
|
||||
QTimer::singleShot (200, [=] {
|
||||
rig_->SetFreqB (f);
|
||||
});
|
||||
}
|
||||
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
|
||||
{
|
||||
rig_->SetFreqA (f);
|
||||
QTimer::singleShot (200, [=] {
|
||||
rig_->SetFreqA (f);
|
||||
});
|
||||
}
|
||||
update_rx_frequency (f);
|
||||
CAT_TRACE ("started");
|
||||
|
@ -62,6 +62,7 @@ set (UG_SRCS
|
||||
)
|
||||
|
||||
set (UG_IMGS
|
||||
images/active_stations.png
|
||||
images/AstroData_2.png
|
||||
images/Astronomical_data.png
|
||||
images/auto-seq.png
|
||||
|
@ -98,6 +98,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
|
||||
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1L.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]
|
||||
@ -120,7 +121,8 @@ 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://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
|
||||
: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_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]
|
||||
|
@ -1,12 +1,13 @@
|
||||
// Status=review
|
||||
|
||||
The _WSJT_ project was started by *K1JT* in 2001. Since 2005 it has
|
||||
been an Open Source project, which now includes the programs _WSJT_,
|
||||
been an Open Source project, and it has included the programs _WSJT_,
|
||||
_MAP65_, _WSPR_, _WSJT-X_, and _WSPR-X_. *G4WJS* (since 2013), *K9AN*
|
||||
(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 contributions to _hamlib_,
|
||||
on which _WSJT-X_ depends for rig control.
|
||||
(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.
|
||||
|
||||
All code in the _WSJT_ project is licensed under the GNU Public
|
||||
License (GPL). Many users of these programs, too numerous to mention
|
||||
|
@ -1,8 +1,10 @@
|
||||
// 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:
|
||||
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.
|
||||
|
||||
//.Misc Controls Left
|
||||
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Status=edited
|
||||
|
||||
The following controls appear just under the decoded text windows on
|
||||
the main screen:
|
||||
the main screen. Some of them are visible only in certain modes.
|
||||
|
||||
//.Main UI
|
||||
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
|
||||
|
@ -37,7 +37,18 @@ examples for configurations `FT8` and `Echo`:
|
||||
==== View Menu
|
||||
image::view-menu.png[align="left",alt="View Menu"]
|
||||
|
||||
The *SWL Mode* action reduces the _WSJT-X_ main window to a minimum
|
||||
*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
|
||||
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
|
||||
|
@ -24,7 +24,8 @@ 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.
|
||||
hypothetically known information. Type `a7`, used only in FT8 mode,
|
||||
uses information from the previous Rx sequence.
|
||||
|
||||
[[FT8_AP_INFO_TABLE]]
|
||||
.FST4, FT4, and FT8 AP information types
|
||||
@ -37,6 +38,7 @@ hypothetically known information.
|
||||
|a4|MyCall DxCall RRR
|
||||
|a5|MyCall DxCall 73
|
||||
|a6|MyCall DxCall RR73
|
||||
|a7|(Call_1 or CQ) Call_2     ?
|
||||
|===
|
||||
|
||||
If a codeword is found that is judged to have high (but not
|
||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.3 KiB |
BIN
doc/user_guide/en/images/active_stations.png
Normal file
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.9 KiB |
@ -26,7 +26,10 @@ 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.
|
||||
command line option. For example, to start _WSJT-X_ with its user
|
||||
interface in Spanish, enter this command at the prompt: +
|
||||
|
||||
`wsjtx --language es`
|
||||
|
||||
=== How You Can Contribute
|
||||
|
||||
|
@ -89,3 +89,11 @@ 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_.
|
||||
|
@ -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 also choose to check the box *Call 1st*.
|
||||
_WSJT-X_ will then respond automatically to the first decoded
|
||||
responder to your CQ.
|
||||
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.
|
||||
|
||||
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*, *ARRL RTTY Roundup*, and the *WW Digi* contest.
|
||||
for *ARRL Field Day*, *FT 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*
|
||||
*NA VHF Contest* and *ARRL International Digital Contest*
|
||||
|
||||
CQ TEST K1ABC FN42
|
||||
K1ABC W9XYZ EN37
|
||||
@ -98,8 +98,9 @@ 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. You can use RR73 in
|
||||
place of RRR, and the final 73 is optional.
|
||||
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.
|
||||
|
||||
|
||||
*EU VHF Contest*
|
||||
@ -124,7 +125,7 @@ to upgrade _WSJT-X_ if you will use *EU VHF Contest* messages.
|
||||
W9XYZ K1ABC R 2B EMA
|
||||
K1ABC W9XYZ RR73
|
||||
|
||||
*ARRL RTTY Roundup*
|
||||
*FT Roundup*
|
||||
|
||||
CQ RU K1ABC FN42
|
||||
K1ABC W9XYZ 579 WI
|
||||
@ -144,7 +145,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
|
||||
@ -153,8 +154,9 @@ 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, hit F4
|
||||
to re-send your RR73.
|
||||
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.
|
||||
|
||||
[[COMP-CALL]]
|
||||
=== Nonstandard Callsigns
|
||||
|
@ -1,29 +1,48 @@
|
||||
[[NEW_FEATURES]]
|
||||
=== New in Version {VERSION_MAJOR}.{VERSION_MINOR}
|
||||
|
||||
_WSJT-X 2.5_ 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. When *Max Drift* = 50 the decoder will use an enhanced algorithm
|
||||
to compensate for larger aircraft scatter drift rates, successful
|
||||
decodes with this algorithm are tagged with a `q5` indicator.
|
||||
- _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.
|
||||
|
||||
On the Windows platform only, _WSJT-X 2.5_ 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.
|
||||
|
@ -38,15 +38,14 @@ 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: Generation of FT4, FT8, and MSK144
|
||||
messages_
|
||||
_Special Operating Activity_
|
||||
|
||||
- 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 *ARRL RTTY Roundup*, enter your state or province.
|
||||
ARRL/RAC section; for *FT Roundup*, enter your state or province.
|
||||
Use “DX” for section or state if you are not in the US or Canada. In
|
||||
the RTTY Roundup, Stations in Alaska and Hawaii should enter “DX”.
|
||||
the FT 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
|
||||
|
@ -7,8 +7,11 @@ 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 (up to 13
|
||||
characters) in the entry field at top, then click *Add*.
|
||||
- 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 remove an unwanted message, click on the message and then on
|
||||
*Delete*.
|
||||
@ -18,3 +21,7 @@ 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.
|
||||
|
@ -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 join
|
||||
the group.
|
||||
will be happy to help. To post messages here you will need to
|
||||
{wsjt-devel}.
|
||||
|
||||
=== Bug Reports
|
||||
|
||||
@ -13,8 +13,7 @@ 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 join the group or subscribe to the list. You can register for
|
||||
the list {wsjt-devel}.
|
||||
need to {wsjtx_group2} or {wsjt-devel2}.
|
||||
|
||||
To be useful, bug reports should include at least the following
|
||||
information:
|
||||
|
@ -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 *RTTY Roundup* message formats.
|
||||
most of the decoded messages use the *FT 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 ARRL RTTY Roundup rules) will be
|
||||
multiplier category (for the FT 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 RTTY Roundup rules we recommend
|
||||
contests. In a contest using FT 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.
|
||||
|
||||
|
569
g4wjs.txt
Normal file
@ -0,0 +1,569 @@
|
||||
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.
|
||||
I’ve 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 haven’t 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 Bill’s 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 Bill’s helpful explanations I was able to get going on
|
||||
WSJTX.
|
||||
|
||||
I didn’t 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 can’t 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 Bill’s 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
|
||||
|
@ -8,6 +8,7 @@ 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
|
||||
@ -124,6 +125,11 @@ 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
|
||||
@ -824,7 +830,9 @@ subroutine split77(msg,nwords,nw,w)
|
||||
iz=j !Message length
|
||||
nwords=k !Number of words in msg
|
||||
if(nwords.le.0) go to 900
|
||||
nw(k)=len(trim(w(k)))
|
||||
do i=1,nwords
|
||||
nw(i)=len(trim(w(i)))
|
||||
enddo
|
||||
msg(iz+1:)=' '
|
||||
if(nwords.lt.3) go to 900
|
||||
call chkcall(w(3),bcall_1,ok1)
|
||||
@ -833,7 +841,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
|
||||
|
||||
|
@ -11,6 +11,7 @@ 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
|
||||
|
||||
@ -44,6 +45,9 @@ 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
|
||||
|
@ -54,6 +54,12 @@ 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
|
||||
|
@ -1,4 +1,5 @@
|
||||
subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
||||
subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
|
||||
dfreq,width)
|
||||
|
||||
integer TXLENGTH
|
||||
parameter (TXLENGTH=27648) !27*1024
|
||||
@ -13,11 +14,23 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
||||
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
|
||||
@ -48,69 +61,28 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
|
||||
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 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
|
||||
call echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,dfreq,snr_detect)
|
||||
nqual=snr_detect-2
|
||||
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
|
||||
|
||||
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)
|
||||
|
||||
nsmo=max(0.0,0.25*width/df)
|
||||
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
|
||||
|
@ -7,7 +7,7 @@ subroutine averms(x,n,nskip,ave,rms)
|
||||
sq=0.
|
||||
ipk=maxloc(x)
|
||||
do i=1,n
|
||||
if(abs(i-ipk(1)).gt.nskip) then
|
||||
if((nskip.lt.0) .or. (abs(i-ipk(1)).gt.nskip)) then
|
||||
s=s + x(i)
|
||||
sq=sq + x(i)**2
|
||||
ns=ns+1
|
||||
|
@ -34,7 +34,9 @@ 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
|
||||
if(bc(1:1).eq.'Q') go to 100 !Calls don't start with Q
|
||||
! 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
|
||||
|
||||
! Must have a digit in 2nd or 3rd position
|
||||
i1=0
|
||||
|
51
lib/echo_snr.f90
Normal file
@ -0,0 +1,51 @@
|
||||
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
|
161
lib/ft8/chkdec.f90
Normal file
@ -0,0 +1,161 @@
|
||||
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
|
378
lib/ft8/ft8_a7.f90
Normal file
@ -0,0 +1,378 @@
|
||||
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
|
261
lib/ft8/ft8c.f90
Normal file
@ -0,0 +1,261 @@
|
||||
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
|
109
lib/ft8/ft8q3.f90
Normal file
@ -0,0 +1,109 @@
|
||||
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
|
@ -9,11 +9,12 @@ 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 ibt0/0/
|
||||
save pulse,twopi,dt,hmod,ibt0,ctab
|
||||
data fchk0/0.0/
|
||||
save pulse,twopi,dt,hmod,fchk0,ctab
|
||||
|
||||
ibt=nint(10*bt)
|
||||
if(ibt0.ne.ibt) then
|
||||
fchk=nsym+nsps+bt+fsample
|
||||
if(fchk.ne.fchk0) then
|
||||
twopi=8.0*atan(1.0)
|
||||
dt=1.0/fsample
|
||||
hmod=1.0
|
||||
@ -22,11 +23,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.
|
||||
|
@ -58,6 +58,8 @@ 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
|
||||
|
41
lib/ft8/test_ft8q3.f90
Normal file
@ -0,0 +1,41 @@
|
||||
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
|
@ -38,6 +38,7 @@ 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'
|
||||
|
||||
@ -53,7 +54,8 @@ contains
|
||||
logical newdat,lsubtract,ldupe,lrefinedt
|
||||
logical*1 ldiskdat
|
||||
logical lsubtracted(MAX_EARLY)
|
||||
character*12 mycall12,hiscall12
|
||||
character*12 mycall12,hiscall12,call_1,call_2
|
||||
character*4 grid4
|
||||
integer*2 iwave(15*12000)
|
||||
integer apsym2(58),aph10(10)
|
||||
character datetime*13,msg37*37
|
||||
@ -64,13 +66,33 @@ contains
|
||||
integer itone_save(NN,MAX_EARLY)
|
||||
real f1_save(MAX_EARLY)
|
||||
real xdt_save(MAX_EARLY)
|
||||
data nutc0/-1/
|
||||
|
||||
save s,dd,dd1,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,allmessages
|
||||
save s,dd,dd1,nutc0,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
|
||||
@ -178,7 +200,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
|
||||
@ -198,6 +220,11 @@ 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)
|
||||
@ -209,7 +236,43 @@ contains
|
||||
800 ndec_early=0
|
||||
if(nzhsym.lt.50) ndec_early=ndecodes
|
||||
|
||||
900 return
|
||||
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
|
||||
end subroutine decode
|
||||
|
||||
subroutine timestamp(tsec,tseq,ctime)
|
||||
|
@ -1,9 +1,10 @@
|
||||
subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||
subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
|
||||
|
||||
! 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
|
||||
@ -21,6 +22,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||
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
|
||||
@ -48,7 +53,7 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||
call unpackmsg(dgen,msgsent) !Unpack to get message sent
|
||||
msgsent(20:22)=cok
|
||||
call fmtmsg(msgsent,iz)
|
||||
if(ichk.ne.0) go to 999 !Return if checking only
|
||||
if(ichk.ne.0) go to 900 !Return if checking only
|
||||
|
||||
call rs_encode(dgen,sent) !Apply Reed-Solomon code
|
||||
call interleave63(sent,1) !Apply interleaving
|
||||
@ -79,5 +84,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
|
||||
endif
|
||||
endif
|
||||
|
||||
999 return
|
||||
900 do i=1,22
|
||||
msgsent0(i)=msgsent(i:i)
|
||||
enddo
|
||||
msgsent0(23)=char(0)
|
||||
|
||||
return
|
||||
end subroutine gen65
|
||||
|
@ -3,7 +3,8 @@ subroutine grid2deg(grid0,dlong,dlat)
|
||||
! Converts Maidenhead grid locator to degrees of West longitude
|
||||
! and North latitude.
|
||||
|
||||
character*6 grid0,grid
|
||||
character*(*) grid0
|
||||
character*6 grid
|
||||
character*1 g1,g2,g3,g4,g5,g6
|
||||
|
||||
grid=grid0
|
||||
|
@ -62,6 +62,7 @@ contains
|
||||
character(len=12) :: mycall, hiscall !Used for AP decoding
|
||||
character(len=6) :: hisgrid
|
||||
character*37 decoded !Decoded message
|
||||
character*37 decodes(100)
|
||||
character*77 c77
|
||||
character*78 c78
|
||||
character*6 cutc
|
||||
@ -80,6 +81,8 @@ contains
|
||||
|
||||
! Start by setting some parameters and allocating storage for large arrays
|
||||
call sec0(0,tdecode)
|
||||
ndecodes=0
|
||||
decodes=' '
|
||||
nfa=nfa0
|
||||
nfb=nfb0
|
||||
nqd=nqd0
|
||||
@ -153,14 +156,21 @@ contains
|
||||
call q65_enc(dgen,codewords) !Initialize the Q65 codec
|
||||
nused=1
|
||||
iavg=0
|
||||
|
||||
! W3SZ patch: Initialize AP params here, rather than afer the call to ana64().
|
||||
call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols
|
||||
where(apsym0.eq.-1) apsym0=0
|
||||
npasses=2
|
||||
if(nQSOprogress.eq.5) npasses=3
|
||||
|
||||
call timer('q65_dec0',0)
|
||||
! Call top-level routine in q65 module: establish sync and try for a
|
||||
! q3 or q0 decode.
|
||||
call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
|
||||
emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno)
|
||||
call timer('q65_dec0',1)
|
||||
! write(*,3001) '=a',sum(abs(float(iwave))),nfqso,ntol,ndepth,xdt,f0,idec
|
||||
!3001 format(a2,f15.0,3i5,f7.2,f7.1,i5)
|
||||
! write(*,3001) '=a',nfqso,ntol,ndepth,xdt,f0,idec
|
||||
!3001 format(a2,3i5,f7.2,f7.1,i5)
|
||||
|
||||
if(idec.ge.0) then
|
||||
dtdec=xdt !We have a q3 or q0 decode at nfqso
|
||||
@ -173,11 +183,6 @@ contains
|
||||
if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000 !For shortest sequences
|
||||
if(jpk0.lt.0) jpk0=0
|
||||
call ana64(iwave,npts,c00) !Convert to complex c00() at 6000 Sa/s
|
||||
call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols
|
||||
where(apsym0.eq.-1) apsym0=0
|
||||
|
||||
npasses=2
|
||||
if(nQSOprogress.eq.5) npasses=3
|
||||
if(lapcqonly) npasses=1
|
||||
iaptype=0
|
||||
do ipass=0,npasses !Loop over AP passes
|
||||
@ -199,6 +204,7 @@ contains
|
||||
call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, &
|
||||
xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec)
|
||||
call timer('q65loops',1)
|
||||
! write(*,3001) '=b',nfqso,ntol,ndepth,xdt,f0,idec
|
||||
if(idec.ge.0) then
|
||||
dtdec=xdt1
|
||||
f0dec=f1
|
||||
@ -266,33 +272,41 @@ contains
|
||||
! Unpack decoded message for display to user
|
||||
write(c77,1000) dat4(1:12),dat4(13)/2
|
||||
1000 format(12b6.6,b5.5)
|
||||
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent
|
||||
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
|
||||
nsnr=nint(snr2)
|
||||
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
|
||||
idec,nused,ntrperiod)
|
||||
call q65_hist(nint(f0dec),msg0=decoded)
|
||||
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
|
||||
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
|
||||
call sec0(1,tdecode)
|
||||
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
|
||||
position='append',iostat=ios)
|
||||
if(ios.eq.0) then
|
||||
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded
|
||||
idupe=0
|
||||
do i=1,ndecodes
|
||||
if(decodes(i).eq.decoded) idupe=1
|
||||
enddo
|
||||
if(idupe.eq.0) then
|
||||
ndecodes=min(ndecodes+1,100)
|
||||
decodes(ndecodes)=decoded
|
||||
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
|
||||
nsnr=nint(snr2)
|
||||
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
|
||||
idec,nused,ntrperiod)
|
||||
call q65_hist(nint(f0dec),msg0=decoded)
|
||||
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
|
||||
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
|
||||
call sec0(1,tdecode)
|
||||
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
|
||||
position='append',iostat=ios)
|
||||
if(ios.eq.0) then
|
||||
! Save decoding parameters to q65_decoded.dat, for later analysis.
|
||||
write(cmode,'(i3)') ntrperiod
|
||||
cmode(4:4)=char(ichar('A')+nsubmode)
|
||||
c6=hiscall(1:6)
|
||||
if(c6.eq.' ') c6='<b> '
|
||||
c4=hisgrid(1:4)
|
||||
if(c4.eq.' ') c4='<b> '
|
||||
fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
|
||||
'1x,a6,1x,a6,1x,a4,1x,a)'
|
||||
if(ntrperiod.le.30) fmt(5:5)='6'
|
||||
if(idec.eq.3) nrc=0
|
||||
write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, &
|
||||
ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
|
||||
tdecode,mycall(1:6),c6,c4,trim(decoded)
|
||||
close(22)
|
||||
write(cmode,'(i3)') ntrperiod
|
||||
cmode(4:4)=char(ichar('A')+nsubmode)
|
||||
c6=hiscall(1:6)
|
||||
if(c6.eq.' ') c6='<b> '
|
||||
c4=hisgrid(1:4)
|
||||
if(c4.eq.' ') c4='<b> '
|
||||
fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
|
||||
'1x,a6,1x,a6,1x,a4,1x,a)'
|
||||
if(ntrperiod.le.30) fmt(5:5)='6'
|
||||
if(idec.eq.3) nrc=0
|
||||
write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, &
|
||||
ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
|
||||
tdecode,mycall(1:6),c6,c4,trim(decoded)
|
||||
close(22)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
navg0=1000*navg(0) + navg(1)
|
||||
@ -331,6 +345,7 @@ contains
|
||||
call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, &
|
||||
xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec)
|
||||
call timer('q65loops',1)
|
||||
! write(*,3001) '=e',nfqso,ntol,ndepth,xdt,f0,idec
|
||||
if(idec.ge.0) then
|
||||
dtdec=xdt1
|
||||
f0dec=f1
|
||||
@ -342,33 +357,41 @@ contains
|
||||
if(idec.ge.0) then
|
||||
! Unpack decoded message for display to user
|
||||
write(c77,1000) dat4(1:12),dat4(13)/2
|
||||
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent
|
||||
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
|
||||
nsnr=nint(snr2)
|
||||
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
|
||||
idec,nused,ntrperiod)
|
||||
call q65_hist(nint(f0dec),msg0=decoded)
|
||||
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
|
||||
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
|
||||
call sec0(1,tdecode)
|
||||
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
|
||||
position='append',iostat=ios)
|
||||
if(ios.eq.0) then
|
||||
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded
|
||||
idupe=0
|
||||
do i=1,ndecodes
|
||||
if(decodes(i).eq.decoded) idupe=1
|
||||
enddo
|
||||
if(idupe.eq.0) then
|
||||
ndecodes=min(ndecodes+1,100)
|
||||
decodes(ndecodes)=decoded
|
||||
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
|
||||
nsnr=nint(snr2)
|
||||
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
|
||||
idec,nused,ntrperiod)
|
||||
call q65_hist(nint(f0dec),msg0=decoded)
|
||||
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
|
||||
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
|
||||
call sec0(1,tdecode)
|
||||
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
|
||||
position='append',iostat=ios)
|
||||
if(ios.eq.0) then
|
||||
! Save decoding parameters to q65_decoded.dat, for later analysis.
|
||||
write(cmode,'(i3)') ntrperiod
|
||||
cmode(4:4)=char(ichar('A')+nsubmode)
|
||||
c6=hiscall(1:6)
|
||||
if(c6.eq.' ') c6='<b> '
|
||||
c4=hisgrid(1:4)
|
||||
if(c4.eq.' ') c4='<b> '
|
||||
fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
|
||||
'1x,a6,1x,a6,1x,a4,1x,a)'
|
||||
if(ntrperiod.le.30) fmt(5:5)='6'
|
||||
if(idec.eq.3) nrc=0
|
||||
write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, &
|
||||
ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
|
||||
tdecode,mycall(1:6),c6,c4,trim(decoded)
|
||||
close(22)
|
||||
write(cmode,'(i3)') ntrperiod
|
||||
cmode(4:4)=char(ichar('A')+nsubmode)
|
||||
c6=hiscall(1:6)
|
||||
if(c6.eq.' ') c6='<b> '
|
||||
c4=hisgrid(1:4)
|
||||
if(c4.eq.' ') c4='<b> '
|
||||
fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
|
||||
'1x,a6,1x,a6,1x,a4,1x,a)'
|
||||
if(ntrperiod.le.30) fmt(5:5)='6'
|
||||
if(idec.eq.3) nrc=0
|
||||
write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, &
|
||||
ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
|
||||
tdecode,mycall(1:6),c6,c4,trim(decoded)
|
||||
close(22)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
enddo ! icand
|
||||
|
@ -171,8 +171,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
|
||||
call timer('list_dec',0)
|
||||
call q65_dec_q3(s1,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded)
|
||||
call timer('list_dec',1)
|
||||
! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded)
|
||||
!3070 format(i3,i5,f8.2,2x,a)
|
||||
endif
|
||||
! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting.
|
||||
endif
|
||||
@ -250,16 +248,15 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
|
||||
call q65_ccf_85(s1w,iz,jz,nfqso,ia,ia2,ipk,jpk,f0,xdt,imsg_best, &
|
||||
better,ccf1)
|
||||
call timer('ccf_85 ',1)
|
||||
! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4.
|
||||
! and mode_q65=2**nsubmode
|
||||
|
||||
! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4.
|
||||
! and mode_q65=2**nsubmode
|
||||
if(better.ge.1.10) then
|
||||
! if(better.ge.1.04 .or. mode_q65.ge.8) then
|
||||
! if(better.ge.1.10 .or. mode_q65.ge.8) then ORIGINAL
|
||||
call timer('list_dec',0)
|
||||
call q65_dec_q3(s1w,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded)
|
||||
call timer('list_dec',1)
|
||||
! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded)
|
||||
!3070 format(i3,i5,f8.2,2x,a)
|
||||
endif ! if(better.ge.1.10)
|
||||
endif ! if(ncw.gt.0 .and. iavg.le.1)
|
||||
! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting.
|
||||
@ -570,7 +567,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, &
|
||||
i=indx(k)+ia-1
|
||||
if(ccf2(i).lt.3.3) exit !Candidate limit
|
||||
f=i*df
|
||||
if(f.ge.(nfqso-ftol) .and. f.le.(nfqso+ftol)) cycle !Looked here already
|
||||
i3=max(1, i-mode_q65)
|
||||
i4=min(iz,i+mode_q65)
|
||||
biggest=maxval(ccf2(i3:i4))
|
||||
@ -785,9 +781,8 @@ subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
|
||||
sig_area=sum(spec(ia+nsum:ib-nsum)-1.0)
|
||||
w_equiv=sig_area/(smax-1.0)
|
||||
snr2=db(max(1.0,sig_area)) - db(2500.0/df)
|
||||
if(nused.eq.2) snr2=snr2 - 2.0
|
||||
if(nused.eq.3) snr2=snr2 - 2.9
|
||||
if(nused.ge.4) snr2=snr2 - 3.5
|
||||
! NB: No adjustment to SNR is now made for nused>1, because that process did
|
||||
! not seem to work as expected.
|
||||
|
||||
return
|
||||
end subroutine q65_snr
|
||||
|
9
lib/save_dxbase.f90
Normal file
@ -0,0 +1,9 @@
|
||||
subroutine save_dxbase(dxbase0)
|
||||
|
||||
use packjt77
|
||||
character*6 dxbase0
|
||||
|
||||
dxbase=dxbase0
|
||||
|
||||
return
|
||||
end subroutine save_dxbase
|
67
lib/test_snr.f90
Normal file
@ -0,0 +1,67 @@
|
||||
program test_snr
|
||||
|
||||
! Test an algorithm for measuring SNR of EME echoes.
|
||||
|
||||
use wavhdr
|
||||
parameter (NMAX=27648) !27*1024
|
||||
parameter (NFFT=32768,NH=NFFT/2)
|
||||
parameter (NZ=4096)
|
||||
|
||||
type(hdr) h !Header for the .wav file
|
||||
integer*2 id2(NMAX) !Buffer for Rx data
|
||||
complex c(0:NH)
|
||||
real x(NFFT)
|
||||
real s(8192)
|
||||
real sa(4096)
|
||||
real sb(4096)
|
||||
real red(4096)
|
||||
real blue(4096)
|
||||
character*80 infile
|
||||
equivalence (x,c)
|
||||
|
||||
nargs=iargc()
|
||||
if(nargs.lt.1) then
|
||||
print*,'Usage: test_snr <infile>'
|
||||
go to 999
|
||||
endif
|
||||
call getarg(1,infile)
|
||||
i0=index(infile,'_')
|
||||
read(infile(1:i0-1),*) fspread0 !Generated Doppler spread
|
||||
read(infile(i0+1:i0+3),*) snrdb0 !Generated SNR
|
||||
open(10,file=trim(infile),status='old',access='stream')
|
||||
read(10) h
|
||||
npts=h%ndata/2
|
||||
npings=npts/NMAX
|
||||
nfsample=h%nsamrate
|
||||
df=12000.0/NFFT
|
||||
s=0.
|
||||
fac=1.0/NMAX
|
||||
|
||||
do iping=1,npings
|
||||
read(10) id2(1:NMAX)
|
||||
x(1:NMAX)=fac*id2(1:NMAX)
|
||||
x(NMAX+1:)=0.
|
||||
call four2a(x,NFFT,1,-1,0)
|
||||
do i=1,8192 !Accumulate spectrum 0 - 3 kHz
|
||||
s(i)=s(i) + real(c(i))**2 + aimag(c(i))**2
|
||||
enddo
|
||||
enddo
|
||||
|
||||
sa=s(2049:6144)
|
||||
sb=s(2049:6144)
|
||||
|
||||
call echo_snr(sa,sb,fspread0,blue,red,snrdb,db_err,fpeak,snr_detect)
|
||||
|
||||
nqual=min(10,int(snr_detect-4.0))
|
||||
|
||||
write(*,1010) fspread0,snrdb0,snrdb,snrdb-snrdb0,db_err,fpeak, &
|
||||
snr_detect,nqual
|
||||
|
||||
1010 format(5f6.1,2f7.1,i4)
|
||||
|
||||
do i=1,8192
|
||||
write(12,1100) i*df,s(i)
|
||||
1100 format(f10.3,e15.6)
|
||||
enddo
|
||||
|
||||
999 end program test_snr
|
@ -196,7 +196,7 @@ int get_wspr_channel_symbols(char* rawmessage, char* hashtab, char* loctab, unsi
|
||||
// Use the presence and/or absence of "<" and "/" to decide what
|
||||
// type of message. No sanity checks! Beware!
|
||||
|
||||
if( i1 > 3 && i1 < 7 && i2 == mlen && i3 == mlen ) {
|
||||
if( i1 >= 3 && i1 < 7 && i2 == mlen && i3 == mlen ) {
|
||||
// Type 1 message: K9AN EN50 33
|
||||
// xxnxxxx xxnn nn
|
||||
callsign = strtok(message," ");
|
||||
|
@ -103,13 +103,13 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid,
|
||||
sprintf(cc,"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Moon\n"
|
||||
"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Sun\n"
|
||||
"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Source\n"
|
||||
"%4d,%6d,Doppler\n"
|
||||
"%4d,%6d,%6d,Doppler\n"
|
||||
"%3d,%1d,fQSO\n"
|
||||
"%3d,%1d,fQSO2\n",
|
||||
nhr,nmin,isec,azmoon,elmoon,
|
||||
nhr,nmin,isec,azsun,elsun,
|
||||
nhr,nmin,isec,0.0,0.0,
|
||||
nfreq,ndop,
|
||||
nfreq,ndop,ndop00,
|
||||
fQSO,nsetftx,
|
||||
ntxFreq,ndiff);
|
||||
out << cc;
|
||||
|
@ -106,8 +106,8 @@ void DevSetup::initDlg()
|
||||
ui.comboBoxSndOut->setCurrentIndex(m_nDevOut);
|
||||
ui.sbPort->setValue(m_udpPort);
|
||||
ui.cbIQswap->setChecked(m_IQswap);
|
||||
ui.cb10db->setChecked(m_10db);
|
||||
ui.cbInitIQplus->setChecked(m_initIQplus);
|
||||
ui.sb_dB->setValue(m_dB);
|
||||
ui.mult570SpinBox->setValue(m_mult570);
|
||||
ui.mult570TxSpinBox->setValue(m_mult570Tx);
|
||||
ui.cal570SpinBox->setValue(m_cal570);
|
||||
@ -176,8 +176,8 @@ void DevSetup::accept()
|
||||
m_paOutDevice=m_outDevList[m_nDevOut];
|
||||
m_udpPort=ui.sbPort->value();
|
||||
m_IQswap=ui.cbIQswap->isChecked();
|
||||
m_10db=ui.cb10db->isChecked();
|
||||
m_initIQplus=ui.cbInitIQplus->isChecked();
|
||||
m_dB=ui.sb_dB->value();
|
||||
m_mult570=ui.mult570SpinBox->value();
|
||||
m_mult570Tx=ui.mult570TxSpinBox->value();
|
||||
m_cal570=ui.cal570SpinBox->value();
|
||||
@ -195,7 +195,7 @@ void DevSetup::on_soundCardRadioButton_toggled(bool checked)
|
||||
ui.label_Port->setEnabled(!checked);
|
||||
ui.sbPort->setEnabled(!checked);
|
||||
ui.cbIQswap->setEnabled(checked);
|
||||
ui.cb10db->setEnabled(checked);
|
||||
ui.sb_dB->setEnabled(checked);
|
||||
}
|
||||
|
||||
void DevSetup::on_cbXpol_stateChanged(int n)
|
||||
@ -217,6 +217,11 @@ void DevSetup::on_mult570SpinBox_valueChanged(int mult)
|
||||
m_mult570=mult;
|
||||
}
|
||||
|
||||
void DevSetup::on_sb_dB_valueChanged(int n)
|
||||
{
|
||||
m_dB=n;
|
||||
}
|
||||
|
||||
void DevSetup::updateColorLabels()
|
||||
{
|
||||
QString t;
|
||||
|
@ -27,6 +27,7 @@ public:
|
||||
qint32 m_astroFont;
|
||||
qint32 m_mult570;
|
||||
qint32 m_mult570Tx;
|
||||
qint32 m_dB;
|
||||
|
||||
double m_fAdd;
|
||||
double m_cal570;
|
||||
@ -39,7 +40,6 @@ public:
|
||||
bool m_IQswap;
|
||||
bool m_restartSoundIn;
|
||||
bool m_restartSoundOut;
|
||||
bool m_10db;
|
||||
bool m_initIQplus;
|
||||
bool m_bIQxt;
|
||||
|
||||
@ -81,6 +81,7 @@ private slots:
|
||||
void on_mult570TxSpinBox_valueChanged(int arg1);
|
||||
void on_rbIQXT_toggled(bool checked);
|
||||
void on_sbTxOffset_valueChanged(double f);
|
||||
void on_sb_dB_valueChanged(int n);
|
||||
|
||||
private:
|
||||
int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3;
|
||||
|
@ -698,12 +698,24 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cb10db">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<widget class="QSpinBox" name="sb_dB">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Adjust to scale digital I/Q data.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>+10 dB</string>
|
||||
<property name="suffix">
|
||||
<string> dB</string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>Gain </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-50</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -1772,8 +1784,8 @@
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
<x>257</x>
|
||||
<y>380</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
@ -1788,8 +1800,8 @@
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
<x>325</x>
|
||||
<y>380</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
|
@ -47,6 +47,8 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand)
|
||||
df3=96000.0/NFFT
|
||||
ia=nint(1000*nfa/df3) + 1
|
||||
ib=nint(1000*nfb/df3) + 1
|
||||
if(ia.lt.1) ia=1
|
||||
if(ib.gt.NFFT-1) ib=NFFT-1
|
||||
iz=ib-ia+1
|
||||
|
||||
call indexx(sync(ia:ib)%ccfmax,iz,indx) !Sort by relative snr
|
||||
@ -151,6 +153,8 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb)
|
||||
df3=96000.0/NFFT
|
||||
ia=nint(1000*nfa/df3) + 1 !Flat frequency range for WSE converters
|
||||
ib=nint(1000*nfb/df3) + 1
|
||||
if(ia.lt.1) ia=1
|
||||
if(ib.gt.NFFT-1) ib=NFFT-1
|
||||
npol=1
|
||||
if(xpol) npol=4
|
||||
|
||||
|
@ -372,7 +372,7 @@ void MainWindow::writeSettings()
|
||||
settings.setValue("SoundOutIndex",m_nDevOut);
|
||||
settings.setValue("paOutDevice",m_paOutDevice);
|
||||
settings.setValue("IQswap",m_IQswap);
|
||||
settings.setValue("Plus10dB",m_10db);
|
||||
settings.setValue("Scale_dB",m_dB);
|
||||
settings.setValue("IQxt",m_bIQxt);
|
||||
settings.setValue("InitIQplus",m_initIQplus);
|
||||
settings.setValue("UDPport",m_udpPort);
|
||||
@ -447,12 +447,12 @@ void MainWindow::readSettings()
|
||||
m_nDevOut = settings.value("SoundOutIndex", 0).toInt();
|
||||
m_paOutDevice = settings.value("paOutDevice",0).toInt();
|
||||
m_IQswap = settings.value("IQswap",false).toBool();
|
||||
m_10db = settings.value("Plus10dB",false).toBool();
|
||||
m_dB = settings.value("Scale_dB",0).toInt();
|
||||
m_initIQplus = settings.value("InitIQplus",false).toBool();
|
||||
m_bIQxt = settings.value("IQxt",false).toBool();
|
||||
m_udpPort = settings.value("UDPport",50004).toInt();
|
||||
soundInThread.setSwapIQ(m_IQswap);
|
||||
soundInThread.set10db(m_10db);
|
||||
soundInThread.setScale(m_dB);
|
||||
soundInThread.setPort(m_udpPort);
|
||||
ui->actionCuteSDR->setChecked(settings.value(
|
||||
"PaletteCuteSDR",true).toBool());
|
||||
@ -682,7 +682,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
|
||||
dlg.m_nDevOut=m_nDevOut;
|
||||
dlg.m_udpPort=m_udpPort;
|
||||
dlg.m_IQswap=m_IQswap;
|
||||
dlg.m_10db=m_10db;
|
||||
dlg.m_dB=m_dB;
|
||||
dlg.m_initIQplus=m_initIQplus;
|
||||
dlg.m_bIQxt=m_bIQxt;
|
||||
dlg.m_cal570=m_cal570;
|
||||
@ -719,7 +719,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
|
||||
m_paOutDevice=dlg.m_paOutDevice;
|
||||
m_udpPort=dlg.m_udpPort;
|
||||
m_IQswap=dlg.m_IQswap;
|
||||
m_10db=dlg.m_10db;
|
||||
m_dB=dlg.m_dB;
|
||||
m_initIQplus=dlg.m_initIQplus;
|
||||
m_bIQxt=dlg.m_bIQxt;
|
||||
m_colors=dlg.m_colors;
|
||||
@ -732,7 +732,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
|
||||
m_wide_graph_window->m_mult570Tx=m_mult570Tx;
|
||||
m_wide_graph_window->m_cal570=m_cal570;
|
||||
soundInThread.setSwapIQ(m_IQswap);
|
||||
soundInThread.set10db(m_10db);
|
||||
soundInThread.setScale(m_dB);
|
||||
|
||||
if(dlg.m_restartSoundIn) {
|
||||
soundInThread.quit();
|
||||
@ -1410,7 +1410,7 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
#ifdef WIN32
|
||||
m=3;
|
||||
#endif
|
||||
if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-m));
|
||||
if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m));
|
||||
n=ui->decodedTextBrowser->verticalScrollBar()->maximum();
|
||||
ui->decodedTextBrowser->verticalScrollBar()->setValue(n);
|
||||
m_messagesText="";
|
||||
@ -1439,7 +1439,6 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
int n=t.size();
|
||||
qDebug() << t.mid(1,n-3).trimmed();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -192,6 +192,7 @@ private:
|
||||
qint32 m_modeJT65;
|
||||
qint32 m_modeQ65;
|
||||
qint32 m_RxState;
|
||||
qint32 m_dB;
|
||||
|
||||
|
||||
double m_fAdd;
|
||||
@ -220,7 +221,6 @@ private:
|
||||
bool m_NB;
|
||||
bool m_fs96000;
|
||||
bool m_IQswap;
|
||||
bool m_10db;
|
||||
bool m_initIQplus;
|
||||
bool m_bIQxt;
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soundin.h"
|
||||
#include <math.h>
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
#include <windows.h>
|
||||
@ -53,9 +54,9 @@ typedef struct
|
||||
{
|
||||
int kin; //Parameters sent to/from the portaudio callback function
|
||||
int nrx;
|
||||
int dB;
|
||||
bool bzero;
|
||||
bool iqswap;
|
||||
bool b10db;
|
||||
} paUserData;
|
||||
|
||||
//--------------------------------------------------------------- a2dCallback
|
||||
@ -91,8 +92,7 @@ extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer,
|
||||
nbytes=udata->nrx*8*framesToProcess; //Bytes per frame
|
||||
memcpy(d4,inputBuffer,nbytes); //Copy all samples to d4
|
||||
|
||||
fac=32767.0;
|
||||
if(udata->b10db) fac=103618.35;
|
||||
fac=32767.0 * pow(10.0,0.05*udata->dB);
|
||||
|
||||
if(udata->nrx==2) {
|
||||
for(i=0; i<4*int(framesToProcess); i++) { //Negate odd-numbered frames
|
||||
@ -185,7 +185,7 @@ void SoundInThread::run() //SoundInThread::run()
|
||||
udata.bzero=false; //Flag to request reset of kin
|
||||
udata.nrx=m_nrx; //Number of polarizations
|
||||
udata.iqswap=m_IQswap;
|
||||
udata.b10db=m_10db;
|
||||
udata.dB=m_dB;
|
||||
|
||||
auto device_info = Pa_GetDeviceInfo (m_nDevIn);
|
||||
|
||||
@ -251,7 +251,7 @@ void SoundInThread::run() //SoundInThread::run()
|
||||
}
|
||||
k=udata.kin;
|
||||
udata.iqswap=m_IQswap;
|
||||
udata.b10db=m_10db;
|
||||
udata.dB=m_dB;
|
||||
if(m_monitoring) {
|
||||
if(m_bForceCenterFreq) {
|
||||
datcom_.fcenter=m_dForceCenterFreq;
|
||||
@ -281,9 +281,9 @@ void SoundInThread::setSwapIQ(bool b)
|
||||
m_IQswap=b;
|
||||
}
|
||||
|
||||
void SoundInThread::set10db(bool b)
|
||||
void SoundInThread::setScale(qint32 n)
|
||||
{
|
||||
m_10db=b;
|
||||
m_dB=n;
|
||||
}
|
||||
void SoundInThread::setPort(int n) //setPort()
|
||||
{
|
||||
|
@ -30,7 +30,7 @@ public:
|
||||
}
|
||||
|
||||
void setSwapIQ(bool b);
|
||||
void set10db(bool b);
|
||||
void setScale(qint32 n);
|
||||
void setPort(qint32 n);
|
||||
void setInputDevice(qint32 n);
|
||||
void setRate(double rate);
|
||||
@ -62,7 +62,6 @@ private:
|
||||
bool m_monitoring;
|
||||
bool m_bForceCenterFreq;
|
||||
bool m_IQswap;
|
||||
bool m_10db;
|
||||
double m_dForceCenterFreq;
|
||||
qint32 m_nrx;
|
||||
qint32 m_hsym;
|
||||
@ -70,6 +69,7 @@ private:
|
||||
qint32 m_udpPort;
|
||||
qint32 m_TRperiod;
|
||||
qint32 m_TRperiod0;
|
||||
qint32 m_dB;
|
||||
|
||||
QUdpSocket *udpSocket;
|
||||
};
|
||||
|
@ -73,7 +73,9 @@ public:
|
||||
Configuration const * configuration_;
|
||||
QSqlQuery mutable dupe_query_;
|
||||
QSqlQuery mutable export_query_;
|
||||
QSqlQuery mutable qso_count_query_;
|
||||
bool adding_row_;
|
||||
int n_qso();
|
||||
};
|
||||
|
||||
CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration)
|
||||
@ -109,6 +111,7 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration
|
||||
{
|
||||
Q_EMIT self_->data_changed ();
|
||||
}
|
||||
Q_EMIT self_->qso_count_changed(self_->n_qso());
|
||||
});
|
||||
|
||||
SQL_error_check (*this, &QSqlTableModel::select);
|
||||
@ -132,6 +135,10 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration
|
||||
" cabrillo_log_v2 "
|
||||
" ORDER BY "
|
||||
" \"when\"");
|
||||
|
||||
SQL_error_check (qso_count_query_, &QSqlQuery::prepare,
|
||||
"SELECT COUNT(*) FROM cabrillo_log_v2");
|
||||
|
||||
}
|
||||
|
||||
void CabrilloLog::impl::create_table ()
|
||||
@ -234,8 +241,10 @@ bool CabrilloLog::add_QSO (Frequency frequency, QString const& mode, QDateTime c
|
||||
m_->adding_row_ = true;
|
||||
auto ok = m_->insertRecord (-1, record);
|
||||
transaction.submit ();
|
||||
|
||||
m_->adding_row_ = false;
|
||||
m_->setEditStrategy (QSqlTableModel::OnFieldChange);
|
||||
Q_EMIT this->qso_count_changed(this->n_qso());
|
||||
return ok;
|
||||
}
|
||||
|
||||
@ -256,6 +265,13 @@ bool CabrilloLog::dupe (Frequency frequency, QString const& call) const
|
||||
return false;
|
||||
}
|
||||
|
||||
int CabrilloLog::n_qso()
|
||||
{
|
||||
SQL_error_check (m_->qso_count_query_, static_cast<bool (QSqlQuery::*) ()> (&QSqlQuery::exec));
|
||||
m_->qso_count_query_.first();
|
||||
return m_->qso_count_query_.value(0).toInt();
|
||||
}
|
||||
|
||||
void CabrilloLog::reset ()
|
||||
{
|
||||
// synchronize model
|
||||
|
@ -31,6 +31,7 @@ public:
|
||||
bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call
|
||||
, QString const& report_sent, QString const& report_received);
|
||||
bool dupe (Frequency, QString const& call) const;
|
||||
int n_qso();
|
||||
|
||||
QSqlTableModel * model ();
|
||||
void reset ();
|
||||
@ -38,6 +39,7 @@ public:
|
||||
worked_set unique_DXCC_entities (AD1CCty const *) const;
|
||||
|
||||
Q_SIGNAL void data_changed () const;
|
||||
Q_SIGNAL void qso_count_changed (int) const;
|
||||
|
||||
private:
|
||||
class impl;
|
||||
|
@ -278,10 +278,10 @@ namespace
|
||||
{50318000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||
{50323000, Modes::FT8, IARURegions::ALL},
|
||||
|
||||
{70100000, Modes::FT8, IARURegions::R1},
|
||||
{70102000, Modes::JT65, IARURegions::R1},
|
||||
{70104000, Modes::JT9, IARURegions::R1},
|
||||
{70091000, Modes::WSPR, IARURegions::R1},
|
||||
{70154000, Modes::FT8, IARURegions::R1},
|
||||
{70230000, Modes::MSK144, IARURegions::R1},
|
||||
|
||||
{144116000, Modes::Q65, IARURegions::ALL},
|
||||
|
@ -80,5 +80,5 @@ QString version (bool include_patch)
|
||||
QString program_title (QString const& revision)
|
||||
{
|
||||
QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()};
|
||||
return id + " " + revision + " by K1JT, G4WJS, K9AN, and IV3NWV";
|
||||
return id + " " + revision + " by K1JT et al.";
|
||||
}
|
||||
|
6695
translations/wsjtx_ru.ts
Normal file
@ -10,6 +10,7 @@
|
||||
#include <QSqlTableModel>
|
||||
#include <QItemSelectionModel>
|
||||
#include <QItemSelection>
|
||||
#include <QTimer>
|
||||
#include "Configuration.hpp"
|
||||
#include "SettingsGroup.hpp"
|
||||
#include "MessageBox.hpp"
|
||||
@ -71,7 +72,7 @@ void AbstractLogWindow::impl::delete_QSOs ()
|
||||
{
|
||||
// We must work with source model indexes because we don't want row
|
||||
// removes to invalidate model indexes we haven't yet processed. We
|
||||
// achieve that by processing them in decending row order.
|
||||
// achieve that by processing them in descending row order.
|
||||
for (auto& row_index : row_indexes)
|
||||
{
|
||||
row_index = model_.mapToSource (row_index);
|
||||
@ -79,38 +80,47 @@ void AbstractLogWindow::impl::delete_QSOs ()
|
||||
|
||||
// reverse sort by row
|
||||
std::sort (row_indexes.begin (), row_indexes.end (), row_is_higher);
|
||||
|
||||
for (auto index : row_indexes)
|
||||
{
|
||||
auto row = model_.mapFromSource (index).row ();
|
||||
model_.removeRow (row);
|
||||
self_->log_model_changed ();
|
||||
auto row = model_.mapFromSource(index).row();
|
||||
model_.removeRow(row);
|
||||
self_->log_model_changed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
AbstractLogWindow::AbstractLogWindow (QString const& settings_key, QSettings * settings
|
||||
, Configuration const * configuration
|
||||
, QWidget * parent)
|
||||
: QWidget {parent}
|
||||
, m_ {this, settings_key, settings, configuration}
|
||||
{
|
||||
// this attempt to scroll to the last new record doesn't work, some
|
||||
// sort of issue with model indexes and optimized DB fetches. For
|
||||
// now sorting by the same column and direction as the underlying DB
|
||||
// select and that DB select being in descending order so new rows
|
||||
// at the end appear at view row 0 gets the job done
|
||||
, m_ {this, settings_key, settings, configuration} {
|
||||
// when we're viewing the log by contact ID (visually, up/down chevron in the column heading),
|
||||
// when we add a contact, scroll the list to the top or bottom, depending on the sort order.
|
||||
// If the table is sorted by some other criteria, don't change anything.
|
||||
|
||||
// // ensure view scrolls to latest new row
|
||||
// connect (&m_->model_, &QAbstractItemModel::rowsInserted, this, [this] (QModelIndex const& parent, int first, int last) {
|
||||
// // note col 0 is hidden so use col 1
|
||||
// // queued connection required otherwise row may not be available
|
||||
// // in time
|
||||
// auto index = m_->model_.index (last, 1, parent);
|
||||
// if (m_->log_view_)
|
||||
// {
|
||||
// m_->log_view_->scrollTo (index);
|
||||
// }
|
||||
// }, Qt::QueuedConnection);
|
||||
connect(&m_->model_, &QAbstractItemModel::rowsInserted, this,
|
||||
[this](QModelIndex const &parent, int first, int last) {
|
||||
(void) (parent); // UNUSED
|
||||
(void) (first); // UNUSED
|
||||
(void) (last); // UNUSED
|
||||
QTimer::singleShot(0, [=] {
|
||||
// if we're sorting by the date, then show the most-recently logged contact.
|
||||
// Otherwise, leave the scroll alone
|
||||
auto horizontal_header = m_->log_view_->horizontalHeader ();
|
||||
if (horizontal_header->sortIndicatorSection() == 3) { // sorting on date?
|
||||
if (horizontal_header->sortIndicatorOrder() == Qt::AscendingOrder) {
|
||||
// we're sorting oldes->newest, so go to bottom
|
||||
m_->log_view_->scrollToBottom();
|
||||
} else {
|
||||
m_->log_view_->scrollToTop();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
AbstractLogWindow::~AbstractLogWindow ()
|
||||
@ -134,11 +144,14 @@ void AbstractLogWindow::set_log_view (QTableView * log_view)
|
||||
log_view->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
|
||||
m_->model_.setSourceModel (log_view->model ());
|
||||
log_view->setModel (&m_->model_);
|
||||
log_view->setColumnHidden (0, true);
|
||||
log_view->setColumnHidden (0, true); // hide the ID column
|
||||
auto horizontal_header = log_view->horizontalHeader ();
|
||||
|
||||
horizontal_header->setResizeContentsPrecision (0); // visible region only
|
||||
horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents);
|
||||
horizontal_header->setSectionsMovable (true);
|
||||
horizontal_header->setSortIndicator(3, Qt::AscendingOrder); // sort by the contact datetime oldest->newest
|
||||
|
||||
auto vertical_header = log_view->horizontalHeader ();
|
||||
vertical_header->setResizeContentsPrecision (0); // visible region only
|
||||
vertical_header->setSectionResizeMode (QHeaderView::ResizeToContents);
|
||||
@ -149,6 +162,9 @@ void AbstractLogWindow::set_log_view (QTableView * log_view)
|
||||
connect (delete_action, &QAction::triggered, [this] (bool /*checked*/) {
|
||||
m_->delete_QSOs ();
|
||||
});
|
||||
|
||||
// scroll to bottom, since we're showing 1-N
|
||||
log_view->scrollToBottom();
|
||||
}
|
||||
|
||||
void AbstractLogWindow::set_log_view_font (QFont const& font)
|
||||
|
@ -70,7 +70,9 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const
|
||||
m_->ui_.log_table_view->setItemDelegateForColumn (3, new SQLiteDateTimeDelegate {this});
|
||||
m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this});
|
||||
auto h_header = m_->ui_.log_table_view->horizontalHeader ();
|
||||
m_->ui_.log_table_view->verticalHeader()->setVisible(false); // turn off line numbers for the table view
|
||||
h_header->moveSection (7, 1); // band to first column
|
||||
|
||||
}
|
||||
|
||||
CabrilloLogWindow::~CabrilloLogWindow ()
|
||||
@ -88,3 +90,10 @@ void CabrilloLogWindow::log_model_changed (int row)
|
||||
m_->log_model_->select ();
|
||||
}
|
||||
}
|
||||
|
||||
void CabrilloLogWindow::set_nQSO(int n)
|
||||
{
|
||||
QString t;
|
||||
t=t.asprintf("%d QSOs",n);
|
||||
m_->ui_.nQSO_lineEdit->setText(t);
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ public:
|
||||
explicit CabrilloLogWindow (QSettings *, Configuration const *, QSqlTableModel * cabrillo_log_model
|
||||
, QWidget * parent = nullptr);
|
||||
~CabrilloLogWindow ();
|
||||
Q_SLOT void set_nQSO(int n);
|
||||
|
||||
private:
|
||||
void log_model_changed (int row) override;
|
||||
|
@ -27,6 +27,25 @@
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="nQSO_lineEdit">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>100</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>0 QSOs</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
@ -39,8 +39,8 @@ namespace
|
||||
FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent)
|
||||
: QLineEdit (parent)
|
||||
{
|
||||
setValidator (new MHzValidator {-std::numeric_limits<FrequencyDelta>::max () / 10.e6,
|
||||
std::numeric_limits<FrequencyDelta>::max () / 10.e6, this});
|
||||
setValidator (new MHzValidator {static_cast<double>(std::numeric_limits<FrequencyDelta>::min ()) / 10.e6,
|
||||
static_cast<double>(std::numeric_limits<FrequencyDelta>::max ()) / 10.e6, this});
|
||||
}
|
||||
|
||||
auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta
|
||||
|
@ -39,7 +39,7 @@ namespace
|
||||
FrequencyLineEdit::FrequencyLineEdit (QWidget * parent)
|
||||
: QLineEdit (parent)
|
||||
{
|
||||
setValidator (new MHzValidator {0., std::numeric_limits<Radio::Frequency>::max () / 10.e6, this});
|
||||
setValidator (new MHzValidator {0., static_cast<double>(std::numeric_limits<Radio::Frequency>::max ()) / 10.e6, this});
|
||||
}
|
||||
|
||||
auto FrequencyLineEdit::frequency () const -> Frequency
|
||||
|
@ -15,11 +15,15 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
|
||||
|
||||
ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v"
|
||||
+ QCoreApplication::applicationVersion ()
|
||||
+ " " + revision ()}.simplified () + "</h2><br />"
|
||||
+ " " + revision ()}.simplified () + "</h2>"
|
||||
"<h3> In memory of G4WJS, Bill Somerville (1956-2021),<br />"
|
||||
"who gave so much of himself to the WSJT project. </h3>"
|
||||
|
||||
"WSJT-X implements a number of digital modes designed for <br />"
|
||||
"weak-signal Amateur Radio communication. <br /><br />"
|
||||
"© 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
||||
"Steve Franke, K9AN, and Nico Palermo, IV3NWV. <br /><br />"
|
||||
"© 2001-2022 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
||||
"Steve Franke, K9AN, Nico Palermo, IV3NWV, <br />"
|
||||
"Chester Fennell, KG4IYS, and Uwe Risse, DG2YCB <br /><br />"
|
||||
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
|
||||
"DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT,<br />"
|
||||
"KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,<br />"
|
||||
|
125
widgets/activeStations.cpp
Normal file
@ -0,0 +1,125 @@
|
||||
#include "activeStations.h"
|
||||
|
||||
#include <QSettings>
|
||||
#include <QApplication>
|
||||
#include <QTextCharFormat>
|
||||
#include <QDateTime>
|
||||
#include <QDebug>
|
||||
|
||||
#include "SettingsGroup.hpp"
|
||||
#include "qt_helpers.hpp"
|
||||
#include "ui_activeStations.h"
|
||||
|
||||
#include "moc_activeStations.cpp"
|
||||
|
||||
ActiveStations::ActiveStations(QSettings * settings, QFont const& font, QWidget *parent) :
|
||||
QWidget(parent),
|
||||
settings_ {settings},
|
||||
ui(new Ui::ActiveStations)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setWindowTitle (QApplication::applicationName () + " - " + tr ("Active Stations"));
|
||||
ui->RecentStationsPlainTextEdit->setReadOnly (true);
|
||||
changeFont (font);
|
||||
read_settings ();
|
||||
ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts");
|
||||
connect(ui->RecentStationsPlainTextEdit, SIGNAL(selectionChanged()), this, SLOT(select()));
|
||||
connect(ui->cbReadyOnly, SIGNAL(toggled(bool)), this, SLOT(on_cbReadyOnly_toggled(bool)));
|
||||
}
|
||||
|
||||
ActiveStations::~ActiveStations()
|
||||
{
|
||||
write_settings ();
|
||||
}
|
||||
|
||||
void ActiveStations::changeFont (QFont const& font)
|
||||
{
|
||||
ui->header_label2->setStyleSheet (font_as_stylesheet (font));
|
||||
ui->RecentStationsPlainTextEdit->setStyleSheet (font_as_stylesheet (font));
|
||||
updateGeometry ();
|
||||
}
|
||||
|
||||
void ActiveStations::read_settings ()
|
||||
{
|
||||
SettingsGroup group {settings_, "ActiveStations"};
|
||||
restoreGeometry (settings_->value ("window/geometry").toByteArray ());
|
||||
ui->sbMaxRecent->setValue(settings_->value("MaxRecent",10).toInt());
|
||||
ui->sbMaxAge->setValue(settings_->value("MaxAge",10).toInt());
|
||||
ui->cbReadyOnly->setChecked(settings_->value("ReadyOnly",false).toBool());
|
||||
}
|
||||
|
||||
void ActiveStations::write_settings ()
|
||||
{
|
||||
SettingsGroup group {settings_, "ActiveStations"};
|
||||
settings_->setValue ("window/geometry", saveGeometry ());
|
||||
settings_->setValue("MaxRecent",ui->sbMaxRecent->value());
|
||||
settings_->setValue("MaxAge",ui->sbMaxAge->value());
|
||||
settings_->setValue("ReadyOnly",ui->cbReadyOnly->isChecked());
|
||||
}
|
||||
|
||||
void ActiveStations::displayRecentStations(QString const& t)
|
||||
{
|
||||
ui->RecentStationsPlainTextEdit->setPlainText(t);
|
||||
}
|
||||
|
||||
int ActiveStations::maxRecent()
|
||||
{
|
||||
return ui->sbMaxRecent->value();
|
||||
}
|
||||
|
||||
int ActiveStations::maxAge()
|
||||
{
|
||||
return ui->sbMaxAge->value();
|
||||
}
|
||||
|
||||
void ActiveStations::select()
|
||||
{
|
||||
if(m_clickOK) {
|
||||
qint64 msec=QDateTime::currentMSecsSinceEpoch();
|
||||
if((msec-m_msec0)<500) return;
|
||||
m_msec0=msec;
|
||||
int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber();
|
||||
emit callSandP(nline);
|
||||
}
|
||||
}
|
||||
|
||||
void ActiveStations::setClickOK(bool b)
|
||||
{
|
||||
m_clickOK=b;
|
||||
}
|
||||
|
||||
void ActiveStations::erase()
|
||||
{
|
||||
ui->RecentStationsPlainTextEdit->clear();
|
||||
}
|
||||
|
||||
bool ActiveStations::readyOnly()
|
||||
{
|
||||
return ui->cbReadyOnly->isChecked();
|
||||
}
|
||||
|
||||
void ActiveStations::on_cbReadyOnly_toggled(bool b)
|
||||
{
|
||||
m_bReadyOnly=b;
|
||||
emit activeStationsDisplay();
|
||||
}
|
||||
|
||||
void ActiveStations::setRate(int n)
|
||||
{
|
||||
ui->rate->setText(QString::number(n));
|
||||
}
|
||||
|
||||
void ActiveStations::setScore(int n)
|
||||
{
|
||||
ui->score->setText(QLocale(QLocale::English).toString(n));
|
||||
}
|
||||
|
||||
void ActiveStations::setBandChanges(int n)
|
||||
{
|
||||
if(n >= 8) {
|
||||
ui->bandChanges->setStyleSheet("QLineEdit{background: rgb(255, 64, 64)}");
|
||||
} else {
|
||||
ui->bandChanges->setStyleSheet ("");
|
||||
}
|
||||
ui->bandChanges->setText(QString::number(n));
|
||||
}
|
52
widgets/activeStations.h
Normal file
@ -0,0 +1,52 @@
|
||||
// -*- Mode: C++ -*-
|
||||
#ifndef ARRL_DIGI_H_
|
||||
#define ARRL_DIGI_H_
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class QSettings;
|
||||
class QFont;
|
||||
|
||||
namespace Ui {
|
||||
class ActiveStations;
|
||||
}
|
||||
|
||||
class ActiveStations
|
||||
: public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ActiveStations(QSettings *, QFont const&, QWidget * parent = 0);
|
||||
~ActiveStations();
|
||||
void displayRecentStations(QString const&);
|
||||
void changeFont (QFont const&);
|
||||
int maxRecent();
|
||||
int maxAge();
|
||||
void setClickOK(bool b);
|
||||
void erase();
|
||||
bool readyOnly();
|
||||
void setRate(int n);
|
||||
void setBandChanges(int n);
|
||||
void setScore(int n);
|
||||
Q_SLOT void select();
|
||||
|
||||
bool m_clickOK=false;
|
||||
bool m_bReadyOnly;
|
||||
|
||||
signals:
|
||||
void callSandP(int nline);
|
||||
void activeStationsDisplay();
|
||||
|
||||
private:
|
||||
void read_settings ();
|
||||
void write_settings ();
|
||||
Q_SLOT void on_cbReadyOnly_toggled(bool b);
|
||||
|
||||
qint64 m_msec0=0;
|
||||
QSettings * settings_;
|
||||
|
||||
QScopedPointer<Ui::ActiveStations> ui;
|
||||
};
|
||||
|
||||
#endif
|
202
widgets/activeStations.ui
Normal file
@ -0,0 +1,202 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ActiveStations</class>
|
||||
<widget class="QWidget" name="ActiveStations">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>395</width>
|
||||
<height>339</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Message Averaging</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="2" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QSpinBox" name="sbMaxRecent">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Set maximum number of displayed lines.</p></body></html></string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>Max N </string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>10</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="5">
|
||||
<widget class="QLineEdit" name="rate">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Points logged during the past hour.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>0</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSpinBox" name="sbMaxAge">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Set maximum elapsed number of T/R sequences.</p></body></html></string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>Max Age </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>4</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="4">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Score:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Rate:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="5">
|
||||
<widget class="QLineEdit" name="score">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Total score accumulated since most recent reset of Cabrillo log.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>0</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QCheckBox" name="cbReadyOnly">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Check tis box to show only stations ready to be called.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ready only</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Band Changes:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLineEdit" name="bandChanges">
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Number of band changes during the past hour.</p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>0</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPlainTextEdit" name="RecentStationsPlainTextEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Click on a line to call that station.</p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="header_label2">
|
||||
<property name="text">
|
||||
<string>Call Grid Age Points</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -121,12 +121,6 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
|
||||
AzElFileName.toLocal8Bit ().constData (),
|
||||
jpleph.toLocal8Bit ().constData ());
|
||||
|
||||
if(!hisgrid.size ()) {
|
||||
azmoondx=0.0;
|
||||
elmoondx=0.0;
|
||||
m_dop=0;
|
||||
width2=0.0;
|
||||
}
|
||||
QString message;
|
||||
{
|
||||
QTextStream out {&message};
|
||||
|
@ -277,6 +277,8 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons
|
||||
gridB4onBand=true;
|
||||
}
|
||||
|
||||
if(callB4onBand) m_points=0;
|
||||
|
||||
message = message.trimmed ();
|
||||
|
||||
highlight_types types;
|
||||
@ -372,11 +374,17 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons
|
||||
}
|
||||
m_CQPriority=DecodeHighlightingModel::highlight_name(top_highlight);
|
||||
|
||||
if(((m_points == 00) or (m_points == -1)) and m_bDisplayPoints) return message;
|
||||
return leftJustifyAppendage (message, extra);
|
||||
}
|
||||
|
||||
QString DisplayText::leftJustifyAppendage (QString message, QString const& appendage) const
|
||||
QString DisplayText::leftJustifyAppendage (QString message, QString const& appendage0) const
|
||||
{
|
||||
QString appendage=appendage0;
|
||||
if(m_bDisplayPoints and (m_points>0)) {
|
||||
appendage=" " + QString::number(m_points);
|
||||
if(m_points<10) appendage=" " + appendage;
|
||||
}
|
||||
if (appendage.size ())
|
||||
{
|
||||
// allow for seconds
|
||||
@ -398,12 +406,15 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
|
||||
QString const& mode,
|
||||
bool displayDXCCEntity, LogBook const& logBook,
|
||||
QString const& currentBand, bool ppfx, bool bCQonly,
|
||||
bool haveFSpread, float fSpread)
|
||||
bool haveFSpread, float fSpread, bool bDisplayPoints, int points)
|
||||
{
|
||||
m_points=points;
|
||||
m_bDisplayPoints=bDisplayPoints;
|
||||
m_bPrincipalPrefix=ppfx;
|
||||
QColor bg;
|
||||
QColor fg;
|
||||
bool CQcall = false;
|
||||
auto is_73 = decodedText.messageWords().filter (QRegularExpression {"^(73|RR73)$"}).size();
|
||||
if (decodedText.string ().contains (" CQ ")
|
||||
|| decodedText.string ().contains (" CQDX ")
|
||||
|| decodedText.string ().contains (" QRZ "))
|
||||
@ -413,19 +424,6 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
|
||||
else
|
||||
{
|
||||
if (bCQonly) return;
|
||||
if (myCall.size ())
|
||||
{
|
||||
QString regexp {"[ <]" + myCall + "[ >]"};
|
||||
if (Radio::is_compound_callsign (myCall))
|
||||
{
|
||||
regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])";
|
||||
}
|
||||
if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp}))
|
||||
{
|
||||
highlight_types types {Highlight::MyCall};
|
||||
set_colours (m_config, &bg, &fg, types);
|
||||
}
|
||||
}
|
||||
}
|
||||
auto message = decodedText.string();
|
||||
QString dxCall;
|
||||
@ -446,14 +444,14 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
|
||||
message = message.left (ap_pos).trimmed ();
|
||||
}
|
||||
m_CQPriority="";
|
||||
if (CQcall)
|
||||
if (CQcall || (is_73 && (m_config->highlight_73 ())))
|
||||
{
|
||||
if (displayDXCCEntity)
|
||||
{
|
||||
// if enabled add the DXCC entity and B4 status to the end of the
|
||||
// preformated text line t1
|
||||
auto currentMode = mode;
|
||||
message = appendWorkedB4 (message, decodedText.CQersCall(), dxGrid, &bg, &fg
|
||||
message = appendWorkedB4 (message, dxCall, dxGrid, &bg, &fg
|
||||
, logBook, currentBand, currentMode, extra);
|
||||
}
|
||||
else
|
||||
@ -472,6 +470,20 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
|
||||
message = leftJustifyAppendage (message, extra);
|
||||
}
|
||||
|
||||
if (myCall.size ())
|
||||
{
|
||||
QString regexp {"[ <]" + myCall + "[ >]"};
|
||||
if (Radio::is_compound_callsign (myCall))
|
||||
{
|
||||
regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])";
|
||||
}
|
||||
if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp}))
|
||||
{
|
||||
highlight_types types {Highlight::MyCall};
|
||||
set_colours (m_config, &bg, &fg, types);
|
||||
}
|
||||
}
|
||||
|
||||
appendText (message.trimmed (), bg, fg, decodedText.call (), dxCall);
|
||||
}
|
||||
|
||||
|
@ -30,12 +30,14 @@ public:
|
||||
void displayDecodedText(DecodedText const& decodedText, QString const& myCall, QString const& mode,
|
||||
bool displayDXCCEntity, LogBook const& logBook,
|
||||
QString const& currentBand=QString {}, bool ppfx=false, bool bCQonly=false,
|
||||
bool haveFSpread = false, float fSpread = 0.);
|
||||
bool haveFSpread = false, float fSpread = 0.0, bool bDisplayPoints=false, int points=-99);
|
||||
void displayTransmittedText(QString text, QString modeTx, qint32 txFreq, bool bFastMode, double TRperiod);
|
||||
void displayQSY(QString text);
|
||||
void displayFoxToBeCalled(QString t, QColor bg = QColor {}, QColor fg = QColor {});
|
||||
void new_period ();
|
||||
QString CQPriority(){return m_CQPriority;};
|
||||
qint32 m_points;
|
||||
bool m_bDisplayPoints;
|
||||
|
||||
Q_SIGNAL void selectCallsign (Qt::KeyboardModifiers);
|
||||
Q_SIGNAL void erased ();
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <QSettings>
|
||||
#include <QStandardPaths>
|
||||
#include <QDir>
|
||||
#include <QPushButton>
|
||||
|
||||
#include "logbook/logbook.h"
|
||||
#include "MessageBox.hpp"
|
||||
@ -109,6 +110,15 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
|
||||
Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd)
|
||||
{
|
||||
if(!isHidden()) return;
|
||||
|
||||
QPushButton* okBtn = ui->buttonBox->button(QDialogButtonBox::Ok);
|
||||
okBtn->setAutoDefault(true);
|
||||
okBtn->setDefault(true);
|
||||
okBtn->setFocus();
|
||||
QPushButton* caBtn = ui->buttonBox->button(QDialogButtonBox::Cancel);
|
||||
caBtn->setAutoDefault(false);
|
||||
caBtn->setDefault(false);
|
||||
|
||||
ui->call->setText (hisCall);
|
||||
ui->grid->setText (hisGrid);
|
||||
ui->name->clear ();
|
||||
|
@ -78,6 +78,7 @@ class WideGraph;
|
||||
class LogQSO;
|
||||
class Transceiver;
|
||||
class MessageAveraging;
|
||||
class ActiveStations;
|
||||
class FoxLogWindow;
|
||||
class CabrilloLogWindow;
|
||||
class ColorHighlighting;
|
||||
@ -141,6 +142,12 @@ private:
|
||||
|
||||
private slots:
|
||||
void initialize_fonts ();
|
||||
void on_houndButton_clicked(bool checked);
|
||||
void on_ft8Button_clicked();
|
||||
void on_ft4Button_clicked();
|
||||
void on_msk144Button_clicked();
|
||||
void on_q65Button_clicked();
|
||||
void on_jt65Button_clicked();
|
||||
void on_tx1_editingFinished();
|
||||
void on_tx2_editingFinished();
|
||||
void on_tx3_editingFinished();
|
||||
@ -204,6 +211,7 @@ private slots:
|
||||
void on_addButton_clicked();
|
||||
void on_dxCallEntry_textChanged (QString const&);
|
||||
void on_dxGridEntry_textChanged (QString const&);
|
||||
void on_dxCallEntry_editingFinished();
|
||||
void on_dxCallEntry_returnPressed ();
|
||||
void on_genStdMsgsPushButton_clicked();
|
||||
void on_logQSOButton_clicked();
|
||||
@ -260,6 +268,7 @@ private slots:
|
||||
void stopTuneATU();
|
||||
void auto_tx_mode(bool);
|
||||
void on_actionMessage_averaging_triggered();
|
||||
void on_actionActiveStations_triggered();
|
||||
void on_contest_log_action_triggered ();
|
||||
void on_fox_log_action_triggered ();
|
||||
void on_actionColors_triggered();
|
||||
@ -274,7 +283,6 @@ private slots:
|
||||
void on_cbTx6_toggled(bool b);
|
||||
void on_cbMenus_toggled(bool b);
|
||||
void on_cbCQonly_toggled(bool b);
|
||||
void on_cbFirst_toggled(bool b);
|
||||
void on_cbAutoSeq_toggled(bool b);
|
||||
void networkError (QString const&);
|
||||
void on_ClrAvgButton_clicked();
|
||||
@ -326,6 +334,7 @@ private slots:
|
||||
void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
|
||||
, bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
|
||||
, QString const& dx_grid, bool generate_messages);
|
||||
void callSandP2(int nline);
|
||||
|
||||
private:
|
||||
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
|
||||
@ -391,6 +400,7 @@ private:
|
||||
QScopedPointer<HelpTextWindow> m_prefixes;
|
||||
QScopedPointer<HelpTextWindow> m_mouseCmnds;
|
||||
QScopedPointer<MessageAveraging> m_msgAvgWidget;
|
||||
QScopedPointer<ActiveStations> m_ActiveStationsWidget;
|
||||
QScopedPointer<FoxLogWindow> m_foxLogWindow;
|
||||
QScopedPointer<CabrilloLogWindow> m_contestLogWindow;
|
||||
QScopedPointer<ColorHighlighting> m_colorHighlighting;
|
||||
@ -415,6 +425,7 @@ private:
|
||||
qint64 m_fullFoxCallTime;
|
||||
|
||||
Frequency m_freqNominal;
|
||||
Frequency m_freqNominalPeriod;
|
||||
Frequency m_freqTxNominal;
|
||||
Astro::Correction m_astroCorrection;
|
||||
bool m_reverse_Doppler;
|
||||
@ -450,6 +461,9 @@ private:
|
||||
qint32 m_secID;
|
||||
qint32 m_idleMinutes;
|
||||
qint32 m_nSubMode;
|
||||
qint32 m_nSubMode_Q65;
|
||||
qint32 m_nSubMode_JT65;
|
||||
qint32 m_nSubMode_JT4;
|
||||
qint32 m_nclearave;
|
||||
qint32 m_minSync;
|
||||
qint32 m_dBm;
|
||||
@ -482,6 +496,10 @@ private:
|
||||
qint32 m_earlyDecode=41;
|
||||
qint32 m_earlyDecode2=47;
|
||||
qint32 m_nDecodes=0;
|
||||
qint32 m_maxPoints=-1;
|
||||
qint32 m_latestDecodeTime=-1;
|
||||
qint32 m_points=-99;
|
||||
qint32 m_score=0;
|
||||
|
||||
bool m_btxok; //True if OK to transmit
|
||||
bool m_diskData;
|
||||
@ -628,11 +646,15 @@ private:
|
||||
QString m_xSent; //Contest exchange sent
|
||||
QString m_xRcvd; //Contest exchange received
|
||||
QString m_currentBand;
|
||||
QString m_currentBandPeriod;
|
||||
QString m_nextCall;
|
||||
QString m_nextGrid;
|
||||
QString m_fileDateTime;
|
||||
QString m_inQSOwith;
|
||||
QString m_BestCQpriority;
|
||||
QString m_deCall;
|
||||
QString m_deGrid;
|
||||
QString m_ready2call[50];
|
||||
|
||||
QSet<QString> m_pfx;
|
||||
QSet<QString> m_sfx;
|
||||
@ -660,6 +682,34 @@ private:
|
||||
};
|
||||
QMap<QString,FixupQSO> m_fixupQSO; //Key = HoundCall, value = info for QSO in progress
|
||||
|
||||
struct ActiveCall
|
||||
{
|
||||
QString grid4;
|
||||
QString bands;
|
||||
qint32 az;
|
||||
qint32 points;
|
||||
};
|
||||
QMap<QString,ActiveCall> m_activeCall; //Key = callsign, value = grid4, az, points for ARRL_DIGI
|
||||
|
||||
struct RecentCall
|
||||
{
|
||||
qint64 dialFreq;
|
||||
qint32 audioFreq;
|
||||
qint32 snr;
|
||||
qint32 decodeTime;
|
||||
bool txEven;
|
||||
bool ready2call;
|
||||
};
|
||||
QMap<QString,RecentCall> m_recentCall; //Key = callsign, value = snr, dialFreq, audioFreq, decodeTime
|
||||
|
||||
struct ARRL_logged
|
||||
{
|
||||
QDateTime time;
|
||||
QString band;
|
||||
qint32 points;
|
||||
};
|
||||
QList<ARRL_logged> m_arrl_log;
|
||||
|
||||
QQueue<QString> m_houndQueue; //Selected Hounds available for starting a QSO
|
||||
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
|
||||
QQueue<qint64> m_foxRateQueue;
|
||||
@ -740,6 +790,7 @@ private:
|
||||
void CQTxFreq();
|
||||
void useNextCall();
|
||||
void abortQSO();
|
||||
void updateRate();
|
||||
void write_all(QString txRx, QString message);
|
||||
bool isWorked(int itype, QString key, float fMHz=0, QString="");
|
||||
|
||||
@ -780,6 +831,9 @@ private:
|
||||
void to_jt9(qint32 n, qint32 istart, qint32 idone);
|
||||
bool is77BitMode () const;
|
||||
void cease_auto_Tx_after_QSO ();
|
||||
Q_SLOT void ARRL_Digi_Display();
|
||||
void ARRL_Digi_Update(DecodedText dt);
|
||||
void activeWorked(QString call, QString band);
|
||||
};
|
||||
|
||||
extern int killbyname(const char* progName);
|
||||
|
@ -77,7 +77,7 @@ SignalMeter::SignalMeter (QWidget * parent)
|
||||
outer_layout->setSpacing (0);
|
||||
|
||||
auto inner_layout = new QHBoxLayout;
|
||||
inner_layout->setContentsMargins (9, 0, 9, 0);
|
||||
inner_layout->setContentsMargins (1, 0, 1, 0);
|
||||
inner_layout->setSpacing (0);
|
||||
|
||||
m_meter = new MeterWidget;
|
||||
|
@ -4,6 +4,7 @@ SOURCES += \
|
||||
widgets/meterwidget.cpp widgets/signalmeter.cpp \
|
||||
widgets/plotter.cpp widgets/widegraph.cpp widgets/about.cpp \
|
||||
widgets/mainwindow.cpp widgets/messageaveraging.cpp \
|
||||
widgets/activeStations.cpp \
|
||||
widgets/echoplot.cpp widgets/echograph.cpp widgets/fastgraph.cpp \
|
||||
widgets/fastplot.cpp widgets/MessageBox.cpp \
|
||||
widgets/colorhighlighting.cpp widgets/ExportCabrillo.cpp \
|
||||
@ -19,6 +20,7 @@ HEADERS += \
|
||||
widgets/displaytext.h widgets/logqso.h widgets/LettersSpinBox.hpp \
|
||||
widgets/FrequencyLineEdit.hpp widgets/FrequencyDeltaLineEdit.hpp widgets/signalmeter.h \
|
||||
widgets/meterwidget.h widgets/messageaveraging.h \
|
||||
widgets/activeStations.h \
|
||||
widgets/echoplot.h widgets/echograph.h widgets/fastgraph.h \
|
||||
widgets/fastplot.h widgets/MessageBox.hpp widgets/colorhighlighting.h \
|
||||
widgets/ExportCabrillo.h widgets/AbstractLogWindow.hpp \
|
||||
@ -31,6 +33,7 @@ FORMS += \
|
||||
widgets/mainwindow.ui widgets/about.ui \
|
||||
widgets/widegraph.ui widgets/astro.ui \
|
||||
widgets/logqso.ui widgets/messageaveraging.ui \
|
||||
widgets/activeStations.ui \
|
||||
widgets/echograph.ui widgets/fastgraph.ui \
|
||||
widgets/colorhighlighting.ui widgets/ExportCabrillo.ui \
|
||||
widgets/FoxLogWindow.ui widgets/CabrilloLogWindow.ui
|
||||
|