mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-07-29 12:12:27 -04:00
Merge branch 'develop' into feat-dropped-frames
This commit is contained in:
commit
66e887b2f9
5
Audio/Audio.pri
Normal file
5
Audio/Audio.pri
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
SOURCES += Audio/AudioDevice.cpp Audio/BWFFile.cpp Audio/soundin.cpp \
|
||||||
|
Audio/soundout.cpp
|
||||||
|
|
||||||
|
HEADERS += Audio/AudioDevice.hpp Audio/BWFFile.hpp Audio/soundin.h \
|
||||||
|
Audio/soundout.h
|
@ -618,6 +618,7 @@ set (wsjt_FSRCS
|
|||||||
lib/fst4/osd240_101.f90
|
lib/fst4/osd240_101.f90
|
||||||
lib/fst4/osd240_74.f90
|
lib/fst4/osd240_74.f90
|
||||||
lib/fst4/get_crc24.f90
|
lib/fst4/get_crc24.f90
|
||||||
|
lib/fst4/fst4_baseline.f90
|
||||||
)
|
)
|
||||||
|
|
||||||
# temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit
|
# temporary workaround for a gfortran v7.3 ICE on Fedora 27 64-bit
|
||||||
|
@ -901,7 +901,7 @@ auto Configuration::special_op_id () const -> SpecialOperatingActivity
|
|||||||
void Configuration::set_location (QString const& grid_descriptor)
|
void Configuration::set_location (QString const& grid_descriptor)
|
||||||
{
|
{
|
||||||
// change the dynamic grid
|
// change the dynamic grid
|
||||||
qDebug () << "Configuration::set_location - location:" << grid_descriptor;
|
// qDebug () << "Configuration::set_location - location:" << grid_descriptor;
|
||||||
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2618,7 +2618,7 @@ void Configuration::impl::transceiver_frequency (Frequency f)
|
|||||||
current_offset_ = stations_.offset (f);
|
current_offset_ = stations_.offset (f);
|
||||||
cached_rig_state_.frequency (apply_calibration (f + current_offset_));
|
cached_rig_state_.frequency (apply_calibration (f + current_offset_));
|
||||||
|
|
||||||
qDebug () << "Configuration::impl::transceiver_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
// qDebug () << "Configuration::impl::transceiver_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2644,7 +2644,7 @@ void Configuration::impl::transceiver_tx_frequency (Frequency f)
|
|||||||
cached_rig_state_.tx_frequency (apply_calibration (f + current_tx_offset_));
|
cached_rig_state_.tx_frequency (apply_calibration (f + current_tx_offset_));
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug () << "Configuration::impl::transceiver_tx_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
// qDebug () << "Configuration::impl::transceiver_tx_frequency: n:" << transceiver_command_number_ + 1 << "f:" << f;
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2653,7 +2653,7 @@ void Configuration::impl::transceiver_mode (MODE m)
|
|||||||
{
|
{
|
||||||
cached_rig_state_.online (true); // we want the rig online
|
cached_rig_state_.online (true); // we want the rig online
|
||||||
cached_rig_state_.mode (m);
|
cached_rig_state_.mode (m);
|
||||||
qDebug () << "Configuration::impl::transceiver_mode: n:" << transceiver_command_number_ + 1 << "m:" << m;
|
// qDebug () << "Configuration::impl::transceiver_mode: n:" << transceiver_command_number_ + 1 << "m:" << m;
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2662,7 +2662,7 @@ void Configuration::impl::transceiver_ptt (bool on)
|
|||||||
cached_rig_state_.online (true); // we want the rig online
|
cached_rig_state_.online (true); // we want the rig online
|
||||||
set_cached_mode ();
|
set_cached_mode ();
|
||||||
cached_rig_state_.ptt (on);
|
cached_rig_state_.ptt (on);
|
||||||
qDebug () << "Configuration::impl::transceiver_ptt: n:" << transceiver_command_number_ + 1 << "on:" << on;
|
// qDebug () << "Configuration::impl::transceiver_ptt: n:" << transceiver_command_number_ + 1 << "on:" << on;
|
||||||
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
Q_EMIT set_transceiver (cached_rig_state_, ++transceiver_command_number_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,6 +577,9 @@ quiet period when decoding is done.</string>
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Serial Port Parameters</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Serial Port Parameters</string>
|
<string>Serial Port Parameters</string>
|
||||||
</property>
|
</property>
|
||||||
@ -659,6 +662,9 @@ quiet period when decoding is done.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html></string>
|
<string><html><head/><body><p>Number of data bits used to communicate with your radio's CAT interface (usually eight).</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Data bits</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Data Bits</string>
|
<string>Data Bits</string>
|
||||||
</property>
|
</property>
|
||||||
@ -710,6 +716,9 @@ quiet period when decoding is done.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html></string>
|
<string><html><head/><body><p>Number of stop bits used when communicating with your radio's CAT interface</p><p>(consult you radio's manual for details).</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Stop bits</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Stop Bits</string>
|
<string>Stop Bits</string>
|
||||||
</property>
|
</property>
|
||||||
@ -758,6 +767,9 @@ quiet period when decoding is done.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html></string>
|
<string><html><head/><body><p>Flow control protocol used between this computer and your radio's CAT interface (usually &quot;None&quot; but some require &quot;Hardware&quot;).</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Handshake</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Handshake</string>
|
<string>Handshake</string>
|
||||||
</property>
|
</property>
|
||||||
@ -824,6 +836,9 @@ a few, particularly some Kenwood rigs, require it).</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Special control of CAT port control lines.</string>
|
<string>Special control of CAT port control lines.</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Force Control Lines</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Force Control Lines</string>
|
<string>Force Control Lines</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2346,6 +2361,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html></string>
|
<string><html><head/><body><p>URL of the ARRL LotW user's last upload dates and times data file which is used to highlight decodes from stations that are known to upload their log file to LotW.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>URL</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>https://lotw.arrl.org/lotw-user-activity.csv</string>
|
<string>https://lotw.arrl.org/lotw-user-activity.csv</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2378,6 +2396,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html></string>
|
<string><html><head/><body><p>Adjust this spin box to set the age threshold of LotW user's last upload date that is accepted as a current LotW user.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Days since last upload</string>
|
||||||
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> days</string>
|
<string> days</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2513,6 +2534,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></string>
|
<string><html><head/><body><p>FT8 DXpedition mode: Hound operator calling the DX.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Hound</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Hound</string>
|
<string>Hound</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2535,6 +2559,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<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>
|
<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>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>NA VHF Contest</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>NA VHF Contest</string>
|
<string>NA VHF Contest</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2548,6 +2575,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html></string>
|
<string><html><head/><body><p>FT8 DXpedition mode: Fox (DXpedition) operator.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Fox</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Fox</string>
|
<string>Fox</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2570,6 +2600,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html></string>
|
<string><html><head/><body><p>European VHF+ contests requiring a signal report, serial number, and 6-character locator.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>EU VHF Contest</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>EU VHF Contest</string>
|
<string>EU VHF Contest</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2598,6 +2631,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<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>
|
<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>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>R T T Y Roundup</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>RTTY Roundup messages</string>
|
<string>RTTY Roundup messages</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2623,6 +2659,9 @@ Right click for insert and delete options.</string>
|
|||||||
<layout class="QFormLayout" name="formLayout_17">
|
<layout class="QFormLayout" name="formLayout_17">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="labRTTY">
|
<widget class="QLabel" name="labRTTY">
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>RTTY Roundup exchange</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>RTTY RU Exch:</string>
|
<string>RTTY RU Exch:</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2661,6 +2700,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html></string>
|
<string><html><head/><body><p>ARRL Field Day exchange: number of transmitters, Class, and ARRL/RAC section or &quot;DX&quot;.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>A R R L Field Day</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>ARRL Field Day</string>
|
<string>ARRL Field Day</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2686,6 +2728,9 @@ Right click for insert and delete options.</string>
|
|||||||
<layout class="QFormLayout" name="formLayout_16">
|
<layout class="QFormLayout" name="formLayout_16">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="labFD">
|
<widget class="QLabel" name="labFD">
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Field Day exchange</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>FD Exch:</string>
|
<string>FD Exch:</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2728,6 +2773,9 @@ Right click for insert and delete options.</string>
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>World-Wide Digi-mode contest</p><p><br/></p></body></html></string>
|
<string><html><head/><body><p>World-Wide Digi-mode contest</p><p><br/></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>WW Digital Contest</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>WW Digi Contest</string>
|
<string>WW Digi Contest</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2840,6 +2888,9 @@ Right click for insert and delete options.</string>
|
|||||||
<height>50</height>
|
<height>50</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Tone spacing</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Tone spacing</string>
|
<string>Tone spacing</string>
|
||||||
</property>
|
</property>
|
||||||
@ -2878,6 +2929,9 @@ Right click for insert and delete options.</string>
|
|||||||
<height>50</height>
|
<height>50</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Waterfall spectra</string>
|
||||||
|
</property>
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Waterfall spectra</string>
|
<string>Waterfall spectra</string>
|
||||||
</property>
|
</property>
|
||||||
@ -3133,13 +3187,13 @@ Right click for insert and delete options.</string>
|
|||||||
</connection>
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<buttongroups>
|
<buttongroups>
|
||||||
<buttongroup name="PTT_method_button_group"/>
|
|
||||||
<buttongroup name="CAT_stop_bits_button_group"/>
|
|
||||||
<buttongroup name="CAT_handshake_button_group"/>
|
|
||||||
<buttongroup name="split_mode_button_group"/>
|
|
||||||
<buttongroup name="TX_mode_button_group"/>
|
|
||||||
<buttongroup name="TX_audio_source_button_group"/>
|
|
||||||
<buttongroup name="special_op_activity_button_group"/>
|
<buttongroup name="special_op_activity_button_group"/>
|
||||||
|
<buttongroup name="TX_mode_button_group"/>
|
||||||
|
<buttongroup name="CAT_stop_bits_button_group"/>
|
||||||
|
<buttongroup name="PTT_method_button_group"/>
|
||||||
|
<buttongroup name="split_mode_button_group"/>
|
||||||
|
<buttongroup name="TX_audio_source_button_group"/>
|
||||||
<buttongroup name="CAT_data_bits_button_group"/>
|
<buttongroup name="CAT_data_bits_button_group"/>
|
||||||
|
<buttongroup name="CAT_handshake_button_group"/>
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -13,6 +13,19 @@
|
|||||||
Copyright 2001 - 2020 by Joe Taylor, K1JT.
|
Copyright 2001 - 2020 by Joe Taylor, K1JT.
|
||||||
|
|
||||||
|
|
||||||
|
Release: WSJT-X 2.3.0-rc1
|
||||||
|
Sept DD, 2020
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
WSJT-X 2.3.0-rc1 is a beta-quality release candidate for a program
|
||||||
|
upgrade that provides a number of new features and capabilities.
|
||||||
|
These include:
|
||||||
|
|
||||||
|
- The *On Dx Echo* Doppler compensation method has been modified in
|
||||||
|
response to feedback from Users. Basic functionality is unchanged.
|
||||||
|
See the User Guide (Section 8.1) for more information.
|
||||||
|
|
||||||
|
|
||||||
Release: WSJT-X 2.2.2
|
Release: WSJT-X 2.2.2
|
||||||
June 22, 2020
|
June 22, 2020
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -14,6 +14,7 @@ QRA64 1111100101101101100000000010000000
|
|||||||
ISCAT 1001110000000001100000000000000000
|
ISCAT 1001110000000001100000000000000000
|
||||||
MSK144 1011111101000000000100010000000000
|
MSK144 1011111101000000000100010000000000
|
||||||
WSPR 0000000000000000010100000000000000
|
WSPR 0000000000000000010100000000000000
|
||||||
|
FST4 1111110001001110000100000001000000
|
||||||
FST4W 0000000000000000010100000000000001
|
FST4W 0000000000000000010100000000000001
|
||||||
Echo 0000000000000000000000100000000000
|
Echo 0000000000000000000000100000000000
|
||||||
FCal 0011010000000000000000000000010000
|
FCal 0011010000000000000000000000010000
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Status=review
|
// Status=edited
|
||||||
|
|
||||||
Source code for _WSJT-X_ is available from a public repository at
|
Source code for _WSJT-X_ is available from a public repository at
|
||||||
{devrepo}. To compile the program you will need to install at least the
|
{devrepo}. To compile the program, at a minimum you must install the
|
||||||
following packages:
|
following packages:
|
||||||
|
|
||||||
- Git
|
- Git
|
||||||
@ -19,7 +19,7 @@ cd wsjtx
|
|||||||
git checkout wsjtx-{VERSION}
|
git checkout wsjtx-{VERSION}
|
||||||
=====
|
=====
|
||||||
|
|
||||||
and for the current development branch,
|
and for the current development branch:
|
||||||
|
|
||||||
=====
|
=====
|
||||||
git clone git://git.code.sf.net/p/wsjt/wsjtx
|
git clone git://git.code.sf.net/p/wsjt/wsjtx
|
||||||
|
@ -1,16 +1,14 @@
|
|||||||
// Status=review
|
// Status=edited
|
||||||
|
|
||||||
Debian, Ubuntu, and other Debian-based systems including Raspbian:
|
Debian, Ubuntu, and other Debian-based systems including Raspbian:
|
||||||
|
|
||||||
NOTE: The project team release binary installer packages for Linux
|
NOTE: The project team release binary installer packages targeted for
|
||||||
when a new _WSJT-X_ release is announced. These are built to
|
one contemporary version of a Linux distribution. Although these may
|
||||||
target one contemporary version of a Linux distribution. Although
|
work on newer Linux versions or even different distributions, it is
|
||||||
these may work on newer Linux versions or even different
|
unlikely that they work on older versions. Check the notes provided
|
||||||
distributions, it is unlikely that they will work on older
|
with the release for details of the targeted Linux distributions and
|
||||||
versions. Check the notes provided with the release for details of the
|
versions. If the binary package is not compatible with your Linux
|
||||||
targeted Linux distributions and versions. If the binary package is
|
distribution or version, you must build the application from sources.
|
||||||
not compatible with your Linux distribution or version you must build
|
|
||||||
the application from sources.
|
|
||||||
|
|
||||||
* 32-bit: {debian32}
|
* 32-bit: {debian32}
|
||||||
- To install:
|
- To install:
|
||||||
@ -42,7 +40,6 @@ sudo dpkg -P wsjtx
|
|||||||
|
|
||||||
You may also need to execute the following command in a terminal:
|
You may also need to execute the following command in a terminal:
|
||||||
|
|
||||||
[example]
|
|
||||||
....
|
....
|
||||||
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
|
sudo apt install libgfortran5 libqt5widgets5 libqt5network5 \
|
||||||
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
|
libqt5printsupport5 libqt5multimedia5-plugins libqt5serialport5 \
|
||||||
@ -75,7 +72,6 @@ sudo rpm -e wsjtx
|
|||||||
|
|
||||||
You may also need to execute the following command in a terminal:
|
You may also need to execute the following command in a terminal:
|
||||||
|
|
||||||
[example]
|
|
||||||
....
|
....
|
||||||
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
|
sudo dnf install libgfortran fftw-libs-single qt5-qtbase \
|
||||||
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
|
qt5-qtmultimedia qt5-qtserialport qt5-qtsvg \
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
// These instructions are up-to-date for WSJT-X v2.2
|
// These instructions are up-to-date for WSJT-X v2.2
|
||||||
|
|
||||||
*OS X 10.12* and later: Download the file {osx} to your desktop,
|
*macOS10.13* and later: Download the file {osx} to your desktop,
|
||||||
double-click on it and consult its `ReadMe` file for important
|
double-click it and consult its `ReadMe` file for important
|
||||||
installation notes.
|
installation notes.
|
||||||
|
|
||||||
If you have already installed a previous version, you can retain it by
|
If you have already installed a previous version, you can retain it by
|
||||||
changing its name in the *Applications* folder (say, from _WSJT-X_ to
|
changing its name in the *Applications* folder (such as from _WSJT-X_ to
|
||||||
_WSJT-X_2.1_). You can then proceed to the installation phase.
|
_WSJT-X_2.2_). You can then proceed to the installation phase.
|
||||||
|
|
||||||
Take note also of the following:
|
Take note also of the following:
|
||||||
|
|
||||||
|
@ -21,18 +21,30 @@ TIP: Your computer may be configured so that this directory is
|
|||||||
`"%LocalAppData%\WSJT-X\"`.
|
`"%LocalAppData%\WSJT-X\"`.
|
||||||
|
|
||||||
* The built-in Windows facility for time synchronization is usually
|
* The built-in Windows facility for time synchronization is usually
|
||||||
not adequate. We recommend the program _Meinberg NTP_ (see
|
not adequate. We recommend the program _Meinberg NTP Client_ (see
|
||||||
{ntpsetup} for downloading and installation instructions) or
|
{ntpsetup} for downloading and installation instructions). Recent
|
||||||
_Dimension 4_ from {dimension4}. Recent versions of Windows 10 are
|
versions of Windows 10 are now shipped with a more capable Internet
|
||||||
now shipped with a more capable Internet time synchronization
|
time synchronization service that is suitable if configured
|
||||||
service that is suitable if configured appropriately.
|
appropriately. We do not recommend SNTP time setting tools or others
|
||||||
|
that make periodic correction steps, _WSJT-X_ requires that the PC
|
||||||
|
clock be monotonic.
|
||||||
|
|
||||||
|
NOTE: Having a PC clock that appears to be synchronized to UTC is not
|
||||||
|
sufficient, monotonicity means that the clock must not be
|
||||||
|
stepped backwards or forwards during corrections, instead the
|
||||||
|
clock frequency must be adjusted to correct synchronization
|
||||||
|
errors gradually.
|
||||||
|
|
||||||
[[OPENSSL]]
|
[[OPENSSL]]
|
||||||
|
|
||||||
image:LoTW_TLS_error.png[_WSJT-X_ LoTW download TLS error,
|
image:LoTW_TLS_error.png[_WSJT-X_ LoTW download TLS error,
|
||||||
align="center"]
|
align="center"]
|
||||||
|
|
||||||
* _WSJT-X_ requires installation of the _OpenSSL_ libraries. Suitable libraries may already be installed on your system. If they are not, you will see this error shortly after requesting a fetch of the latest LoTW users database. To fix this, install the _OpenSSL_ libraries.
|
* _WSJT-X_ requires installation of the _OpenSSL_ libraries. Suitable
|
||||||
|
libraries may already be installed on your system. If they are not,
|
||||||
|
you will see this error shortly after requesting a fetch of the
|
||||||
|
latest LoTW users database. To fix this, install the _OpenSSL_
|
||||||
|
libraries.
|
||||||
|
|
||||||
** You can download a suitable _OpenSSL_ package for Windows from
|
** You can download a suitable _OpenSSL_ package for Windows from
|
||||||
{win_openssl_packages}; you need the latest *Windows Light*
|
{win_openssl_packages}; you need the latest *Windows Light*
|
||||||
|
@ -4,7 +4,7 @@ _WSJT-X_ is a computer program designed to facilitate basic amateur
|
|||||||
radio communication using very weak signals. The first four letters in
|
radio communication using very weak signals. The first four letters in
|
||||||
the program name stand for "`**W**eak **S**ignal communication by
|
the program name stand for "`**W**eak **S**ignal communication by
|
||||||
K1**JT**,`" while the suffix "`-X`" indicates that _WSJT-X_ started as
|
K1**JT**,`" while the suffix "`-X`" indicates that _WSJT-X_ started as
|
||||||
an e**Xt**ended and e**X**perimental branch of the program _WSJT_,
|
an extended and experimental branch of the program _WSJT_,
|
||||||
first released in 2001. Bill Somerville, G4WJS, and Steve Franke,
|
first released in 2001. Bill Somerville, G4WJS, and Steve Franke,
|
||||||
K9AN, have been major contributors to program development since 2013
|
K9AN, have been major contributors to program development since 2013
|
||||||
and 2015, respectively.
|
and 2015, respectively.
|
||||||
@ -16,7 +16,7 @@ making reliable QSOs under weak-signal conditions. They use nearly
|
|||||||
identical message structure and source encoding. JT65 and QRA64 were
|
identical message structure and source encoding. JT65 and QRA64 were
|
||||||
designed for EME ("`moonbounce`") on the VHF/UHF bands and have also
|
designed for EME ("`moonbounce`") on the VHF/UHF bands and have also
|
||||||
proven very effective for worldwide QRP communication on the HF bands.
|
proven very effective for worldwide QRP communication on the HF bands.
|
||||||
QRA64 has a some advantages over JT65, including better performance
|
QRA64 has some advantages over JT65, including better performance
|
||||||
for EME on the higher microwave bands. JT9 was originally designed
|
for EME on the higher microwave bands. JT9 was originally designed
|
||||||
for the LF, MF, and lower HF bands. Its submode JT9A is 2 dB more
|
for the LF, MF, and lower HF bands. Its submode JT9A is 2 dB more
|
||||||
sensitive than JT65 while using less than 10% of the bandwidth. JT4
|
sensitive than JT65 while using less than 10% of the bandwidth. JT4
|
||||||
@ -27,7 +27,7 @@ reception, so a minimal QSO takes four to six minutes — two or three
|
|||||||
transmissions by each station, one sending in odd UTC minutes and the
|
transmissions by each station, one sending in odd UTC minutes and the
|
||||||
other even. FT8 is operationally similar but four times faster
|
other even. FT8 is operationally similar but four times faster
|
||||||
(15-second T/R sequences) and less sensitive by a few dB. FT4 is
|
(15-second T/R sequences) and less sensitive by a few dB. FT4 is
|
||||||
faster still (7.5 s T/R sequences) and especially well suited for
|
faster still (7.5 s T/R sequences) and especially well-suited for
|
||||||
radio contesting. On the HF bands, world-wide QSOs are possible with
|
radio contesting. On the HF bands, world-wide QSOs are possible with
|
||||||
any of these modes using power levels of a few watts (or even
|
any of these modes using power levels of a few watts (or even
|
||||||
milliwatts) and compromise antennas. On VHF bands and higher, QSOs
|
milliwatts) and compromise antennas. On VHF bands and higher, QSOs
|
||||||
@ -45,7 +45,7 @@ protocols designed to take advantage of brief signal enhancements from
|
|||||||
ionized meteor trails, aircraft scatter, and other types of scatter
|
ionized meteor trails, aircraft scatter, and other types of scatter
|
||||||
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
|
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
|
||||||
duration. User messages are transmitted repeatedly at high rate (up
|
duration. User messages are transmitted repeatedly at high rate (up
|
||||||
to 250 characters per second, for MSK144) to make good use of the
|
to 250 characters per second for MSK144) to make good use of the
|
||||||
shortest meteor-trail reflections or "`pings`". ISCAT uses free-form
|
shortest meteor-trail reflections or "`pings`". ISCAT uses free-form
|
||||||
messages up to 28 characters long, while MSK144 uses the same
|
messages up to 28 characters long, while MSK144 uses the same
|
||||||
structured messages as the slow modes and optionally an abbreviated
|
structured messages as the slow modes and optionally an abbreviated
|
||||||
@ -80,4 +80,4 @@ be beta releases leading up to the final release of v2.1.0.
|
|||||||
Release candidates should be used _only_ during a short testing
|
Release candidates should be used _only_ during a short testing
|
||||||
period. They carry an implied obligation to provide feedback to the
|
period. They carry an implied obligation to provide feedback to the
|
||||||
program development group. Candidate releases should not be used on
|
program development group. Candidate releases should not be used on
|
||||||
the air after a full release with the same number has been made.
|
the air after a full release with the same number is made.
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
//status: edited
|
||||||
|
|
||||||
A basic logging facility in _WSJT-X_ saves QSO information to files
|
A basic logging facility in _WSJT-X_ saves QSO information to files
|
||||||
named `wsjtx.log` (in comma-separated text format) and `wsjtx_log.adi`
|
named `wsjtx.log` (in comma-separated text format) and `wsjtx_log.adi`
|
||||||
(in standard ADIF format). These files can be imported directly into
|
(in standard ADIF format). These files can be imported directly into
|
||||||
other programs, for example spreadsheets and popular logging programs.
|
other programs (such as spreadsheets and popular logging programs).
|
||||||
As described in the <<INSTALL,Installation>> and <<PLATFORM,Platform
|
As described in the <<INSTALL,Installation>> and <<PLATFORM,Platform
|
||||||
Dependencies>> sections, different operating systems may place your
|
Dependencies>> sections, different operating systems may place your
|
||||||
local log files in different locations. You can always navigate to
|
local log files in different locations. You can always navigate to
|
||||||
@ -12,30 +14,32 @@ applications like {jtalert}, which can log QSOs automatically to other
|
|||||||
applications including {hrd}, {dxlsuite}, and {log4om}.
|
applications including {hrd}, {dxlsuite}, and {log4om}.
|
||||||
|
|
||||||
The program option *Show DXCC entity and worked before status*
|
The program option *Show DXCC entity and worked before status*
|
||||||
(selectable on the *Settings | General* tab) is intended mostly for
|
(selectable on the *File | Settings | General* tab) is intended mostly for
|
||||||
use on non-Windows platforms, where {jtalert} is not available. When
|
use on non-Windows platforms, where {jtalert} is not available. When
|
||||||
this option is checked _WSJT-X_ appends some additional information to
|
this option is checked, _WSJT-X_ appends some additional information to
|
||||||
all CQ messages displayed in the _Band Activity_ window. The name of
|
all CQ messages displayed in the _Band Activity_ window. The name of
|
||||||
the DXCC entity is shown, abbreviated if necessary. Your "`worked
|
the DXCC entity is shown, abbreviated if necessary. Your "`worked
|
||||||
before`" status for this callsign (according to log file
|
before`" status for this callsign (according to log file
|
||||||
`wsjtx_log.adi`) is indicated by highlighting colors, if that option
|
`wsjtx_log.adi`) is indicated by highlighting colors, if that option
|
||||||
has been selected.
|
is selected.
|
||||||
|
|
||||||
_WSJT-X_ includes a built-in `cty.dat` file containing DXCC prefix
|
_WSJT-X_ includes a built-in `cty.dat` file containing DXCC prefix
|
||||||
information. Updated files can be downloaded from the {cty_dat} web
|
information. Updated files can be downloaded from the {cty_dat} web
|
||||||
site when required. If an updated `cty.dat` is present in the logs
|
site when required. If an updated and readable `cty.dat` file is
|
||||||
folder and readable, it will be used in preference to the built-in
|
present in the logs folder, it is used in preference to the
|
||||||
one.
|
built-in file.
|
||||||
|
|
||||||
The log file `wsjtx_log.adi` is updated whenever you log a QSO from
|
The log file `wsjtx_log.adi` is updated whenever you log a QSO from
|
||||||
_WSJT-X_. (Keep in mind that if you erase this file you will lose all
|
_WSJT-X_. (Keep in mind that if you erase this file, you lose all
|
||||||
"`worked before`" information.) You can append or overwrite the
|
"`worked before`" information.) You can append or overwrite the
|
||||||
`wsjtx_log.adi` file by exporting your QSO history as an ADIF file
|
`wsjtx_log.adi` file by exporting your QSO history as an ADIF file
|
||||||
from another logging program. Turning *Show DXCC entity and worked
|
from another logging program. Turning *Show DXCC entity and worked
|
||||||
before status* off and then on again will cause _WSJT-X_ to re-read
|
before status* off and then on again causes _WSJT-X_ to re-read
|
||||||
the log file. Very large log files may cause _WSJT-X_ to slow down
|
the log file. Very large log files may cause _WSJT-X_ to slow down
|
||||||
when searching for calls. If the ADIF log file has been changed
|
when searching for calls. If the ADIF log file has been changed
|
||||||
outside of _WSJT-X_ you can force _WSJT-X_ to reload the file from the
|
outside of _WSJT-X_ you can force _WSJT-X_ to reload the file from the
|
||||||
*Settings | Colors* tab using the *Rescan ADIF Log* button, see
|
*Settings | Colors* tab using the *Rescan ADIF Log* button, see
|
||||||
<<COLORS,Decode Highlighting>>.
|
<<COLORS,Decode Highlighting>>.
|
||||||
|
|
||||||
|
Additional features are provided for *Contest* and *Fox* logging.
|
||||||
|
(more to come, here ...)
|
||||||
|
@ -37,7 +37,7 @@ assigns more reliable numbers to relatively strong signals.
|
|||||||
NOTE: Signals become visible on the waterfall around S/N = –26 dB and
|
NOTE: Signals become visible on the waterfall around S/N = –26 dB and
|
||||||
audible (to someone with very good hearing) around –15 dB. Thresholds
|
audible (to someone with very good hearing) around –15 dB. Thresholds
|
||||||
for decodability are around -20 dB for FT8, -23 dB for JT4, –25 dB for
|
for decodability are around -20 dB for FT8, -23 dB for JT4, –25 dB for
|
||||||
JT65, –27 dB for JT9.
|
JT65, and –27 dB for JT9.
|
||||||
|
|
||||||
NOTE: Several options are available for circumstances where fast QSOs
|
NOTE: Several options are available for circumstances where fast QSOs
|
||||||
are desirable. Double-click the *Tx1* control under _Now_ or _Next_
|
are desirable. Double-click the *Tx1* control under _Now_ or _Next_
|
||||||
@ -75,7 +75,7 @@ When calling CQ you may also choose to check the box *Call 1st*.
|
|||||||
_WSJT-X_ will then respond automatically to the first decoded
|
_WSJT-X_ will then respond automatically to the first decoded
|
||||||
responder to your CQ.
|
responder to your CQ.
|
||||||
|
|
||||||
NOTE: When *Auto-Seq* is enabled the program de-activates *Enable Tx*
|
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
|
at the end of each QSO. It is not intended that _WSJT-X_ should make
|
||||||
fully automated QSOs.
|
fully automated QSOs.
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ that a second callsign is never permissible in these messages.
|
|||||||
|
|
||||||
NOTE: During a transmission your outgoing message is displayed in the
|
NOTE: During a transmission your outgoing message is displayed in the
|
||||||
first label on the *Status Bar* and shown exactly as another station
|
first label on the *Status Bar* and shown exactly as another station
|
||||||
will receive it. You can check to see that you are actually
|
receives it. You can check to see that you are actually
|
||||||
transmitting the message you wish to send.
|
transmitting the message you wish to send.
|
||||||
|
|
||||||
QSOs involving *Type 2* compound callsigns might look like either
|
QSOs involving *Type 2* compound callsigns might look like either
|
||||||
@ -287,7 +287,7 @@ standard structured messages without callsign prefix or suffix.
|
|||||||
|
|
||||||
TIP: If you are using a compound callsign, you may want to
|
TIP: If you are using a compound callsign, you may want to
|
||||||
experiment with the option *Message generation for type 2 compound
|
experiment with the option *Message generation for type 2 compound
|
||||||
callsign holders* on the *Settings | General* tab, so that messages
|
callsign holders* on the *File | Settings | General* tab, so that messages
|
||||||
will be generated that best suit your needs.
|
will be generated that best suit your needs.
|
||||||
|
|
||||||
=== Pre-QSO Checklist
|
=== Pre-QSO Checklist
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
//Status: edited
|
||||||
|
|
||||||
=== Frequency Calibration
|
=== Frequency Calibration
|
||||||
|
|
||||||
Many _WSJT-X_ capabilities depend on signal-detection bandwidths no
|
Many _WSJT-X_ capabilities depend on signal-detection bandwidths of no
|
||||||
more than a few Hz. Frequency accuracy and stability are therefore
|
more than a few Hz. Frequency accuracy and stability are therefore
|
||||||
unusually important. We provide tools to enable accurate frequency
|
unusually important. We provide tools to enable accurate frequency
|
||||||
calibration of your radio, as well as precise frequency measurement of
|
calibration of your radio, as well as precise frequency measurement of
|
||||||
@ -11,11 +13,11 @@ measuring the error in dial frequency for each signal.
|
|||||||
|
|
||||||
You will probably find it convenient to define and use a special
|
You will probably find it convenient to define and use a special
|
||||||
<<CONFIG-MENU,Configuration>> dedicated to frequency calibration.
|
<<CONFIG-MENU,Configuration>> dedicated to frequency calibration.
|
||||||
Then complete the following steps, as appropriate for your system.
|
Then complete the following steps, as appropriate, for your system.
|
||||||
|
|
||||||
- Switch to FreqCal mode
|
- Switch to FreqCal mode
|
||||||
|
|
||||||
- In the _Working Frequencies_ box on the *Settings -> Frequencies*
|
- In the _Working Frequencies_ box on the *File | Settings | Frequencies*
|
||||||
tab, delete any default frequencies for *FreqCal* mode that are not
|
tab, delete any default frequencies for *FreqCal* mode that are not
|
||||||
relevant for your location. You may want to replace some of them with
|
relevant for your location. You may want to replace some of them with
|
||||||
reliably known frequencies receivable at your location.
|
reliably known frequencies receivable at your location.
|
||||||
@ -29,14 +31,14 @@ of WWV at 2.500, 5.000, 10.000, 15.000, and 20.000 MHz, and CHU at
|
|||||||
3.330, 7.850, and 14.670 MHz. Similar shortwave signals are available
|
3.330, 7.850, and 14.670 MHz. Similar shortwave signals are available
|
||||||
in other parts of the world.
|
in other parts of the world.
|
||||||
|
|
||||||
- In most cases you will want to start by deleting any existing file
|
- In most cases, start by deleting any existing file `fmt.all` in the
|
||||||
`fmt.all` in the directory where your log files are kept.
|
directory where your log files are kept.
|
||||||
|
|
||||||
- To cycle automatically through your chosen list of calibration
|
- To cycle automatically through your chosen list of calibration
|
||||||
frequencies, check *Execute frequency calibration cycle* on the
|
frequencies, check *Execute frequency calibration cycle* on the
|
||||||
*Tools* menu. _WSJT-X_ will spend 30 seconds at each
|
*Tools* menu. _WSJT-X_ will spend 30 seconds at each
|
||||||
frequency. Initially no measurement data is saved to the `fmt.all`
|
frequency. Initially no measurement data is saved to the `fmt.all`
|
||||||
file although it is displayed on screen, this allows you to check your
|
file although it is displayed on screen; this allows you to check your
|
||||||
current calibration parameters.
|
current calibration parameters.
|
||||||
|
|
||||||
- During the calibration procedure, the radio's USB dial frequency is
|
- During the calibration procedure, the radio's USB dial frequency is
|
||||||
@ -61,7 +63,7 @@ the nominal frequency itself (in MHz). For example, the 20 MHz
|
|||||||
measurement for WWV shown above produced a measured tone offset of
|
measurement for WWV shown above produced a measured tone offset of
|
||||||
24.6 Hz, displayed in the _WSJT-X_ decoded text window. The resulting
|
24.6 Hz, displayed in the _WSJT-X_ decoded text window. The resulting
|
||||||
calibration constant is 24.6/20=1.23 parts per million. This number
|
calibration constant is 24.6/20=1.23 parts per million. This number
|
||||||
may be entered as *Slope* on the *settings -> Frequencies* tab.
|
may be entered as *Slope* on the *File | Settings | Frequencies* tab.
|
||||||
|
|
||||||
A more precise calibration can be effected by fitting the intercept
|
A more precise calibration can be effected by fitting the intercept
|
||||||
and slope of a straight line to the whole sequence of calibration
|
and slope of a straight line to the whole sequence of calibration
|
||||||
@ -81,19 +83,19 @@ After running *Execute frequency calibration cycle* at least once with
|
|||||||
good results, check and edit the file `fmt.all` in the log directory
|
good results, check and edit the file `fmt.all` in the log directory
|
||||||
and delete any spurious or outlier measurements. The line-fitting
|
and delete any spurious or outlier measurements. The line-fitting
|
||||||
procedure can then be carried out automatically by clicking *Solve for
|
procedure can then be carried out automatically by clicking *Solve for
|
||||||
calibration parameters* on the *Tools* menu. The results will be
|
calibration parameters* on the *Tools* menu. The results are
|
||||||
displayed as in the following screen shot. Estimated uncertainties
|
displayed as in the following screen shot. Estimated uncertainties
|
||||||
are included for slope and intercept; `N` is the number of averaged
|
are included for slope and intercept; `N` is the number of averaged
|
||||||
frequency measurements included in the fit, and `StdDev` is the root
|
frequency measurements included in the fit, and `StdDev` is the root
|
||||||
mean square deviation of averaged measurements from the fitted
|
mean square deviation of averaged measurements from the fitted
|
||||||
straight line. If the solution seems valid you will be offered an
|
straight line. If the solution seems valid, you are offered an
|
||||||
*Apply* button to push that will automatically set the calibration
|
*Apply* button to push that automatically sets the calibration
|
||||||
parameters in *Settings -> Frequencies -> Frequency Calibration*.
|
parameters in *File | Settings | Frequencies | Frequency Calibration*.
|
||||||
|
|
||||||
image::FreqCal_Results.png[align="center",alt="FreqCal_Results"]
|
image::FreqCal_Results.png[align="center",alt="FreqCal_Results"]
|
||||||
|
|
||||||
For a quick visual check of the resulting calibration, stay in
|
For a quick visual check of the resulting calibration, stay in
|
||||||
*FreqCal* mode with the *Measure* option cleared. _WSJT-X_ will show
|
*FreqCal* mode with the *Measure* option cleared. _WSJT-X_ shows
|
||||||
the adjusted results directly on the waterfall and the displayed
|
the adjusted results directly on the waterfall and the displayed
|
||||||
records.
|
records.
|
||||||
|
|
||||||
@ -103,8 +105,8 @@ _WSJT-X_ provides a tool that can be used to determine the detailed
|
|||||||
shape of your receiver's passband. Disconnect your antenna or tune to
|
shape of your receiver's passband. Disconnect your antenna or tune to
|
||||||
a quiet frequency with no signals. With _WSJT-X_ running in one of
|
a quiet frequency with no signals. With _WSJT-X_ running in one of
|
||||||
the slow modes, select *Measure reference spectrum* from the *Tools*
|
the slow modes, select *Measure reference spectrum* from the *Tools*
|
||||||
menu. Wait for about a minute and then hit the *Stop* button. A file
|
menu. Wait for about a minute and then click *Stop*. A file
|
||||||
named `refspec.dat` will appear in your log directory. When you check
|
named `refspec.dat` appears in your log directory. When you check
|
||||||
*Ref Spec* on the *Wide Graph*, the recorded reference spectrum will
|
*Ref Spec* on the *Wide Graph*, the recorded reference spectrum will
|
||||||
then be used to flatten your overall effective passband.
|
then be used to flatten your overall effective passband.
|
||||||
|
|
||||||
@ -122,39 +124,39 @@ response* generates an undistorted audio waveform equal to the one
|
|||||||
generated by the transmitting station. Its Fourier transform is then
|
generated by the transmitting station. Its Fourier transform is then
|
||||||
used as a frequency-dependent phase reference to compare with the
|
used as a frequency-dependent phase reference to compare with the
|
||||||
phase of the received frame's Fourier coefficients. Phase differences
|
phase of the received frame's Fourier coefficients. Phase differences
|
||||||
between the reference spectrum and received spectrum will include
|
between the reference spectrum and received spectrum include
|
||||||
contributions from the originating station's transmit filter, the
|
contributions from the originating station's transmit filter, the
|
||||||
propagation channel, and filters in the receiver. If the received
|
propagation channel, and filters in the receiver. If the received
|
||||||
frame originates from a station known to transmit signals having
|
frame originates from a station known to transmit signals having
|
||||||
little phase distortion (say, a station known to use a properly
|
little phase distortion (such as a station known to use a properly
|
||||||
adjusted software-defined-transceiver) and if the received signal is
|
adjusted software-defined transceiver), and if the received signal is
|
||||||
relatively free from multipath distortion so that the channel phase is
|
relatively free from multipath distortion so that the channel phase is
|
||||||
close to linear, the measured phase differences will be representative
|
close to linear, the measured phase differences will be representative
|
||||||
of the local receiver's phase response.
|
of the local receiver's phase response.
|
||||||
|
|
||||||
Complete the following steps to generate a phase equalization curve:
|
Complete the following steps to generate a phase equalization curve:
|
||||||
|
|
||||||
- Record a number of wav files that contain decodable signals from
|
- Record a number of `wav` files that contain decodable signals from
|
||||||
your chosen reference station. Best results will be obtained when the
|
your chosen reference station. Best results are obtained when the
|
||||||
signal-to-noise ratio of the reference signals is 10 dB or greater.
|
signal-to-noise ratio of the reference signals is 10 dB or greater.
|
||||||
|
|
||||||
- Enter the callsign of the reference station in the DX Call box.
|
- Enter the callsign of the reference station in the DX Call box.
|
||||||
|
|
||||||
- Select *Measure phase response* from the *Tools* menu, and open each
|
- Select *Measure phase response* from the *Tools* menu, and open each
|
||||||
of the wav files in turn. The mode character on decoded text lines
|
of the `wav` files in turn. The mode character on decoded text lines
|
||||||
will change from `&` to `^` while _WSJT-X_ is measuring the phase
|
changes from `&` to `^` while _WSJT-X_ is measuring the phase
|
||||||
response, and it will change back to `&` after the measurement is
|
response, and it changes back to `&` after the measurement is
|
||||||
completed. The program needs to average a number of high-SNR frames to
|
completed. The program needs to average a number of high-SNR frames to
|
||||||
accurately estimate the phase, so it may be necessary to process
|
accurately estimate the phase, so it may be necessary to process
|
||||||
several wav files. The measurement can be aborted at any time by
|
several `wav` files. The measurement can be aborted at any time by
|
||||||
selecting *Measure phase response* again to toggle the phase
|
selecting *Measure phase response* again to toggle the phase
|
||||||
measurement off.
|
measurement off.
|
||||||
|
|
||||||
+
|
+
|
||||||
|
|
||||||
When the measurement is complete _WSJT-X_ will save the measured
|
When the measurement is complete, _WSJT-X_ saves the measured
|
||||||
phase response in the *Log directory*, in a file with suffix
|
phase response in the *Log directory*, in a file with suffix
|
||||||
".pcoeff". The filename will contain the callsign of the reference
|
".pcoeff". The filename contains the callsign of the reference
|
||||||
station and a timestamp, for example `K0TPP_170923_112027.pcoeff`.
|
station and a timestamp, for example `K0TPP_170923_112027.pcoeff`.
|
||||||
|
|
||||||
- Select *Equalization tools ...* under the *Tools* menu and click the
|
- Select *Equalization tools ...* under the *Tools* menu and click the
|
||||||
@ -165,23 +167,23 @@ the proposed phase equalization curve. It's a good idea to repeat the
|
|||||||
phase measurement several times, using different wav files for each
|
phase measurement several times, using different wav files for each
|
||||||
measurement, to ensure that your measurements are repeatable.
|
measurement, to ensure that your measurements are repeatable.
|
||||||
|
|
||||||
- Once you are satisfied with a fitted curve, push the *Apply* button
|
- Once you are satisfied with a fitted curve, click the *Apply* button
|
||||||
to save the proposed response. The red curve will be replaced with a
|
to save the proposed response. The red curve is replaced with a
|
||||||
light green curve labeled "Current" to indicate that the phase
|
light green curve labeled "Current" to indicate that the phase
|
||||||
equalization curve is now being applied to the received data. Another
|
equalization curve is now being applied to the received data. Another
|
||||||
curve labeled "Group Delay" will appear. The "Group Delay" curve shows
|
curve labeled "Group Delay" appears. The "Group Delay" curve shows
|
||||||
the group delay variation across the passband, in ms. Click the
|
the group delay variation across the passband, in ms. Click the
|
||||||
*Discard Measured* button to remove the captured data from the plot,
|
*Discard Measured* button to remove the captured data from the plot,
|
||||||
leaving only the applied phase equalization curve and corresponding
|
leaving only the applied phase equalization curve and corresponding
|
||||||
group delay curve.
|
group delay curve.
|
||||||
|
|
||||||
- To revert to no phase equalization, push the *Restore Defaults*
|
- To revert to no phase equalization, click the *Restore Defaults*
|
||||||
button followed by the *Apply* button.
|
button followed by the *Apply* button.
|
||||||
|
|
||||||
The three numbers printed at the end of each MSK144 decode line can be
|
The three numbers printed at the end of each MSK144 decode line can be
|
||||||
used to assess the improvement provided by equalization. These numbers
|
used to assess the improvement provided by equalization. These numbers
|
||||||
are: `N` = Number of frames averaged, `H` = Number of hard bit errors
|
are: `N` = Number of frames averaged, `H` = Number of hard bit errors
|
||||||
corrected, `E` = Size of MSK eye diagram opening.
|
corrected, and `E` = Size of MSK eye diagram opening.
|
||||||
|
|
||||||
Here is a decode of K0TPP obtained while *Measure phase response* was measuring
|
Here is a decode of K0TPP obtained while *Measure phase response* was measuring
|
||||||
the phase response:
|
the phase response:
|
||||||
@ -196,7 +198,7 @@ scale. Here's how the same decode looks after phase equalization:
|
|||||||
|
|
||||||
103900 17 6.5 1493 & WA8CLT K0TPP +07 1 0 1.6
|
103900 17 6.5 1493 & WA8CLT K0TPP +07 1 0 1.6
|
||||||
|
|
||||||
In this case, equalization has increased the eye opening from 1.2 to
|
In this case, equalization has increased the eye-opening from 1.2 to
|
||||||
1.6. Larger positive eye openings are associated with reduced
|
1.6. Larger positive eye openings are associated with reduced
|
||||||
likelihood of bit errors and higher likelihood that a frame will be
|
likelihood of bit errors and higher likelihood that a frame will be
|
||||||
successfully decoded. In this case, the larger eye-opening tells us
|
successfully decoded. In this case, the larger eye-opening tells us
|
||||||
@ -206,7 +208,7 @@ equalization curve is going to improve decoding of signals other than
|
|||||||
those from the reference station, K0TPP.
|
those from the reference station, K0TPP.
|
||||||
|
|
||||||
It's a good idea to carry out before and after comparisons using a
|
It's a good idea to carry out before and after comparisons using a
|
||||||
large number of saved wav files with signals from many different
|
large number of saved `wav` files with signals from many different
|
||||||
stations, to help decide whether your equalization curve improves
|
stations, to help decide whether your equalization curve improves
|
||||||
decoding for most signals. When doing such comparisons, keep in mind
|
decoding for most signals. When doing such comparisons, keep in mind
|
||||||
that equalization may cause _WSJT-X_ to successfully decode a frame
|
that equalization may cause _WSJT-X_ to successfully decode a frame
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
//status: edited
|
||||||
|
|
||||||
[[PROTOCOL_OVERVIEW]]
|
[[PROTOCOL_OVERVIEW]]
|
||||||
=== Overview
|
=== Overview
|
||||||
|
|
||||||
@ -30,17 +32,17 @@ of 4-digit Maidenhead grid locators on earth is 180×180 = 32,400,
|
|||||||
which is less than 2^15^ = 32,768; so a grid locator requires 15 bits.
|
which is less than 2^15^ = 32,768; so a grid locator requires 15 bits.
|
||||||
|
|
||||||
Some 6 million of the possible 28-bit values are not needed for
|
Some 6 million of the possible 28-bit values are not needed for
|
||||||
callsigns. A few of these slots have been assigned to special message
|
callsigns. A few of these slots are assigned to special message
|
||||||
components such as `CQ`, `DE`, and `QRZ`. `CQ` may be followed by three
|
components such as `CQ`, `DE`, and `QRZ`. `CQ` may be followed by three
|
||||||
digits to indicate a desired callback frequency. (If K1ABC transmits
|
digits to indicate a desired callback frequency. (If K1ABC transmits
|
||||||
on a standard calling frequency, say 50.280, and sends `CQ 290 K1ABC
|
on a standard calling frequency such as 50.280, and sends `CQ 290 K1ABC
|
||||||
FN42`, it means that s/he will listen on 50.290 and respond there to
|
FN42`, it means that s/he will listen on 50.290 and respond there to
|
||||||
any replies.) A numerical signal report of the form `–nn` or
|
any replies.) A numerical signal report of the form `–nn` or
|
||||||
`R–nn` can be sent in place of a grid locator. (As originally
|
`R–nn` can be sent in place of a grid locator. (As originally
|
||||||
defined, numerical signal reports `nn` were required to fall between -01
|
defined, numerical signal reports `nn` were required to fall between -01
|
||||||
and -30 dB. Program versions 2.3 and later accommodate reports between
|
and -30 dB. Recent program versions 2.3 and later accommodate reports between
|
||||||
-50 and +50 dB.) A country prefix or portable suffix may be
|
-50 and +49 dB.) A country prefix or portable suffix may be
|
||||||
attached to one of the callsigns. When this feature is used the
|
attached to one of the callsigns. When this feature is used, the
|
||||||
additional information is sent in place of the grid locator or by
|
additional information is sent in place of the grid locator or by
|
||||||
encoding additional information into some of the 6 million available
|
encoding additional information into some of the 6 million available
|
||||||
slots mentioned above.
|
slots mentioned above.
|
||||||
@ -147,7 +149,8 @@ following pseudo-random sequence:
|
|||||||
The synchronizing tone is normally sent in each interval having a
|
The synchronizing tone is normally sent in each interval having a
|
||||||
"`1`" in the sequence. Modulation is 65-FSK at 11025/4096 = 2.692
|
"`1`" in the sequence. Modulation is 65-FSK at 11025/4096 = 2.692
|
||||||
baud. Frequency spacing between tones is equal to the keying rate for
|
baud. Frequency spacing between tones is equal to the keying rate for
|
||||||
JT65A, and 2 and 4 times larger for JT65B and JT65C. For EME QSOs the
|
JT65A, and 2 and 4 times larger for JT65B and JT65C, respectively.
|
||||||
|
For EME QSOs the
|
||||||
signal report OOO is sometimes used instead of numerical signal
|
signal report OOO is sometimes used instead of numerical signal
|
||||||
reports. It is conveyed by reversing sync and data positions in the
|
reports. It is conveyed by reversing sync and data positions in the
|
||||||
transmitted sequence. Shorthand messages for RO, RRR, and 73 dispense
|
transmitted sequence. Shorthand messages for RO, RRR, and 73 dispense
|
||||||
@ -155,7 +158,7 @@ with the sync vector entirely and use time intervals of 16384/11025 =
|
|||||||
1.486 s for pairs of alternating tones. The lower frequency is the
|
1.486 s for pairs of alternating tones. The lower frequency is the
|
||||||
same as that of the sync tone used in long messages, and the frequency
|
same as that of the sync tone used in long messages, and the frequency
|
||||||
separation is 110250/4096 = 26.92 Hz multiplied by n for JT65A, with n
|
separation is 110250/4096 = 26.92 Hz multiplied by n for JT65A, with n
|
||||||
= 2, 3, 4 used to convey the messages RO, RRR, and 73.
|
= 2, 3, 4 used to convey the messages RO, RRR, and 73, respectively.
|
||||||
|
|
||||||
[[QRA64_PROTOCOL]]
|
[[QRA64_PROTOCOL]]
|
||||||
==== QRA64
|
==== QRA64
|
||||||
@ -225,7 +228,7 @@ the sync bit.
|
|||||||
[[SLOW_SUMMARY]]
|
[[SLOW_SUMMARY]]
|
||||||
==== Summary
|
==== Summary
|
||||||
|
|
||||||
Table 7 provides a brief summary parameters for the slow modes in
|
Table 7 provides a brief summary of parameters for the slow modes in
|
||||||
_WSJT-X_. Parameters K and r specify the constraint length and rate
|
_WSJT-X_. Parameters K and r specify the constraint length and rate
|
||||||
of the convolutional codes; n and k specify the sizes of the
|
of the convolutional codes; n and k specify the sizes of the
|
||||||
(equivalent) block codes; Q is the alphabet size for the
|
(equivalent) block codes; Q is the alphabet size for the
|
||||||
@ -305,7 +308,7 @@ available character set is:
|
|||||||
Transmissions consist of sequences of 24 symbols: a synchronizing
|
Transmissions consist of sequences of 24 symbols: a synchronizing
|
||||||
pattern of four symbols at tone numbers 0, 1, 3, and 2, followed by
|
pattern of four symbols at tone numbers 0, 1, 3, and 2, followed by
|
||||||
two symbols with tone number corresponding to (message length) and
|
two symbols with tone number corresponding to (message length) and
|
||||||
(message length + 5), and finally 18 symbols conveying the user's
|
(message length + 5), and, finally, 18 symbols conveying the user's
|
||||||
message, sent repeatedly character by character. The message always
|
message, sent repeatedly character by character. The message always
|
||||||
starts with `@`, the beginning-of-message symbol, which is not
|
starts with `@`, the beginning-of-message symbol, which is not
|
||||||
displayed to the user. The sync pattern and message-length indicator
|
displayed to the user. The sync pattern and message-length indicator
|
||||||
|
@ -92,16 +92,14 @@ thing, both stations will have the required Doppler compensation.
|
|||||||
Moreover, anyone else using this option will hear both of you
|
Moreover, anyone else using this option will hear both of you
|
||||||
without the need for manual frequency changes.
|
without the need for manual frequency changes.
|
||||||
|
|
||||||
- Select *On Dx Echo* when your QSO partner is not using automated
|
- Select *On Dx Echo* when your QSO partner announces his/her transmit
|
||||||
Doppler tracking, and announces his/her transmit frequency and listening
|
frequency and that they are listening on their own echo
|
||||||
on their own echo frequency. When clicked, this Doppler method will
|
frequency. When clicked, this Doppler method will set your rig
|
||||||
set your rig frequency on receive to correct for the mutual Doppler
|
frequency on receive to correct for the mutual Doppler shift. On
|
||||||
shift. On transmit, your rig frequency will be set so that your
|
transmit, your rig frequency will be set so that your QSO partner will
|
||||||
QSO partner will receive you on the same frequency as their own echo
|
receive you on the same frequency as they receive their own echo.
|
||||||
at the start of the QSO. As the QSO proceeds, your QSO partner will
|
Sked frequency in this case is set to that announced by your QSO
|
||||||
receive you on this starting frequency so that they do not have to
|
partner.
|
||||||
retune their receiver as the Doppler changes. Sked frequency in this
|
|
||||||
case is set to that announced by your QSO partner.
|
|
||||||
|
|
||||||
- Select *Call DX* after tuning the radio manually to find a station,
|
- Select *Call DX* after tuning the radio manually to find a station,
|
||||||
with the Doppler mode initially set to *None*. You may be tuning the band
|
with the Doppler mode initially set to *None*. You may be tuning the band
|
||||||
|
@ -278,6 +278,7 @@ subroutine unpack77(c77,nrx,msg,unpk77_success)
|
|||||||
|
|
||||||
read(c77(72:77),'(2b3)') n3,i3
|
read(c77(72:77),'(2b3)') n3,i3
|
||||||
msg=repeat(' ',37)
|
msg=repeat(' ',37)
|
||||||
|
|
||||||
if(i3.eq.0 .and. n3.eq.0) then
|
if(i3.eq.0 .and. n3.eq.0) then
|
||||||
! 0.0 Free text
|
! 0.0 Free text
|
||||||
call unpacktext77(c77(1:71),msg(1:13))
|
call unpacktext77(c77(1:71),msg(1:13))
|
||||||
@ -421,7 +422,10 @@ subroutine unpack77(c77,nrx,msg,unpk77_success)
|
|||||||
if(.not.unpkg4_success) unpk77_success=.false.
|
if(.not.unpkg4_success) unpk77_success=.false.
|
||||||
msg=trim(call_1)//' '//grid6
|
msg=trim(call_1)//' '//grid6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
else if(i3.eq.0 .and. n3.gt.6) then
|
||||||
|
unpk77_success=.false.
|
||||||
|
|
||||||
else if(i3.eq.1 .or. i3.eq.2) then
|
else if(i3.eq.1 .or. i3.eq.2) then
|
||||||
! Type 1 (standard message) or Type 2 ("/P" form for EU VHF contest)
|
! Type 1 (standard message) or Type 2 ("/P" form for EU VHF contest)
|
||||||
read(c77,1000) n28a,ipa,n28b,ipb,ir,igrid4,i3
|
read(c77,1000) n28a,ipa,n28b,ipb,ir,igrid4,i3
|
||||||
|
@ -191,12 +191,13 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
|
|||||||
! We're in FST4 mode
|
! We're in FST4 mode
|
||||||
ndepth=iand(params%ndepth,3)
|
ndepth=iand(params%ndepth,3)
|
||||||
iwspr=0
|
iwspr=0
|
||||||
|
params%nsubmode=0
|
||||||
call timer('dec240 ',0)
|
call timer('dec240 ',0)
|
||||||
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
||||||
params%nQSOProgress,params%nfqso,params%nfa,params%nfb, &
|
params%nQSOProgress,params%nfa,params%nfb, &
|
||||||
params%nsubmode,ndepth,params%ntr,params%nexp_decode, &
|
params%nfqso,ndepth,params%ntr, &
|
||||||
params%ntol,params%emedelay, &
|
params%nexp_decode,params%ntol,params%emedelay, &
|
||||||
logical(params%lapcqonly),mycall,hiscall,params%nfsplit,iwspr)
|
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
||||||
call timer('dec240 ',1)
|
call timer('dec240 ',1)
|
||||||
go to 800
|
go to 800
|
||||||
endif
|
endif
|
||||||
@ -207,10 +208,10 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
|
|||||||
iwspr=1
|
iwspr=1
|
||||||
call timer('dec240 ',0)
|
call timer('dec240 ',0)
|
||||||
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
||||||
params%nQSOProgress,params%nfqso,params%nfa,params%nfb, &
|
params%nQSOProgress,params%nfa,params%nfb, &
|
||||||
params%nsubmode,ndepth,params%ntr,params%nexp_decode, &
|
params%nfqso,ndepth,params%ntr, &
|
||||||
params%ntol,params%emedelay, &
|
params%nexp_decode,params%ntol,params%emedelay, &
|
||||||
logical(params%lapcqonly),mycall,hiscall,params%nfsplit,iwspr)
|
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
||||||
call timer('dec240 ',1)
|
call timer('dec240 ',1)
|
||||||
go to 800
|
go to 800
|
||||||
endif
|
endif
|
||||||
|
@ -140,8 +140,9 @@ subroutine decode240_101(llr,Keff,maxosd,norder,apmask,message101,cw,ntype,nhard
|
|||||||
hdec=0
|
hdec=0
|
||||||
where(llr .ge. 0) hdec=1
|
where(llr .ge. 0) hdec=1
|
||||||
nxor=ieor(hdec,cw)
|
nxor=ieor(hdec,cw)
|
||||||
|
nharderror=sum(nxor) ! re-calculate nharderror based on input llrs
|
||||||
dmin=sum(nxor*abs(llr))
|
dmin=sum(nxor*abs(llr))
|
||||||
ntype=2
|
ntype=1+i
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
@ -140,8 +140,9 @@ subroutine decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw,ntype,nharder
|
|||||||
hdec=0
|
hdec=0
|
||||||
where(llr .ge. 0) hdec=1
|
where(llr .ge. 0) hdec=1
|
||||||
nxor=ieor(hdec,cw)
|
nxor=ieor(hdec,cw)
|
||||||
|
nharderror=sum(nxor) ! nharderror based on input llrs
|
||||||
dmin=sum(nxor*abs(llr))
|
dmin=sum(nxor*abs(llr))
|
||||||
ntype=2
|
ntype=1+i
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
48
lib/fst4/fst4_baseline.f90
Normal file
48
lib/fst4/fst4_baseline.f90
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
subroutine fst4_baseline(s,np,ia,ib,npct,sbase)
|
||||||
|
|
||||||
|
! Fit baseline to spectrum (for FST4)
|
||||||
|
! Input: s(npts) Linear scale in power
|
||||||
|
! Output: sbase(npts) Baseline
|
||||||
|
|
||||||
|
implicit real*8 (a-h,o-z)
|
||||||
|
real*4 s(np),sw(np)
|
||||||
|
real*4 sbase(np)
|
||||||
|
real*4 base
|
||||||
|
real*8 x(1000),y(1000),a(5)
|
||||||
|
data nseg/8/
|
||||||
|
|
||||||
|
do i=ia,ib
|
||||||
|
sw(i)=10.0*log10(s(i)) !Convert to dB scale
|
||||||
|
enddo
|
||||||
|
|
||||||
|
nterms=3
|
||||||
|
nlen=(ib-ia+1)/nseg !Length of test segment
|
||||||
|
i0=(ib-ia+1)/2 !Midpoint
|
||||||
|
k=0
|
||||||
|
do n=1,nseg !Loop over all segments
|
||||||
|
ja=ia + (n-1)*nlen
|
||||||
|
jb=ja+nlen-1
|
||||||
|
call pctile(sw(ja),nlen,npct,base) !Find lowest npct of points
|
||||||
|
do i=ja,jb
|
||||||
|
if(sw(i).le.base) then
|
||||||
|
if (k.lt.1000) k=k+1 !Save all "lower envelope" points
|
||||||
|
x(k)=i-i0
|
||||||
|
y(k)=sw(i)
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
kz=k
|
||||||
|
a=0.
|
||||||
|
call polyfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial
|
||||||
|
sbase=0.0
|
||||||
|
do i=ia,ib
|
||||||
|
t=i-i0
|
||||||
|
sbase(i)=a(1)+t*(a(2)+t*(a(3))) + 0.2
|
||||||
|
! write(51,3051) i,sw(i),sbase(i)
|
||||||
|
!3051 format(i8,2f12.3)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
sbase=10**(sbase/10.0)
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine fst4_baseline
|
@ -1,5 +1,6 @@
|
|||||||
subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,badsync)
|
||||||
|
|
||||||
|
use timer_module, only: timer
|
||||||
include 'fst4_params.f90'
|
include 'fst4_params.f90'
|
||||||
complex cd(0:NN*nss-1)
|
complex cd(0:NN*nss-1)
|
||||||
complex cs(0:3,NN)
|
complex cs(0:3,NN)
|
||||||
@ -11,6 +12,7 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
|||||||
integer graymap(0:3)
|
integer graymap(0:3)
|
||||||
integer ip(1)
|
integer ip(1)
|
||||||
integer hmod
|
integer hmod
|
||||||
|
integer hbits(2*NN)
|
||||||
logical one(0:65535,0:15) ! 65536 8-symbol sequences, 16 bits
|
logical one(0:65535,0:15) ! 65536 8-symbol sequences, 16 bits
|
||||||
logical first
|
logical first
|
||||||
logical badsync
|
logical badsync
|
||||||
@ -52,7 +54,7 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
|||||||
do itone=0,3
|
do itone=0,3
|
||||||
cs(itone,k)=sum(csymb*conjg(c1(:,itone)))
|
cs(itone,k)=sum(csymb*conjg(c1(:,itone)))
|
||||||
enddo
|
enddo
|
||||||
s4(0:3,k)=abs(cs(0:3,k))
|
s4(0:3,k)=abs(cs(0:3,k))**2
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
! Sync quality check
|
! Sync quality check
|
||||||
@ -83,8 +85,10 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
call timer('seqcorrs',0)
|
||||||
bitmetrics=0.0
|
bitmetrics=0.0
|
||||||
do nseq=1,nmax !Try coherent sequences of 1, 2, and 4 symbols
|
do nseq=1,nmax !Try coherent sequences of 1,2,3,4 or 1,2,4,8 symbols
|
||||||
if(nseq.eq.1) nsym=1
|
if(nseq.eq.1) nsym=1
|
||||||
if(nseq.eq.2) nsym=2
|
if(nseq.eq.2) nsym=2
|
||||||
if(nhicoh.eq.0) then
|
if(nhicoh.eq.0) then
|
||||||
@ -99,11 +103,14 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
|||||||
s2=0
|
s2=0
|
||||||
do i=0,nt-1
|
do i=0,nt-1
|
||||||
csum=0
|
csum=0
|
||||||
cterm=1
|
! cterm=1 ! hmod.ne.1
|
||||||
|
term=1
|
||||||
do j=0,nsym-1
|
do j=0,nsym-1
|
||||||
ntone=mod(i/4**(nsym-1-j),4)
|
ntone=mod(i/4**(nsym-1-j),4)
|
||||||
csum=csum+cs(graymap(ntone),ks+j)*cterm
|
csum=csum+cs(graymap(ntone),ks+j)*term
|
||||||
cterm=cterm*conjg(cp(graymap(ntone)))
|
term=-term
|
||||||
|
! csum=csum+cs(graymap(ntone),ks+j)*cterm ! hmod.ne.1
|
||||||
|
! cterm=cterm*conjg(cp(graymap(ntone))) ! hmod.ne.1
|
||||||
enddo
|
enddo
|
||||||
s2(i)=abs(csum)
|
s2(i)=abs(csum)
|
||||||
enddo
|
enddo
|
||||||
@ -121,11 +128,30 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,badsync)
|
|||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
call timer('seqcorrs',1)
|
||||||
|
|
||||||
|
hbits=0
|
||||||
|
where(bitmetrics(:,1).ge.0) hbits=1
|
||||||
|
ns1=count(hbits( 1: 16).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
||||||
|
ns2=count(hbits( 77: 92).eq.(/1,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1/))
|
||||||
|
ns3=count(hbits(153:168).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
||||||
|
ns4=count(hbits(229:244).eq.(/1,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1/))
|
||||||
|
ns5=count(hbits(305:320).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
||||||
|
nsync_qual=ns1+ns2+ns3+ns4+ns5
|
||||||
|
|
||||||
|
if(nsync_qual.lt. 46) then
|
||||||
|
badsync=.true.
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
call normalizebmet(bitmetrics(:,1),2*NN)
|
call normalizebmet(bitmetrics(:,1),2*NN)
|
||||||
call normalizebmet(bitmetrics(:,2),2*NN)
|
call normalizebmet(bitmetrics(:,2),2*NN)
|
||||||
call normalizebmet(bitmetrics(:,3),2*NN)
|
call normalizebmet(bitmetrics(:,3),2*NN)
|
||||||
call normalizebmet(bitmetrics(:,4),2*NN)
|
call normalizebmet(bitmetrics(:,4),2*NN)
|
||||||
|
|
||||||
|
scalefac=2.83
|
||||||
|
bitmetrics=scalefac*bitmetrics
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine get_fst4_bitmetrics
|
end subroutine get_fst4_bitmetrics
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine get_fst4_bitmetrics2(cd,nss,hmod,nsizes,bitmetrics,s4hmod,badsync)
|
subroutine get_fst4_bitmetrics2(cd,nss,hmod,nsizes,bitmetrics,s4snr,badsync)
|
||||||
|
|
||||||
include 'fst4_params.f90'
|
include 'fst4_params.f90'
|
||||||
complex cd(0:NN*nss-1)
|
complex cd(0:NN*nss-1)
|
||||||
@ -15,7 +15,7 @@ subroutine get_fst4_bitmetrics2(cd,nss,hmod,nsizes,bitmetrics,s4hmod,badsync)
|
|||||||
logical badsync
|
logical badsync
|
||||||
real bitmetrics(2*NN,4)
|
real bitmetrics(2*NN,4)
|
||||||
real s2(0:65535)
|
real s2(0:65535)
|
||||||
real s4(0:3,NN,4),s4hmod(0:3,NN)
|
real s4(0:3,NN,4),s4snr(0:3,NN)
|
||||||
data isyncword1/0,1,3,2,1,0,2,3/
|
data isyncword1/0,1,3,2,1,0,2,3/
|
||||||
data isyncword2/2,3,1,0,3,2,0,1/
|
data isyncword2/2,3,1,0,3,2,0,1/
|
||||||
data graymap/0,1,3,2/
|
data graymap/0,1,3,2/
|
||||||
@ -49,21 +49,21 @@ subroutine get_fst4_bitmetrics2(cd,nss,hmod,nsizes,bitmetrics,s4hmod,badsync)
|
|||||||
i1=(k-1)*NSS
|
i1=(k-1)*NSS
|
||||||
csymb=cd(i1:i1+NSS-1)
|
csymb=cd(i1:i1+NSS-1)
|
||||||
do itone=0,3
|
do itone=0,3
|
||||||
s4(itone,k,1)=abs(sum(csymb*conjg(c1(:,itone))))
|
s4(itone,k,1)=abs(sum(csymb*conjg(c1(:,itone))))**2
|
||||||
s4(itone,k,2)=abs(sum(csymb( 1:nss/2)*conjg(c1( 1:nss/2,itone)))) + &
|
s4(itone,k,2)=abs(sum(csymb( 1:nss/2)*conjg(c1( 1:nss/2,itone))))**2 + &
|
||||||
abs(sum(csymb(nss/2+1: nss)*conjg(c1(nss/2+1: nss,itone))))
|
abs(sum(csymb(nss/2+1: nss)*conjg(c1(nss/2+1: nss,itone))))**2
|
||||||
s4(itone,k,3)=abs(sum(csymb( 1: nss/4)*conjg(c1( 1: nss/4,itone)))) + &
|
s4(itone,k,3)=abs(sum(csymb( 1: nss/4)*conjg(c1( 1: nss/4,itone))))**2 + &
|
||||||
abs(sum(csymb( nss/4+1: nss/2)*conjg(c1( nss/4+1: nss/2,itone)))) + &
|
abs(sum(csymb( nss/4+1: nss/2)*conjg(c1( nss/4+1: nss/2,itone))))**2 + &
|
||||||
abs(sum(csymb( nss/2+1:3*nss/4)*conjg(c1( nss/2+1:3*nss/4,itone)))) + &
|
abs(sum(csymb( nss/2+1:3*nss/4)*conjg(c1( nss/2+1:3*nss/4,itone))))**2 + &
|
||||||
abs(sum(csymb(3*nss/4+1: nss)*conjg(c1(3*nss/4+1: nss,itone))))
|
abs(sum(csymb(3*nss/4+1: nss)*conjg(c1(3*nss/4+1: nss,itone))))**2
|
||||||
s4(itone,k,4)=abs(sum(csymb( 1: nss/8)*conjg(c1( 1: nss/8,itone)))) + &
|
s4(itone,k,4)=abs(sum(csymb( 1: nss/8)*conjg(c1( 1: nss/8,itone))))**2 + &
|
||||||
abs(sum(csymb( nss/8+1: nss/4)*conjg(c1( nss/8+1: nss/4,itone)))) + &
|
abs(sum(csymb( nss/8+1: nss/4)*conjg(c1( nss/8+1: nss/4,itone))))**2 + &
|
||||||
abs(sum(csymb( nss/4+1:3*nss/8)*conjg(c1( nss/4+1:3*nss/8,itone)))) + &
|
abs(sum(csymb( nss/4+1:3*nss/8)*conjg(c1( nss/4+1:3*nss/8,itone))))**2 + &
|
||||||
abs(sum(csymb(3*nss/8+1: nss/2)*conjg(c1(3*nss/8+1: nss/2,itone)))) + &
|
abs(sum(csymb(3*nss/8+1: nss/2)*conjg(c1(3*nss/8+1: nss/2,itone))))**2 + &
|
||||||
abs(sum(csymb( nss/2+1:5*nss/8)*conjg(c1( nss/2+1:5*nss/8,itone)))) + &
|
abs(sum(csymb( nss/2+1:5*nss/8)*conjg(c1( nss/2+1:5*nss/8,itone))))**2 + &
|
||||||
abs(sum(csymb(5*nss/8+1:3*nss/4)*conjg(c1(5*nss/8+1:3*nss/4,itone)))) + &
|
abs(sum(csymb(5*nss/8+1:3*nss/4)*conjg(c1(5*nss/8+1:3*nss/4,itone))))**2 + &
|
||||||
abs(sum(csymb(3*nss/4+1:7*nss/8)*conjg(c1(3*nss/4+1:7*nss/8,itone)))) + &
|
abs(sum(csymb(3*nss/4+1:7*nss/8)*conjg(c1(3*nss/4+1:7*nss/8,itone))))**2 + &
|
||||||
abs(sum(csymb(7*nss/8+1: nss)*conjg(c1(7*nss/8+1: nss,itone))))
|
abs(sum(csymb(7*nss/8+1: nss)*conjg(c1(7*nss/8+1: nss,itone))))**2
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
@ -121,11 +121,8 @@ subroutine get_fst4_bitmetrics2(cd,nss,hmod,nsizes,bitmetrics,s4hmod,badsync)
|
|||||||
call normalizebmet(bitmetrics(:,3),2*NN)
|
call normalizebmet(bitmetrics(:,3),2*NN)
|
||||||
call normalizebmet(bitmetrics(:,4),2*NN)
|
call normalizebmet(bitmetrics(:,4),2*NN)
|
||||||
|
|
||||||
! Return the s4 array corresponding to N=1/hmod. Will be used for SNR calculation
|
! Return the s4 array corresponding to N=1. Will be used for SNR calculation
|
||||||
if(hmod.eq.1) s4hmod(:,:)=s4(:,:,1)
|
s4snr(:,:)=s4(:,:,1)
|
||||||
if(hmod.eq.2) s4hmod(:,:)=s4(:,:,2)
|
|
||||||
if(hmod.eq.4) s4hmod(:,:)=s4(:,:,3)
|
|
||||||
if(hmod.eq.8) s4hmod(:,:)=s4(:,:,4)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine get_fst4_bitmetrics2
|
end subroutine get_fst4_bitmetrics2
|
||||||
|
@ -29,9 +29,9 @@ module fst4_decode
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine decode(this,callback,iwave,nutc,nQSOProgress,nfqso, &
|
subroutine decode(this,callback,iwave,nutc,nQSOProgress,nfa,nfb,nfqso, &
|
||||||
nfa,nfb,nsubmode,ndepth,ntrperiod,nexp_decode,ntol, &
|
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lapcqonly,mycall, &
|
||||||
emedelay,lapcqonly,mycall,hiscall,nfsplit,iwspr)
|
hiscall,iwspr)
|
||||||
|
|
||||||
use timer_module, only: timer
|
use timer_module, only: timer
|
||||||
use packjt77
|
use packjt77
|
||||||
@ -48,8 +48,8 @@ contains
|
|||||||
complex, allocatable :: c2(:)
|
complex, allocatable :: c2(:)
|
||||||
complex, allocatable :: cframe(:)
|
complex, allocatable :: cframe(:)
|
||||||
complex, allocatable :: c_bigfft(:) !Complex waveform
|
complex, allocatable :: c_bigfft(:) !Complex waveform
|
||||||
real llr(240),llra(240),llrb(240),llrc(240),llrd(240)
|
real llr(240),llrs(240,4)
|
||||||
real candidates(100,4)
|
real candidates(200,5)
|
||||||
real bitmetrics(320,4)
|
real bitmetrics(320,4)
|
||||||
real s4(0:3,NN)
|
real s4(0:3,NN)
|
||||||
real minsync
|
real minsync
|
||||||
@ -57,7 +57,6 @@ contains
|
|||||||
integer itone(NN)
|
integer itone(NN)
|
||||||
integer hmod
|
integer hmod
|
||||||
integer*1 apmask(240),cw(240)
|
integer*1 apmask(240),cw(240)
|
||||||
integer*1 hbits(320)
|
|
||||||
integer*1 message101(101),message74(74),message77(77)
|
integer*1 message101(101),message74(74),message77(77)
|
||||||
integer*1 rvec(77)
|
integer*1 rvec(77)
|
||||||
integer apbits(240)
|
integer apbits(240)
|
||||||
@ -65,7 +64,7 @@ contains
|
|||||||
integer naptypes(0:5,4) ! (nQSOProgress,decoding pass)
|
integer naptypes(0:5,4) ! (nQSOProgress,decoding pass)
|
||||||
integer mcq(29),mrrr(19),m73(19),mrr73(19)
|
integer mcq(29),mrrr(19),m73(19),mrr73(19)
|
||||||
|
|
||||||
logical badsync,unpk77_success,single_decode
|
logical badsync,unpk77_success
|
||||||
logical first,nohiscall,lwspr,ex
|
logical first,nohiscall,lwspr,ex
|
||||||
|
|
||||||
integer*2 iwave(30*60*12000)
|
integer*2 iwave(30*60*12000)
|
||||||
@ -77,16 +76,13 @@ contains
|
|||||||
data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, &
|
data rvec/0,1,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0, &
|
||||||
1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, &
|
1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,1,0,1, &
|
||||||
0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/
|
0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1/
|
||||||
data first/.true./
|
data first/.true./,hmod/1/
|
||||||
save first,apbits,nappasses,naptypes,mycall0,hiscall0
|
save first,apbits,nappasses,naptypes,mycall0,hiscall0
|
||||||
|
|
||||||
this%callback => callback
|
this%callback => callback
|
||||||
|
|
||||||
dxcall13=hiscall ! initialize for use in packjt77
|
dxcall13=hiscall ! initialize for use in packjt77
|
||||||
mycall13=mycall
|
mycall13=mycall
|
||||||
|
|
||||||
fMHz=1.0
|
|
||||||
|
|
||||||
if(iwspr.ne.0.and.iwspr.ne.1) return
|
if(iwspr.ne.0.and.iwspr.ne.1) return
|
||||||
|
|
||||||
if(first) then
|
if(first) then
|
||||||
@ -149,8 +145,7 @@ contains
|
|||||||
if(i3.ne.1 .or. (msg.ne.msgsent) .or. .not.unpk77_success) go to 10
|
if(i3.ne.1 .or. (msg.ne.msgsent) .or. .not.unpk77_success) go to 10
|
||||||
read(c77,'(77i1)') message77
|
read(c77,'(77i1)') message77
|
||||||
message77=mod(message77+rvec,2)
|
message77=mod(message77+rvec,2)
|
||||||
call encode174_91(message77,cw)
|
apbits(1:77)=2*message77-1
|
||||||
apbits=2*cw-1
|
|
||||||
if(nohiscall) apbits(30)=99
|
if(nohiscall) apbits(30)=99
|
||||||
|
|
||||||
10 continue
|
10 continue
|
||||||
@ -159,57 +154,43 @@ contains
|
|||||||
endif
|
endif
|
||||||
!************************************
|
!************************************
|
||||||
|
|
||||||
hmod=2**nsubmode
|
|
||||||
if(nfqso+nqsoprogress.eq.-999) return
|
if(nfqso+nqsoprogress.eq.-999) return
|
||||||
Keff=91
|
Keff=91
|
||||||
nmax=15*12000
|
nmax=15*12000
|
||||||
single_decode=iand(nexp_decode,32).eq.32
|
|
||||||
if(ntrperiod.eq.15) then
|
if(ntrperiod.eq.15) then
|
||||||
nsps=720
|
nsps=720
|
||||||
nmax=15*12000
|
nmax=15*12000
|
||||||
ndown=18/hmod !nss=40,80,160,400
|
ndown=18 !nss=40,80,160,400
|
||||||
if(hmod.eq.4) ndown=4
|
|
||||||
if(hmod.eq.8) ndown=2
|
|
||||||
nfft1=int(nmax/ndown)*ndown
|
nfft1=int(nmax/ndown)*ndown
|
||||||
else if(ntrperiod.eq.30) then
|
else if(ntrperiod.eq.30) then
|
||||||
nsps=1680
|
nsps=1680
|
||||||
nmax=30*12000
|
nmax=30*12000
|
||||||
ndown=42/hmod !nss=40,80,168,336
|
ndown=42 !nss=40,80,168,336
|
||||||
nfft1=359856 !nfft2=8568=2^3*3^2*7*17
|
nfft1=359856 !nfft2=8568=2^3*3^2*7*17
|
||||||
if(hmod.eq.4) then
|
|
||||||
ndown=10
|
|
||||||
nfft1=nmax
|
|
||||||
endif
|
|
||||||
if(hmod.eq.8) then
|
|
||||||
ndown=5
|
|
||||||
nfft1=nmax
|
|
||||||
endif
|
|
||||||
else if(ntrperiod.eq.60) then
|
else if(ntrperiod.eq.60) then
|
||||||
nsps=3888
|
nsps=3888
|
||||||
nmax=60*12000
|
nmax=60*12000
|
||||||
ndown=96/hmod !nss=36,81,162,324
|
ndown=108
|
||||||
if(hmod.eq.1) ndown=108
|
|
||||||
nfft1=7500*96 ! nfft2=7500=2^2*3*5^4
|
nfft1=7500*96 ! nfft2=7500=2^2*3*5^4
|
||||||
else if(ntrperiod.eq.120) then
|
else if(ntrperiod.eq.120) then
|
||||||
nsps=8200
|
nsps=8200
|
||||||
nmax=120*12000
|
nmax=120*12000
|
||||||
ndown=200/hmod !nss=40,82,164,328
|
ndown=205 !nss=40,82,164,328
|
||||||
if(hmod.eq.1) ndown=205
|
|
||||||
nfft1=7200*200 ! nfft2=7200=2^5*3^2*5^2
|
nfft1=7200*200 ! nfft2=7200=2^5*3^2*5^2
|
||||||
else if(ntrperiod.eq.300) then
|
else if(ntrperiod.eq.300) then
|
||||||
nsps=21504
|
nsps=21504
|
||||||
nmax=300*12000
|
nmax=300*12000
|
||||||
ndown=512/hmod !nss=42,84,168,336
|
ndown=512 !nss=42,84,168,336
|
||||||
nfft1=7020*512 ! nfft2=7020=2^2*3^3*5*13
|
nfft1=7020*512 ! nfft2=7020=2^2*3^3*5*13
|
||||||
else if(ntrperiod.eq.900) then
|
else if(ntrperiod.eq.900) then
|
||||||
nsps=66560
|
nsps=66560
|
||||||
nmax=900*12000
|
nmax=900*12000
|
||||||
ndown=1664/hmod !nss=40,80,160,320
|
ndown=1664 !nss=40,80,160,320
|
||||||
nfft1=6480*1664 ! nfft2=6480=2^4*3^4*5
|
nfft1=6480*1664 ! nfft2=6480=2^4*3^4*5
|
||||||
else if(ntrperiod.eq.1800) then
|
else if(ntrperiod.eq.1800) then
|
||||||
nsps=134400
|
nsps=134400
|
||||||
nmax=1800*12000
|
nmax=1800*12000
|
||||||
ndown=3360/hmod !nss=40,80,160,320
|
ndown=3360 !nss=40,80,160,320
|
||||||
nfft1=6426*3360 ! nfft2=6426=2*3^3*7*17
|
nfft1=6426*3360 ! nfft2=6426=2*3^3*7*17
|
||||||
end if
|
end if
|
||||||
nss=nsps/ndown
|
nss=nsps/ndown
|
||||||
@ -220,7 +201,7 @@ contains
|
|||||||
dt2=1.0/fs2
|
dt2=1.0/fs2
|
||||||
tt=nsps*dt !Duration of "itone" symbols (s)
|
tt=nsps*dt !Duration of "itone" symbols (s)
|
||||||
baud=1.0/tt
|
baud=1.0/tt
|
||||||
sigbw=4.0*hmod*baud
|
sigbw=4.0*baud
|
||||||
nfft2=nfft1/ndown !make sure that nfft1 is exactly nfft2*ndown
|
nfft2=nfft1/ndown !make sure that nfft1 is exactly nfft2*ndown
|
||||||
nfft1=nfft2*ndown
|
nfft1=nfft2*ndown
|
||||||
nh1=nfft1/2
|
nh1=nfft1/2
|
||||||
@ -229,13 +210,13 @@ contains
|
|||||||
allocate( c2(0:nfft2-1) )
|
allocate( c2(0:nfft2-1) )
|
||||||
allocate( cframe(0:160*nss-1) )
|
allocate( cframe(0:160*nss-1) )
|
||||||
|
|
||||||
|
jittermax=2
|
||||||
if(ndepth.eq.3) then
|
if(ndepth.eq.3) then
|
||||||
nblock=4
|
nblock=4
|
||||||
jittermax=2
|
jittermax=2
|
||||||
norder=3
|
norder=3
|
||||||
elseif(ndepth.eq.2) then
|
elseif(ndepth.eq.2) then
|
||||||
nblock=1
|
nblock=3
|
||||||
if(hmod.eq.1) nblock=3
|
|
||||||
jittermax=0
|
jittermax=0
|
||||||
norder=3
|
norder=3
|
||||||
elseif(ndepth.eq.1) then
|
elseif(ndepth.eq.1) then
|
||||||
@ -251,40 +232,17 @@ contains
|
|||||||
! The big fft is done once and is used for calculating the smoothed spectrum
|
! The big fft is done once and is used for calculating the smoothed spectrum
|
||||||
! and also for downconverting/downsampling each candidate.
|
! and also for downconverting/downsampling each candidate.
|
||||||
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
||||||
! call blank2(nfa,nfb,nfft1,c_bigfft,iwave)
|
|
||||||
|
|
||||||
if(hmod.eq.1) then
|
nhicoh=1
|
||||||
if(fMHz.lt.2.0) then
|
nsyncoh=8
|
||||||
nsyncoh=8 ! Use N=8 for sync
|
fa=max(100,nint(nfqso+1.5*baud-ntol))
|
||||||
nhicoh=1 ! Use N=1,2,4,8 for symbol estimation
|
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
||||||
else
|
minsync=1.20
|
||||||
nsyncoh=4 ! Use N=4 for sync
|
if(ntrperiod.eq.15) minsync=1.15
|
||||||
nhicoh=0 ! Use N=1,2,3,4 for symbol estimation
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if(hmod.eq.2) nsyncoh=1
|
|
||||||
if(hmod.eq.4) nsyncoh=-2
|
|
||||||
if(hmod.eq.8) nsyncoh=-4
|
|
||||||
endif
|
|
||||||
|
|
||||||
if( single_decode ) then
|
|
||||||
fa=max(100,nint(nfqso+1.5*hmod*baud-ntol))
|
|
||||||
fb=min(4800,nint(nfqso+1.5*hmod*baud+ntol))
|
|
||||||
else
|
|
||||||
fa=max(100,nfa)
|
|
||||||
fb=min(4800,nfb)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if(hmod.eq.1) then
|
|
||||||
if(ntrperiod.eq.15) minsync=1.15
|
|
||||||
if(ntrperiod.gt.15) minsync=1.20
|
|
||||||
elseif(hmod.gt.1) then
|
|
||||||
minsync=1.2
|
|
||||||
endif
|
|
||||||
|
|
||||||
! Get first approximation of candidate frequencies
|
! Get first approximation of candidate frequencies
|
||||||
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb, &
|
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||||
minsync,ncand,candidates,base)
|
minsync,ncand,candidates)
|
||||||
|
|
||||||
ndecodes=0
|
ndecodes=0
|
||||||
decodes=' '
|
decodes=' '
|
||||||
@ -300,54 +258,15 @@ contains
|
|||||||
! Output array c2 is complex baseband sampled at 12000/ndown Sa/sec.
|
! Output array c2 is complex baseband sampled at 12000/ndown Sa/sec.
|
||||||
! The size of the downsampled c2 array is nfft2=nfft1/ndown
|
! The size of the downsampled c2 array is nfft2=nfft1/ndown
|
||||||
|
|
||||||
|
call timer('dwnsmpl ',0)
|
||||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
|
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
|
||||||
|
call timer('dwnsmpl ',1)
|
||||||
|
|
||||||
call timer('sync240 ',0)
|
call timer('sync240 ',0)
|
||||||
fc1=0.0
|
call fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
|
||||||
if(emedelay.lt.0.1) then ! search offsets from 0 s to 2 s
|
|
||||||
is0=1.5*nspsec
|
|
||||||
ishw=1.5*nspsec
|
|
||||||
else ! search plus or minus 1.5 s centered on emedelay
|
|
||||||
is0=nint((emedelay+1.0)*nspsec)
|
|
||||||
ishw=1.5*nspsec
|
|
||||||
endif
|
|
||||||
|
|
||||||
smax=-1.e30
|
|
||||||
do if=-12,12
|
|
||||||
fc=fc1 + 0.1*baud*if
|
|
||||||
do istart=max(1,is0-ishw),is0+ishw,4*hmod
|
|
||||||
call sync_fst4(c2,istart,fc,hmod,nsyncoh,nfft2,nss, &
|
|
||||||
ntrperiod,fs2,sync)
|
|
||||||
if(sync.gt.smax) then
|
|
||||||
fc2=fc
|
|
||||||
isbest=istart
|
|
||||||
smax=sync
|
|
||||||
endif
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
fc1=fc2
|
|
||||||
is0=isbest
|
|
||||||
ishw=4*hmod
|
|
||||||
isst=1*hmod
|
|
||||||
|
|
||||||
smax=0.0
|
|
||||||
do if=-7,7
|
|
||||||
fc=fc1 + 0.02*baud*if
|
|
||||||
do istart=max(1,is0-ishw),is0+ishw,isst
|
|
||||||
call sync_fst4(c2,istart,fc,hmod,nsyncoh,nfft2,nss, &
|
|
||||||
ntrperiod,fs2,sync)
|
|
||||||
if(sync.gt.smax) then
|
|
||||||
fc2=fc
|
|
||||||
isbest=istart
|
|
||||||
smax=sync
|
|
||||||
endif
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
call timer('sync240 ',1)
|
call timer('sync240 ',1)
|
||||||
|
|
||||||
fc_synced = fc0 + fc2
|
fc_synced = fc0 + fcbest
|
||||||
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
||||||
candidates(icand,3)=fc_synced
|
candidates(icand,3)=fc_synced
|
||||||
candidates(icand,4)=isbest
|
candidates(icand,4)=isbest
|
||||||
@ -379,14 +298,18 @@ contains
|
|||||||
enddo
|
enddo
|
||||||
ncand=ic
|
ncand=ic
|
||||||
xsnr=0.
|
xsnr=0.
|
||||||
|
!write(*,*) 'ncand ',ncand
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
sync=candidates(icand,2)
|
sync=candidates(icand,2)
|
||||||
fc_synced=candidates(icand,3)
|
fc_synced=candidates(icand,3)
|
||||||
isbest=nint(candidates(icand,4))
|
isbest=nint(candidates(icand,4))
|
||||||
xdt=(isbest-nspsec)/fs2
|
xdt=(isbest-nspsec)/fs2
|
||||||
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
||||||
|
|
||||||
|
call timer('dwnsmpl ',0)
|
||||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
||||||
|
call timer('dwnsmpl ',1)
|
||||||
|
|
||||||
do ijitter=0,jittermax
|
do ijitter=0,jittermax
|
||||||
if(ijitter.eq.0) ioffset=0
|
if(ijitter.eq.0) ioffset=0
|
||||||
if(ijitter.eq.1) ioffset=1
|
if(ijitter.eq.1) ioffset=1
|
||||||
@ -395,45 +318,20 @@ contains
|
|||||||
if(is0.lt.0) cycle
|
if(is0.lt.0) cycle
|
||||||
cframe=c2(is0:is0+160*nss-1)
|
cframe=c2(is0:is0+160*nss-1)
|
||||||
bitmetrics=0
|
bitmetrics=0
|
||||||
if(hmod.eq.1) then
|
call timer('bitmetrc',0)
|
||||||
call get_fst4_bitmetrics(cframe,nss,hmod,nblock,nhicoh,bitmetrics,s4,badsync)
|
call get_fst4_bitmetrics(cframe,nss,hmod,nblock,nhicoh,bitmetrics, &
|
||||||
else
|
s4,nsync_qual,badsync)
|
||||||
call get_fst4_bitmetrics2(cframe,nss,hmod,nblock,bitmetrics,s4,badsync)
|
call timer('bitmetrc',1)
|
||||||
endif
|
|
||||||
if(badsync) cycle
|
if(badsync) cycle
|
||||||
|
|
||||||
hbits=0
|
do il=1,4
|
||||||
where(bitmetrics(:,1).ge.0) hbits=1
|
llrs( 1: 60,il)=bitmetrics( 17: 76, il)
|
||||||
ns1=count(hbits( 1: 16).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
llrs( 61:120,il)=bitmetrics( 93:152, il)
|
||||||
ns2=count(hbits( 77: 92).eq.(/1,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1/))
|
llrs(121:180,il)=bitmetrics(169:228, il)
|
||||||
ns3=count(hbits(153:168).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
llrs(181:240,il)=bitmetrics(245:304, il)
|
||||||
ns4=count(hbits(229:244).eq.(/1,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1/))
|
enddo
|
||||||
ns5=count(hbits(305:320).eq.(/0,0,0,1,1,0,1,1,0,1,0,0,1,1,1,0/))
|
|
||||||
nsync_qual=ns1+ns2+ns3+ns4+ns5
|
|
||||||
! if(nsync_qual.lt. 46) cycle !### Value ?? ###
|
|
||||||
scalefac=2.83
|
|
||||||
llra( 1: 60)=bitmetrics( 17: 76, 1)
|
|
||||||
llra( 61:120)=bitmetrics( 93:152, 1)
|
|
||||||
llra(121:180)=bitmetrics(169:228, 1)
|
|
||||||
llra(181:240)=bitmetrics(245:304, 1)
|
|
||||||
llra=scalefac*llra
|
|
||||||
llrb( 1: 60)=bitmetrics( 17: 76, 2)
|
|
||||||
llrb( 61:120)=bitmetrics( 93:152, 2)
|
|
||||||
llrb(121:180)=bitmetrics(169:228, 2)
|
|
||||||
llrb(181:240)=bitmetrics(245:304, 2)
|
|
||||||
llrb=scalefac*llrb
|
|
||||||
llrc( 1: 60)=bitmetrics( 17: 76, 3)
|
|
||||||
llrc( 61:120)=bitmetrics( 93:152, 3)
|
|
||||||
llrc(121:180)=bitmetrics(169:228, 3)
|
|
||||||
llrc(181:240)=bitmetrics(245:304, 3)
|
|
||||||
llrc=scalefac*llrc
|
|
||||||
llrd( 1: 60)=bitmetrics( 17: 76, 4)
|
|
||||||
llrd( 61:120)=bitmetrics( 93:152, 4)
|
|
||||||
llrd(121:180)=bitmetrics(169:228, 4)
|
|
||||||
llrd(181:240)=bitmetrics(245:304, 4)
|
|
||||||
llrd=scalefac*llrd
|
|
||||||
|
|
||||||
apmag=maxval(abs(llra))*1.1
|
apmag=maxval(abs(llrs(:,1)))*1.1
|
||||||
ntmax=nblock+nappasses(nQSOProgress)
|
ntmax=nblock+nappasses(nQSOProgress)
|
||||||
if(lapcqonly) ntmax=nblock+1
|
if(lapcqonly) ntmax=nblock+1
|
||||||
if(ndepth.eq.1) ntmax=nblock
|
if(ndepth.eq.1) ntmax=nblock
|
||||||
@ -445,23 +343,17 @@ contains
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
do itry=1,ntmax
|
do itry=1,ntmax
|
||||||
if(itry.eq.1) llr=llra
|
if(itry.eq.1) llr=llrs(:,1)
|
||||||
if(itry.eq.2.and.itry.le.nblock) llr=llrb
|
if(itry.eq.2.and.itry.le.nblock) llr=llrs(:,2)
|
||||||
if(itry.eq.3.and.itry.le.nblock) llr=llrc
|
if(itry.eq.3.and.itry.le.nblock) llr=llrs(:,3)
|
||||||
if(itry.eq.4.and.itry.le.nblock) llr=llrd
|
if(itry.eq.4.and.itry.le.nblock) llr=llrs(:,4)
|
||||||
if(itry.le.nblock) then
|
if(itry.le.nblock) then
|
||||||
apmask=0
|
apmask=0
|
||||||
iaptype=0
|
iaptype=0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if(itry.gt.nblock) then
|
if(itry.gt.nblock) then ! do ap passes
|
||||||
llr=llra
|
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
|
||||||
if(nblock.gt.1) then
|
|
||||||
if(hmod.eq.1) llr=llrd
|
|
||||||
if(hmod.eq.2) llr=llrb
|
|
||||||
if(hmod.eq.4) llr=llrc
|
|
||||||
if(hmod.eq.8) llr=llrd
|
|
||||||
endif
|
|
||||||
iaptype=naptypes(nQSOProgress,itry-nblock)
|
iaptype=naptypes(nQSOProgress,itry-nblock)
|
||||||
if(lapcqonly) iaptype=1
|
if(lapcqonly) iaptype=1
|
||||||
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
|
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
|
||||||
@ -500,7 +392,7 @@ contains
|
|||||||
if(iwspr.eq.0) then
|
if(iwspr.eq.0) then
|
||||||
maxosd=2
|
maxosd=2
|
||||||
Keff=91
|
Keff=91
|
||||||
norder=3
|
norder=4
|
||||||
call timer('d240_101',0)
|
call timer('d240_101',0)
|
||||||
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
|
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
|
||||||
cw,ntype,nharderrors,dmin)
|
cw,ntype,nharderrors,dmin)
|
||||||
@ -544,14 +436,17 @@ contains
|
|||||||
endif
|
endif
|
||||||
inquire(file='plotspec',exist=ex)
|
inquire(file='plotspec',exist=ex)
|
||||||
fmid=-999.0
|
fmid=-999.0
|
||||||
|
call timer('dopsprd ',0)
|
||||||
if(ex) then
|
if(ex) then
|
||||||
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
|
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
|
||||||
isbest,fc_synced,fmid,w50)
|
isbest,fc_synced,fmid,w50)
|
||||||
endif
|
endif
|
||||||
|
call timer('dopsprd ',1)
|
||||||
xsig=0
|
xsig=0
|
||||||
do i=1,NN
|
do i=1,NN
|
||||||
xsig=xsig+s4(itone(i),i)**2
|
xsig=xsig+s4(itone(i),i)
|
||||||
enddo
|
enddo
|
||||||
|
base=candidates(icand,5)
|
||||||
arg=600.0*(xsig/base)-1.0
|
arg=600.0*(xsig/base)-1.0
|
||||||
if(arg.gt.0.0) then
|
if(arg.gt.0.0) then
|
||||||
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
|
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
|
||||||
@ -567,11 +462,11 @@ contains
|
|||||||
endif
|
endif
|
||||||
nsnr=nint(xsnr)
|
nsnr=nint(xsnr)
|
||||||
qual=0.
|
qual=0.
|
||||||
fsig=fc_synced - 1.5*hmod*baud
|
fsig=fc_synced - 1.5*baud
|
||||||
if(ex) then
|
if(ex) then
|
||||||
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
|
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
|
||||||
ijitter,ntype,nsync_qual,nharderrors,dmin, &
|
ijitter,ntype,nsync_qual,nharderrors,dmin, &
|
||||||
sync,xsnr,xdt,fsig,w50,trim(msg)
|
sync,xsnr,xdt,fsig,w50,trim(msg)
|
||||||
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
|
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
|
||||||
flush(21)
|
flush(21)
|
||||||
endif
|
endif
|
||||||
@ -731,15 +626,16 @@ contains
|
|||||||
|
|
||||||
end subroutine fst4_downsample
|
end subroutine fst4_downsample
|
||||||
|
|
||||||
subroutine get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb, &
|
subroutine get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||||
minsync,ncand,candidates,base)
|
minsync,ncand,candidates)
|
||||||
|
|
||||||
complex c_bigfft(0:nfft1/2) !Full length FFT of raw data
|
complex c_bigfft(0:nfft1/2) !Full length FFT of raw data
|
||||||
integer hmod !Modulation index (submode)
|
integer hmod !Modulation index (submode)
|
||||||
integer im(1) !For maxloc
|
integer im(1) !For maxloc
|
||||||
real candidates(100,4) !Candidate list
|
real candidates(200,5) !Candidate list
|
||||||
real, allocatable :: s(:) !Low resolution power spectrum
|
real, allocatable :: s(:) !Low resolution power spectrum
|
||||||
real, allocatable :: s2(:) !CCF of s() with 4 tones
|
real, allocatable :: s2(:) !CCF of s() with 4 tones
|
||||||
|
real, allocatable :: sbase(:) !noise baseline estimate
|
||||||
real xdb(-3:3) !Model 4-tone CCF peaks
|
real xdb(-3:3) !Model 4-tone CCF peaks
|
||||||
real minsync
|
real minsync
|
||||||
data xdb/0.25,0.50,0.75,1.0,0.75,0.50,0.25/
|
data xdb/0.25,0.50,0.75,1.0,0.75,0.50,0.25/
|
||||||
@ -752,23 +648,13 @@ contains
|
|||||||
ndh=nd/2
|
ndh=nd/2
|
||||||
ia=nint(max(100.0,fa)/df2) !Low frequency search limit
|
ia=nint(max(100.0,fa)/df2) !Low frequency search limit
|
||||||
ib=nint(min(4800.0,fb)/df2) !High frequency limit
|
ib=nint(min(4800.0,fb)/df2) !High frequency limit
|
||||||
signal_bw=4*(12000.0/nsps)*hmod
|
ina=nint(max(100.0,real(nfa))/df2) !Low freq limit for noise baseline fit
|
||||||
analysis_bw=min(4800.0,fb)-max(100.0,fa)
|
inb=nint(min(4800.0,real(nfb))/df2) !High freq limit for noise fit
|
||||||
xnoise_bw=10.0*signal_bw !Is this a good compromise?
|
if(ia.lt.ina) ia=ina
|
||||||
if(analysis_bw.gt.xnoise_bw) then
|
if(ib.gt.inb) ib=inb
|
||||||
ina=ia
|
|
||||||
inb=ib
|
|
||||||
else
|
|
||||||
fcenter=(fa+fb)/2.0 !If noise_bw > analysis_bw,
|
|
||||||
fl = max(100.0,fcenter-xnoise_bw/2.)/df2 !we'll search over noise_bw
|
|
||||||
fh = min(4800.0,fcenter+xnoise_bw/2.)/df2
|
|
||||||
ina=nint(fl)
|
|
||||||
inb=nint(fh)
|
|
||||||
endif
|
|
||||||
|
|
||||||
nnw=nint(48000.*nsps*2./fs)
|
nnw=nint(48000.*nsps*2./fs)
|
||||||
allocate (s(nnw))
|
allocate (s(nnw))
|
||||||
s=0. !Compute low-resloution power spectrum
|
s=0. !Compute low-resolution power spectrum
|
||||||
do i=ina,inb ! noise analysis window includes signal analysis window
|
do i=ina,inb ! noise analysis window includes signal analysis window
|
||||||
j0=nint(i*df2/df1)
|
j0=nint(i*df2/df1)
|
||||||
do j=j0-ndh,j0+ndh
|
do j=j0-ndh,j0+ndh
|
||||||
@ -779,12 +665,15 @@ contains
|
|||||||
ina=max(ina,1+3*hmod) !Don't run off the ends
|
ina=max(ina,1+3*hmod) !Don't run off the ends
|
||||||
inb=min(inb,nnw-3*hmod)
|
inb=min(inb,nnw-3*hmod)
|
||||||
allocate (s2(nnw))
|
allocate (s2(nnw))
|
||||||
|
allocate (sbase(nnw))
|
||||||
s2=0.
|
s2=0.
|
||||||
do i=ina,inb !Compute CCF of s() and 4 tones
|
do i=ina,inb !Compute CCF of s() and 4 tones
|
||||||
s2(i)=s(i-hmod*3) + s(i-hmod) +s(i+hmod) +s(i+hmod*3)
|
s2(i)=s(i-hmod*3) + s(i-hmod) +s(i+hmod) +s(i+hmod*3)
|
||||||
enddo
|
enddo
|
||||||
call pctile(s2(ina+hmod*3:inb-hmod*3),inb-ina+1-hmod*6,30,base)
|
npct=30
|
||||||
s2=s2/base !Normalize wrt noise level
|
call fst4_baseline(s2,nnw,ina+hmod*3,inb-hmod*3,npct,sbase)
|
||||||
|
if(any(sbase(ina:inb).le.0.0)) return
|
||||||
|
s2(ina:inb)=s2(ina:inb)/sbase(ina:inb) !Normalize wrt noise level
|
||||||
|
|
||||||
ncand=0
|
ncand=0
|
||||||
candidates=0
|
candidates=0
|
||||||
@ -794,7 +683,7 @@ contains
|
|||||||
! Find candidates, using the CLEAN algorithm to remove a model of each one
|
! Find candidates, using the CLEAN algorithm to remove a model of each one
|
||||||
! from s2() after it has been found.
|
! from s2() after it has been found.
|
||||||
pval=99.99
|
pval=99.99
|
||||||
do while(ncand.lt.100)
|
do while(ncand.lt.200)
|
||||||
im=maxloc(s2(ia:ib))
|
im=maxloc(s2(ia:ib))
|
||||||
iploc=ia+im(1)-1 !Index of CCF peak
|
iploc=ia+im(1)-1 !Index of CCF peak
|
||||||
pval=s2(iploc) !Peak value
|
pval=s2(iploc) !Peak value
|
||||||
@ -808,11 +697,59 @@ contains
|
|||||||
ncand=ncand+1
|
ncand=ncand+1
|
||||||
candidates(ncand,1)=df2*iploc !Candidate frequency
|
candidates(ncand,1)=df2*iploc !Candidate frequency
|
||||||
candidates(ncand,2)=pval !Rough estimate of SNR
|
candidates(ncand,2)=pval !Rough estimate of SNR
|
||||||
|
candidates(ncand,5)=sbase(iploc)
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine get_candidates_fst4
|
end subroutine get_candidates_fst4
|
||||||
|
|
||||||
|
subroutine fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
|
||||||
|
complex c2(0:nfft2-1)
|
||||||
|
integer hmod
|
||||||
|
nspsec=int(fs2)
|
||||||
|
baud=fs2/real(nss)
|
||||||
|
fc1=0.0
|
||||||
|
if(emedelay.lt.0.1) then ! search offsets from 0 s to 2 s
|
||||||
|
is0=1.5*nspsec
|
||||||
|
ishw=1.5*nspsec
|
||||||
|
else ! search plus or minus 1.5 s centered on emedelay
|
||||||
|
is0=nint((emedelay+1.0)*nspsec)
|
||||||
|
ishw=1.5*nspsec
|
||||||
|
endif
|
||||||
|
|
||||||
|
sbest=-1.e30
|
||||||
|
do if=-12,12
|
||||||
|
fc=fc1 + 0.1*baud*if
|
||||||
|
do istart=max(1,is0-ishw),is0+ishw,4*hmod
|
||||||
|
call sync_fst4(c2,istart,fc,hmod,nsyncoh,nfft2,nss, &
|
||||||
|
ntrperiod,fs2,sync)
|
||||||
|
if(sync.gt.sbest) then
|
||||||
|
fcbest=fc
|
||||||
|
isbest=istart
|
||||||
|
sbest=sync
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
|
||||||
|
fc1=fcbest
|
||||||
|
is0=isbest
|
||||||
|
ishw=4*hmod
|
||||||
|
isst=1*hmod
|
||||||
|
|
||||||
|
sbest=0.0
|
||||||
|
do if=-7,7
|
||||||
|
fc=fc1 + 0.02*baud*if
|
||||||
|
do istart=max(1,is0-ishw),is0+ishw,isst
|
||||||
|
call sync_fst4(c2,istart,fc,hmod,nsyncoh,nfft2,nss, &
|
||||||
|
ntrperiod,fs2,sync)
|
||||||
|
if(sync.gt.sbest) then
|
||||||
|
fcbest=fc
|
||||||
|
isbest=istart
|
||||||
|
sbest=sync
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
end subroutine fst4_sync_search
|
||||||
|
|
||||||
subroutine dopspread(itone,iwave,nsps,nmax,ndown,hmod,i0,fc,fmid,w50)
|
subroutine dopspread(itone,iwave,nsps,nmax,ndown,hmod,i0,fc,fmid,w50)
|
||||||
|
|
||||||
! On "plotspec" special request, compute Doppler spread for a decoded signal
|
! On "plotspec" special request, compute Doppler spread for a decoded signal
|
||||||
@ -821,7 +758,6 @@ contains
|
|||||||
complex, allocatable :: cwave(:) !Reconstructed complex signal
|
complex, allocatable :: cwave(:) !Reconstructed complex signal
|
||||||
complex, allocatable :: g(:) !Channel gain, g(t) in QEX paper
|
complex, allocatable :: g(:) !Channel gain, g(t) in QEX paper
|
||||||
real,allocatable :: ss(:) !Computed power spectrum of g(t)
|
real,allocatable :: ss(:) !Computed power spectrum of g(t)
|
||||||
real,allocatable,save :: ssavg(:) !Computed power spectrum of g(t)
|
|
||||||
integer itone(160) !Tones for this message
|
integer itone(160) !Tones for this message
|
||||||
integer*2 iwave(nmax) !Raw Rx data
|
integer*2 iwave(nmax) !Raw Rx data
|
||||||
integer hmod !Modulation index
|
integer hmod !Modulation index
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <boost/multi_index/ordered_index.hpp>
|
#include <boost/multi_index/ordered_index.hpp>
|
||||||
#include <boost/multi_index/key_extractors.hpp>
|
#include <boost/multi_index/key_extractors.hpp>
|
||||||
#include <boost/range/iterator_range.hpp>
|
#include <boost/range/iterator_range.hpp>
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QtConcurrent/QtConcurrentRun>
|
#include <QtConcurrent/QtConcurrentRun>
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
@ -19,7 +20,9 @@
|
|||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
#include <QDateTime>
|
||||||
#include "Configuration.hpp"
|
#include "Configuration.hpp"
|
||||||
|
#include "revision_utils.hpp"
|
||||||
#include "qt_helpers.hpp"
|
#include "qt_helpers.hpp"
|
||||||
#include "pimpl_impl.hpp"
|
#include "pimpl_impl.hpp"
|
||||||
|
|
||||||
@ -252,7 +255,7 @@ namespace
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw LoaderException (std::runtime_error {"Invalid ADIF field " + fieldName.toStdString () + ": " + record.toStdString ()});
|
throw LoaderException (std::runtime_error {QCoreApplication::translate ("WorkedBefore", "Invalid ADIF field %0: %1").arg (fieldName).arg (record).toLocal8Bit ()});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (closingBracketIndex > fieldNameIndex && fieldLengthIndex > fieldNameIndex && fieldLengthIndex < closingBracketIndex)
|
if (closingBracketIndex > fieldNameIndex && fieldLengthIndex > fieldNameIndex && fieldLengthIndex < closingBracketIndex)
|
||||||
@ -269,7 +272,7 @@ namespace
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw LoaderException (std::runtime_error {"Malformed ADIF field " + fieldName.toStdString () + ": " + record.toStdString ()});
|
throw LoaderException (std::runtime_error {QCoreApplication::translate ("WorkedBefore", "Malformed ADIF field %0: %1").arg (fieldName).arg (record).toLocal8Bit ()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return QString {};
|
return QString {};
|
||||||
@ -306,7 +309,7 @@ namespace
|
|||||||
{
|
{
|
||||||
if (end_position < 0)
|
if (end_position < 0)
|
||||||
{
|
{
|
||||||
throw LoaderException (std::runtime_error {"Invalid ADIF header"});
|
throw LoaderException (std::runtime_error {QCoreApplication::translate ("WorkedBefore", "Invalid ADIF header").toLocal8Bit ()});
|
||||||
}
|
}
|
||||||
buffer.remove (0, end_position + 5);
|
buffer.remove (0, end_position + 5);
|
||||||
}
|
}
|
||||||
@ -352,7 +355,7 @@ namespace
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw LoaderException (std::runtime_error {"Error opening ADIF log file for read: " + inputFile.errorString ().toStdString ()});
|
throw LoaderException (std::runtime_error {QCoreApplication::translate ("WorkedBefore", "Error opening ADIF log file for read: %0").arg (inputFile.errorString ()).toLocal8Bit ()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return worked;
|
return worked;
|
||||||
@ -442,7 +445,18 @@ bool WorkedBefore::add (QString const& call
|
|||||||
QTextStream out {&file};
|
QTextStream out {&file};
|
||||||
if (!file.size ())
|
if (!file.size ())
|
||||||
{
|
{
|
||||||
out << "WSJT-X ADIF Export<eoh>" << // new file
|
auto ts = QDateTime::currentDateTimeUtc ().toString ("yyyyMMdd HHmmss");
|
||||||
|
auto ver = version (true);
|
||||||
|
out << // new file
|
||||||
|
QString {
|
||||||
|
"ADIF Export\n"
|
||||||
|
"<adif_ver:5>3.1.1\n"
|
||||||
|
"<created_timestamp:15>%0\n"
|
||||||
|
"<programid:6>WSJT-X\n"
|
||||||
|
"<programversion:%1>%2\n"
|
||||||
|
"<eoh>"
|
||||||
|
}.arg (ts).arg (ver.size ()).arg (ver)
|
||||||
|
<<
|
||||||
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
||||||
endl
|
endl
|
||||||
#else
|
#else
|
||||||
|
@ -79,7 +79,7 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q
|
|||||||
QString t;
|
QString t;
|
||||||
t = "<call:" + QString::number(hisCall.size()) + ">" + hisCall;
|
t = "<call:" + QString::number(hisCall.size()) + ">" + hisCall;
|
||||||
t += " <gridsquare:" + QString::number(hisGrid.size()) + ">" + hisGrid;
|
t += " <gridsquare:" + QString::number(hisGrid.size()) + ">" + hisGrid;
|
||||||
if (mode != "FT4")
|
if (mode != "FT4" && mode != "FST4")
|
||||||
{
|
{
|
||||||
t += " <mode:" + QString::number(mode.size()) + ">" + mode;
|
t += " <mode:" + QString::number(mode.size()) + ">" + mode;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,9 @@ namespace
|
|||||||
{"15m", 21000000u, 21450000u},
|
{"15m", 21000000u, 21450000u},
|
||||||
{"12m", 24890000u, 24990000u},
|
{"12m", 24890000u, 24990000u},
|
||||||
{"10m", 28000000u, 29700000u},
|
{"10m", 28000000u, 29700000u},
|
||||||
|
{"8m", 40000000u, 45000000u},
|
||||||
{"6m", 50000000u, 54000000u},
|
{"6m", 50000000u, 54000000u},
|
||||||
|
{"5m", 54000001u, 69900000u},
|
||||||
{"4m", 70000000u, 71000000u},
|
{"4m", 70000000u, 71000000u},
|
||||||
{"2m", 144000000u, 148000000u},
|
{"2m", 144000000u, 148000000u},
|
||||||
{"1.25m", 222000000u, 225000000u},
|
{"1.25m", 222000000u, 225000000u},
|
||||||
|
@ -46,16 +46,14 @@ namespace
|
|||||||
{20000000, Modes::FreqCal, IARURegions::ALL},
|
{20000000, Modes::FreqCal, IARURegions::ALL},
|
||||||
|
|
||||||
{136000, Modes::WSPR, IARURegions::ALL},
|
{136000, Modes::WSPR, IARURegions::ALL},
|
||||||
{136200, Modes::FST4W, IARURegions::ALL},
|
{136000, Modes::FST4, IARURegions::ALL},
|
||||||
{136130, Modes::JT65, IARURegions::ALL},
|
{136000, Modes::FST4W, IARURegions::ALL},
|
||||||
{136130, Modes::JT9, IARURegions::ALL},
|
{136130, Modes::JT9, IARURegions::ALL},
|
||||||
{136130, Modes::FST4, IARURegions::ALL},
|
|
||||||
|
|
||||||
{474200, Modes::JT65, IARURegions::ALL},
|
|
||||||
{474200, Modes::JT9, IARURegions::ALL},
|
{474200, Modes::JT9, IARURegions::ALL},
|
||||||
{474200, Modes::FST4, IARURegions::ALL},
|
{474200, Modes::FST4, IARURegions::ALL},
|
||||||
{474200, Modes::WSPR, IARURegions::ALL},
|
{474200, Modes::WSPR, IARURegions::ALL},
|
||||||
{474400, Modes::FST4W, IARURegions::ALL},
|
{474200, Modes::FST4W, IARURegions::ALL},
|
||||||
|
|
||||||
{1836600, Modes::WSPR, IARURegions::ALL},
|
{1836600, Modes::WSPR, IARURegions::ALL},
|
||||||
{1836800, Modes::FST4W, IARURegions::ALL},
|
{1836800, Modes::FST4W, IARURegions::ALL},
|
||||||
@ -93,10 +91,8 @@ namespace
|
|||||||
//
|
//
|
||||||
{3570000, Modes::JT65, IARURegions::ALL}, // JA compatible
|
{3570000, Modes::JT65, IARURegions::ALL}, // JA compatible
|
||||||
{3572000, Modes::JT9, IARURegions::ALL},
|
{3572000, Modes::JT9, IARURegions::ALL},
|
||||||
{3572000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation
|
{3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation
|
||||||
{3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out
|
{3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out
|
||||||
{3568800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{3575000, Modes::FT4, IARURegions::ALL}, // provisional
|
{3575000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
{3568000, Modes::FT4, IARURegions::R3}, // provisional
|
{3568000, Modes::FT4, IARURegions::R3}, // provisional
|
||||||
|
|
||||||
@ -132,11 +128,9 @@ namespace
|
|||||||
// 7110 LSB EMCOMM
|
// 7110 LSB EMCOMM
|
||||||
//
|
//
|
||||||
{7038600, Modes::WSPR, IARURegions::ALL},
|
{7038600, Modes::WSPR, IARURegions::ALL},
|
||||||
{7038800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{7074000, Modes::FT8, IARURegions::ALL},
|
{7074000, Modes::FT8, IARURegions::ALL},
|
||||||
{7076000, Modes::JT65, IARURegions::ALL},
|
{7076000, Modes::JT65, IARURegions::ALL},
|
||||||
{7078000, Modes::JT9, IARURegions::ALL},
|
{7078000, Modes::JT9, IARURegions::ALL},
|
||||||
{7078000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{7047500, Modes::FT4, IARURegions::ALL}, // provisional - moved
|
{7047500, Modes::FT4, IARURegions::ALL}, // provisional - moved
|
||||||
// up 500Hz to clear
|
// up 500Hz to clear
|
||||||
// W1AW code practice QRG
|
// W1AW code practice QRG
|
||||||
@ -170,9 +164,7 @@ namespace
|
|||||||
{10136000, Modes::FT8, IARURegions::ALL},
|
{10136000, Modes::FT8, IARURegions::ALL},
|
||||||
{10138000, Modes::JT65, IARURegions::ALL},
|
{10138000, Modes::JT65, IARURegions::ALL},
|
||||||
{10138700, Modes::WSPR, IARURegions::ALL},
|
{10138700, Modes::WSPR, IARURegions::ALL},
|
||||||
{10138900, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{10140000, Modes::JT9, IARURegions::ALL},
|
{10140000, Modes::JT9, IARURegions::ALL},
|
||||||
{10140000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{10140000, Modes::FT4, IARURegions::ALL}, // provisional
|
{10140000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
@ -213,11 +205,9 @@ namespace
|
|||||||
// 14106.5 OLIVIA 1000 (main QRG)
|
// 14106.5 OLIVIA 1000 (main QRG)
|
||||||
//
|
//
|
||||||
{14095600, Modes::WSPR, IARURegions::ALL},
|
{14095600, Modes::WSPR, IARURegions::ALL},
|
||||||
{14095800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{14074000, Modes::FT8, IARURegions::ALL},
|
{14074000, Modes::FT8, IARURegions::ALL},
|
||||||
{14076000, Modes::JT65, IARURegions::ALL},
|
{14076000, Modes::JT65, IARURegions::ALL},
|
||||||
{14078000, Modes::JT9, IARURegions::ALL},
|
{14078000, Modes::JT9, IARURegions::ALL},
|
||||||
{14078000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{14080000, Modes::FT4, IARURegions::ALL}, // provisional
|
{14080000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
@ -250,33 +240,25 @@ namespace
|
|||||||
{18100000, Modes::FT8, IARURegions::ALL},
|
{18100000, Modes::FT8, IARURegions::ALL},
|
||||||
{18102000, Modes::JT65, IARURegions::ALL},
|
{18102000, Modes::JT65, IARURegions::ALL},
|
||||||
{18104000, Modes::JT9, IARURegions::ALL},
|
{18104000, Modes::JT9, IARURegions::ALL},
|
||||||
{18104000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{18104000, Modes::FT4, IARURegions::ALL}, // provisional
|
{18104000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
{18104600, Modes::WSPR, IARURegions::ALL},
|
{18104600, Modes::WSPR, IARURegions::ALL},
|
||||||
{18104800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
|
|
||||||
{21074000, Modes::FT8, IARURegions::ALL},
|
{21074000, Modes::FT8, IARURegions::ALL},
|
||||||
{21076000, Modes::JT65, IARURegions::ALL},
|
{21076000, Modes::JT65, IARURegions::ALL},
|
||||||
{21078000, Modes::JT9, IARURegions::ALL},
|
{21078000, Modes::JT9, IARURegions::ALL},
|
||||||
{21078000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{21094600, Modes::WSPR, IARURegions::ALL},
|
{21094600, Modes::WSPR, IARURegions::ALL},
|
||||||
{21094800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{21140000, Modes::FT4, IARURegions::ALL},
|
{21140000, Modes::FT4, IARURegions::ALL},
|
||||||
|
|
||||||
{24915000, Modes::FT8, IARURegions::ALL},
|
{24915000, Modes::FT8, IARURegions::ALL},
|
||||||
{24917000, Modes::JT65, IARURegions::ALL},
|
{24917000, Modes::JT65, IARURegions::ALL},
|
||||||
{24919000, Modes::JT9, IARURegions::ALL},
|
{24919000, Modes::JT9, IARURegions::ALL},
|
||||||
{24919000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{24919000, Modes::FT4, IARURegions::ALL}, // provisional
|
{24919000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
{24924600, Modes::WSPR, IARURegions::ALL},
|
{24924600, Modes::WSPR, IARURegions::ALL},
|
||||||
{24924800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
|
|
||||||
{28074000, Modes::FT8, IARURegions::ALL},
|
{28074000, Modes::FT8, IARURegions::ALL},
|
||||||
{28076000, Modes::JT65, IARURegions::ALL},
|
{28076000, Modes::JT65, IARURegions::ALL},
|
||||||
{28078000, Modes::JT9, IARURegions::ALL},
|
{28078000, Modes::JT9, IARURegions::ALL},
|
||||||
{28078000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{28124600, Modes::WSPR, IARURegions::ALL},
|
{28124600, Modes::WSPR, IARURegions::ALL},
|
||||||
{28124800, Modes::FST4W, IARURegions::ALL},
|
|
||||||
{28180000, Modes::FT4, IARURegions::ALL},
|
{28180000, Modes::FT4, IARURegions::ALL},
|
||||||
|
|
||||||
{50200000, Modes::Echo, IARURegions::ALL},
|
{50200000, Modes::Echo, IARURegions::ALL},
|
||||||
@ -287,11 +269,8 @@ namespace
|
|||||||
{50260000, Modes::MSK144, IARURegions::R3},
|
{50260000, Modes::MSK144, IARURegions::R3},
|
||||||
{50293000, Modes::WSPR, IARURegions::R2},
|
{50293000, Modes::WSPR, IARURegions::R2},
|
||||||
{50293000, Modes::WSPR, IARURegions::R3},
|
{50293000, Modes::WSPR, IARURegions::R3},
|
||||||
{50293200, Modes::FST4W, IARURegions::R2},
|
|
||||||
{50293200, Modes::FST4W, IARURegions::R3},
|
|
||||||
{50310000, Modes::JT65, IARURegions::ALL},
|
{50310000, Modes::JT65, IARURegions::ALL},
|
||||||
{50312000, Modes::JT9, IARURegions::ALL},
|
{50312000, Modes::JT9, IARURegions::ALL},
|
||||||
{50312000, Modes::FST4, IARURegions::ALL},
|
|
||||||
{50313000, Modes::FT8, IARURegions::ALL},
|
{50313000, Modes::FT8, IARURegions::ALL},
|
||||||
{50318000, Modes::FT4, IARURegions::ALL}, // provisional
|
{50318000, Modes::FT4, IARURegions::ALL}, // provisional
|
||||||
{50323000, Modes::FT8, IARURegions::ALL},
|
{50323000, Modes::FT8, IARURegions::ALL},
|
||||||
@ -300,7 +279,6 @@ namespace
|
|||||||
{70102000, Modes::JT65, IARURegions::R1},
|
{70102000, Modes::JT65, IARURegions::R1},
|
||||||
{70104000, Modes::JT9, IARURegions::R1},
|
{70104000, Modes::JT9, IARURegions::R1},
|
||||||
{70091000, Modes::WSPR, IARURegions::R1},
|
{70091000, Modes::WSPR, IARURegions::R1},
|
||||||
{70091200, Modes::FST4W, IARURegions::R2},
|
|
||||||
{70230000, Modes::MSK144, IARURegions::R1},
|
{70230000, Modes::MSK144, IARURegions::R1},
|
||||||
|
|
||||||
{144120000, Modes::JT65, IARURegions::ALL},
|
{144120000, Modes::JT65, IARURegions::ALL},
|
||||||
@ -310,7 +288,6 @@ namespace
|
|||||||
{144360000, Modes::MSK144, IARURegions::R1},
|
{144360000, Modes::MSK144, IARURegions::R1},
|
||||||
{144150000, Modes::MSK144, IARURegions::R2},
|
{144150000, Modes::MSK144, IARURegions::R2},
|
||||||
{144489000, Modes::WSPR, IARURegions::ALL},
|
{144489000, Modes::WSPR, IARURegions::ALL},
|
||||||
{144489200, Modes::FST4W, IARURegions::R2},
|
|
||||||
{144120000, Modes::QRA64, IARURegions::ALL},
|
{144120000, Modes::QRA64, IARURegions::ALL},
|
||||||
|
|
||||||
{222065000, Modes::Echo, IARURegions::R2},
|
{222065000, Modes::Echo, IARURegions::R2},
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -54,7 +54,7 @@ void LiveFrequencyValidator::fixup (QString& input) const
|
|||||||
input = input.toLower ();
|
input = input.toLower ();
|
||||||
|
|
||||||
QVector<QVariant> frequencies;
|
QVector<QVariant> frequencies;
|
||||||
for (auto const& item : frequencies_->frequency_list ())
|
for (auto const& item : *frequencies_)
|
||||||
{
|
{
|
||||||
if (bands_->find (item.frequency_) == input)
|
if (bands_->find (item.frequency_) == input)
|
||||||
{
|
{
|
||||||
|
@ -21,9 +21,9 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
|
|||||||
"© 2001-2020 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
"© 2001-2020 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
|
||||||
"and Steve Franke, K9AN. <br /><br />"
|
"and Steve Franke, K9AN. <br /><br />"
|
||||||
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
|
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
|
||||||
"DF2ET, DJ0OT, G3WDG, G4KLA, IV3NWV, IW3RAB, K3WYC, KA6MAL,<br />"
|
"DF2ET, DJ0OT, G3WDG, G4KLA, IV3NWV, IW3RAB, KA1GT, K3WYC,<br />"
|
||||||
"KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR, VE1SKY,<br />"
|
"KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,<br />"
|
||||||
"VK3ACF, VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB.<br /><br />"
|
"VE1SKY, VK3ACF, VK4BDJ, VK7MO, W4TI, W4TV, and W9MDB.<br /><br />"
|
||||||
"WSJT-X is licensed under the terms of Version 3 <br />"
|
"WSJT-X is licensed under the terms of Version 3 <br />"
|
||||||
"of the GNU General Public License (GPL) <br /><br />"
|
"of the GNU General Public License (GPL) <br /><br />"
|
||||||
"<a href=" WSJTX_STRINGIZE (PROJECT_HOMEPAGE) ">"
|
"<a href=" WSJTX_STRINGIZE (PROJECT_HOMEPAGE) ">"
|
||||||
|
@ -42,7 +42,7 @@ Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget
|
|||||||
, m_DopplerMethod {0}
|
, m_DopplerMethod {0}
|
||||||
, m_dop {0}
|
, m_dop {0}
|
||||||
, m_dop00 {0}
|
, m_dop00 {0}
|
||||||
, m_dx_two_way_dop {0}
|
//, m_dx_two_way_dop {0}
|
||||||
{
|
{
|
||||||
ui_->setupUi (this);
|
ui_->setupUi (this);
|
||||||
setWindowTitle (QApplication::applicationName () + " - " + tr ("Astronomical Data"));
|
setWindowTitle (QApplication::applicationName () + " - " + tr ("Astronomical Data"));
|
||||||
@ -77,8 +77,8 @@ void Astro::read_settings ()
|
|||||||
case 1: ui_->rbFullTrack->setChecked (true); break;
|
case 1: ui_->rbFullTrack->setChecked (true); break;
|
||||||
case 2: ui_->rbConstFreqOnMoon->setChecked (true); break;
|
case 2: ui_->rbConstFreqOnMoon->setChecked (true); break;
|
||||||
case 3: ui_->rbOwnEcho->setChecked (true); break;
|
case 3: ui_->rbOwnEcho->setChecked (true); break;
|
||||||
case 4: ui_->rbOnDxEcho->setChecked (true); break;
|
case 4: ui_->rbOnDxEcho->setChecked (true); break;
|
||||||
case 5: ui_->rbCallDx->setChecked (true); break;
|
case 5: ui_->rbCallDx->setChecked (true); break;
|
||||||
}
|
}
|
||||||
move (settings_->value ("window/pos", pos ()).toPoint ());
|
move (settings_->value ("window/pos", pos ()).toPoint ());
|
||||||
}
|
}
|
||||||
@ -168,38 +168,35 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
|
|||||||
switch (m_DopplerMethod)
|
switch (m_DopplerMethod)
|
||||||
{
|
{
|
||||||
case 1: // All Doppler correction done here; DX station stays at nominal dial frequency.
|
case 1: // All Doppler correction done here; DX station stays at nominal dial frequency.
|
||||||
correction.rx = m_dop;
|
correction.rx = m_dop;
|
||||||
break;
|
break;
|
||||||
case 4: // All Doppler correction done here; DX station stays at nominal dial frequency. (Trial for OnDxEcho)
|
case 4: // All Doppler correction done here; DX station stays at nominal dial frequency. (Trial for OnDxEcho)
|
||||||
correction.rx = m_dop;
|
correction.rx = m_dop;
|
||||||
break;
|
break;
|
||||||
//case 5: // All Doppler correction done here; DX station stays at nominal dial frequency.
|
//case 5: // All Doppler correction done here; DX station stays at nominal dial frequency.
|
||||||
|
|
||||||
case 3: // Both stations do full correction on Rx and none on Tx
|
case 3: // Both stations do full correction on Rx and none on Tx
|
||||||
//correction.rx = dx_is_self ? m_dop00 : m_dop;
|
//correction.rx = dx_is_self ? m_dop00 : m_dop;
|
||||||
correction.rx = m_dop00; // Now always sets RX to *own* echo freq
|
correction.rx = m_dop00; // Now always sets RX to *own* echo freq
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
// Doppler correction to constant frequency on Moon
|
// Doppler correction to constant frequency on Moon
|
||||||
correction.rx = m_dop00 / 2;
|
correction.rx = m_dop00 / 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
switch (m_DopplerMethod)
|
switch (m_DopplerMethod)
|
||||||
{
|
{
|
||||||
case 1: correction.tx = -correction.rx;
|
case 1: correction.tx = -correction.rx;
|
||||||
break;
|
break;
|
||||||
case 2: correction.tx = -correction.rx;
|
case 2: correction.tx = -correction.rx;
|
||||||
break;
|
break;
|
||||||
case 3: correction.tx = 0;
|
case 3: correction.tx = 0;
|
||||||
break;
|
break;
|
||||||
case 4: // correction.tx = m_dop - m_dop00;
|
case 4: // correction.tx = m_dop - m_dop00;
|
||||||
|
correction.tx = (2 * (m_dop - (m_dop00/2))) - m_dop;
|
||||||
correction.tx = m_dx_two_way_dop - m_dop;
|
//qDebug () << "correction.tx:" << correction.tx;
|
||||||
qDebug () << "correction.tx:" << correction.tx;
|
break;
|
||||||
break;
|
case 5: correction.tx = - m_dop00;
|
||||||
case 5: correction.tx = - m_dop00;
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
//if (3 != m_DopplerMethod || 4 != m_DopplerMethod) correction.tx = -correction.rx;
|
//if (3 != m_DopplerMethod || 4 != m_DopplerMethod) correction.tx = -correction.rx;
|
||||||
|
|
||||||
@ -242,22 +239,20 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
|
|||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
// Doppler correction to constant frequency on Moon
|
// Doppler correction to constant frequency on Moon
|
||||||
offset = m_dop00 / 2;
|
offset = m_dop00 / 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
// Doppler correction for OnDxEcho
|
// Doppler correction for OnDxEcho
|
||||||
offset = m_dop - m_dx_two_way_dop;
|
offset = m_dop - (2 * (m_dop - (m_dop00/2)));
|
||||||
|
break;
|
||||||
|
|
||||||
|
//case 5: correction.tx = - m_dop00;
|
||||||
|
case 5: offset = m_dop00;// version for _7
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//case 5: correction.tx = - m_dop00;
|
|
||||||
case 5: offset = m_dop00;// version for _7
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
correction.tx = -offset;
|
correction.tx = -offset;
|
||||||
qDebug () << "correction.tx (no tx qsy):" << correction.tx;
|
//qDebug () << "correction.tx (no tx qsy):" << correction.tx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return correction;
|
return correction;
|
||||||
@ -281,14 +276,14 @@ void Astro::on_rbFullTrack_clicked()
|
|||||||
Q_EMIT tracking_update ();
|
Q_EMIT tracking_update ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Astro::on_rbOnDxEcho_clicked(bool checked)
|
void Astro::on_rbOnDxEcho_clicked() //on_rbOnDxEcho_clicked(bool checked)
|
||||||
{
|
{
|
||||||
m_DopplerMethod = 4;
|
m_DopplerMethod = 4;
|
||||||
check_split ();
|
check_split ();
|
||||||
if (checked) {
|
//if (checked) {
|
||||||
m_dx_two_way_dop = 2 * (m_dop - (m_dop00/2));
|
// m_dx_two_way_dop = 2 * (m_dop - (m_dop00/2));
|
||||||
qDebug () << "Starting Doppler:" << m_dx_two_way_dop;
|
// qDebug () << "Starting Doppler:" << m_dx_two_way_dop;
|
||||||
}
|
//}
|
||||||
Q_EMIT tracking_update ();
|
Q_EMIT tracking_update ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ private slots:
|
|||||||
void on_rbFullTrack_clicked();
|
void on_rbFullTrack_clicked();
|
||||||
void on_rbOwnEcho_clicked();
|
void on_rbOwnEcho_clicked();
|
||||||
void on_rbNoDoppler_clicked();
|
void on_rbNoDoppler_clicked();
|
||||||
void on_rbOnDxEcho_clicked(bool);
|
void on_rbOnDxEcho_clicked();
|
||||||
void on_rbCallDx_clicked();
|
void on_rbCallDx_clicked();
|
||||||
void on_cbDopplerTracking_toggled(bool);
|
void on_cbDopplerTracking_toggled(bool);
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ private:
|
|||||||
qint32 m_DopplerMethod;
|
qint32 m_DopplerMethod;
|
||||||
int m_dop;
|
int m_dop;
|
||||||
int m_dop00;
|
int m_dop00;
|
||||||
int m_dx_two_way_dop;
|
//int m_dx_two_way_dop;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline
|
inline
|
||||||
|
@ -569,15 +569,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
} else if (text.isEmpty ()) {
|
} else if (text.isEmpty ()) {
|
||||||
ui->tx5->setCurrentText (text);
|
ui->tx5->setCurrentText (text);
|
||||||
}
|
}
|
||||||
} else if (1 == ui->tabWidget->currentIndex ()) {
|
|
||||||
if (!text.isEmpty ()) {
|
|
||||||
ui->freeTextMsg->setCurrentText (text);
|
|
||||||
}
|
|
||||||
if (send) {
|
|
||||||
ui->rbFreeText->click ();
|
|
||||||
} else if (text.isEmpty ()) {
|
|
||||||
ui->freeTextMsg->setCurrentText (text);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
QApplication::alert (this);
|
QApplication::alert (this);
|
||||||
});
|
});
|
||||||
@ -813,17 +804,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
ui->tx4->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui->tx4->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui->tx5->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui->tx5->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui->tx6->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui->tx6->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui->freeTextMsg->setValidator (new QRegExpValidator {message_alphabet, this});
|
|
||||||
|
|
||||||
// Free text macros model to widget hook up.
|
// Free text macros model to widget hook up.
|
||||||
ui->tx5->setModel (m_config.macros ());
|
ui->tx5->setModel (m_config.macros ());
|
||||||
connect (ui->tx5->lineEdit(), &QLineEdit::editingFinished,
|
connect (ui->tx5->lineEdit(), &QLineEdit::editingFinished,
|
||||||
[this] () {on_tx5_currentTextChanged (ui->tx5->lineEdit()->text());});
|
[this] () {on_tx5_currentTextChanged (ui->tx5->lineEdit()->text());});
|
||||||
ui->freeTextMsg->setModel (m_config.macros ());
|
|
||||||
connect (ui->freeTextMsg->lineEdit ()
|
|
||||||
, &QLineEdit::editingFinished
|
|
||||||
, [this] () {on_freeTextMsg_currentTextChanged (ui->freeTextMsg->lineEdit ()->text ());});
|
|
||||||
|
|
||||||
connect(&m_guiTimer, &QTimer::timeout, this, &MainWindow::guiUpdate);
|
connect(&m_guiTimer, &QTimer::timeout, this, &MainWindow::guiUpdate);
|
||||||
m_guiTimer.start(100); //### Don't change the 100 ms! ###
|
m_guiTimer.start(100); //### Don't change the 100 ms! ###
|
||||||
|
|
||||||
@ -969,9 +954,6 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
|
|
||||||
enable_DXCC_entity (m_config.DXCC ()); // sets text window proportions and (re)inits the logbook
|
enable_DXCC_entity (m_config.DXCC ()); // sets text window proportions and (re)inits the logbook
|
||||||
|
|
||||||
ui->label_9->setStyleSheet("QLabel{color: #000000; background-color: #aabec8}");
|
|
||||||
ui->label_10->setStyleSheet("QLabel{color: #000000; background-color: #aabec8}");
|
|
||||||
|
|
||||||
// this must be done before initializing the mode as some modes need
|
// this must be done before initializing the mode as some modes need
|
||||||
// to turn off split on the rig e.g. WSPR
|
// to turn off split on the rig e.g. WSPR
|
||||||
m_config.transceiver_online ();
|
m_config.transceiver_online ();
|
||||||
@ -1129,7 +1111,6 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue ("MsgAvgDisplayed", m_msgAvgWidget && m_msgAvgWidget->isVisible ());
|
m_settings->setValue ("MsgAvgDisplayed", m_msgAvgWidget && m_msgAvgWidget->isVisible ());
|
||||||
m_settings->setValue ("FoxLogDisplayed", m_foxLogWindow && m_foxLogWindow->isVisible ());
|
m_settings->setValue ("FoxLogDisplayed", m_foxLogWindow && m_foxLogWindow->isVisible ());
|
||||||
m_settings->setValue ("ContestLogDisplayed", m_contestLogWindow && m_contestLogWindow->isVisible ());
|
m_settings->setValue ("ContestLogDisplayed", m_contestLogWindow && m_contestLogWindow->isVisible ());
|
||||||
m_settings->setValue ("FreeText", ui->freeTextMsg->currentText ());
|
|
||||||
m_settings->setValue("ShowMenus",ui->cbMenus->isChecked());
|
m_settings->setValue("ShowMenus",ui->cbMenus->isChecked());
|
||||||
m_settings->setValue("CallFirst",ui->cbFirst->isChecked());
|
m_settings->setValue("CallFirst",ui->cbFirst->isChecked());
|
||||||
m_settings->setValue("HoundSort",ui->comboBoxHoundSort->currentIndex());
|
m_settings->setValue("HoundSort",ui->comboBoxHoundSort->currentIndex());
|
||||||
@ -1149,6 +1130,8 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue("RxFreq",ui->RxFreqSpinBox->value());
|
m_settings->setValue("RxFreq",ui->RxFreqSpinBox->value());
|
||||||
m_settings->setValue("TxFreq",ui->TxFreqSpinBox->value());
|
m_settings->setValue("TxFreq",ui->TxFreqSpinBox->value());
|
||||||
m_settings->setValue("WSPRfreq",ui->WSPRfreqSpinBox->value());
|
m_settings->setValue("WSPRfreq",ui->WSPRfreqSpinBox->value());
|
||||||
|
m_settings->setValue("FST4W_RxFreq",ui->sbFST4W_RxFreq->value());
|
||||||
|
m_settings->setValue("FST4W_FTol",ui->sbFST4W_FTol->value());
|
||||||
m_settings->setValue("SubMode",ui->sbSubmode->value());
|
m_settings->setValue("SubMode",ui->sbSubmode->value());
|
||||||
m_settings->setValue("DTtol",m_DTtol);
|
m_settings->setValue("DTtol",m_DTtol);
|
||||||
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
||||||
@ -1164,6 +1147,7 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue("OutBufSize",outBufSize);
|
m_settings->setValue("OutBufSize",outBufSize);
|
||||||
m_settings->setValue ("HoldTxFreq", ui->cbHoldTxFreq->isChecked ());
|
m_settings->setValue ("HoldTxFreq", ui->cbHoldTxFreq->isChecked ());
|
||||||
m_settings->setValue("PctTx", ui->sbTxPercent->value ());
|
m_settings->setValue("PctTx", ui->sbTxPercent->value ());
|
||||||
|
m_settings->setValue("RoundRobin",ui->RoundRobin->currentText());
|
||||||
m_settings->setValue("dBm",m_dBm);
|
m_settings->setValue("dBm",m_dBm);
|
||||||
m_settings->setValue("RR73",m_send_RR73);
|
m_settings->setValue("RR73",m_send_RR73);
|
||||||
m_settings->setValue ("WSPRPreferType1", ui->WSPR_prefer_type_1_check_box->isChecked ());
|
m_settings->setValue ("WSPRPreferType1", ui->WSPR_prefer_type_1_check_box->isChecked ());
|
||||||
@ -1210,8 +1194,6 @@ void MainWindow::readSettings()
|
|||||||
auto displayMsgAvg = m_settings->value ("MsgAvgDisplayed", false).toBool ();
|
auto displayMsgAvg = m_settings->value ("MsgAvgDisplayed", false).toBool ();
|
||||||
auto displayFoxLog = m_settings->value ("FoxLogDisplayed", false).toBool ();
|
auto displayFoxLog = m_settings->value ("FoxLogDisplayed", false).toBool ();
|
||||||
auto displayContestLog = m_settings->value ("ContestLogDisplayed", false).toBool ();
|
auto displayContestLog = m_settings->value ("ContestLogDisplayed", false).toBool ();
|
||||||
if (m_settings->contains ("FreeText")) ui->freeTextMsg->setCurrentText (
|
|
||||||
m_settings->value ("FreeText").toString ());
|
|
||||||
ui->cbMenus->setChecked(m_settings->value("ShowMenus",true).toBool());
|
ui->cbMenus->setChecked(m_settings->value("ShowMenus",true).toBool());
|
||||||
ui->cbFirst->setChecked(m_settings->value("CallFirst",true).toBool());
|
ui->cbFirst->setChecked(m_settings->value("CallFirst",true).toBool());
|
||||||
ui->comboBoxHoundSort->setCurrentIndex(m_settings->value("HoundSort",3).toInt());
|
ui->comboBoxHoundSort->setCurrentIndex(m_settings->value("HoundSort",3).toInt());
|
||||||
@ -1235,8 +1217,11 @@ void MainWindow::readSettings()
|
|||||||
ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool());
|
ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool());
|
||||||
ui->RxFreqSpinBox->setValue(0); // ensure a change is signaled
|
ui->RxFreqSpinBox->setValue(0); // ensure a change is signaled
|
||||||
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
|
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
|
||||||
|
ui->sbFST4W_RxFreq->setValue(0);
|
||||||
|
ui->sbFST4W_RxFreq->setValue(m_settings->value("FST4W_RxFreq",1500).toInt());
|
||||||
m_nSubMode=m_settings->value("SubMode",0).toInt();
|
m_nSubMode=m_settings->value("SubMode",0).toInt();
|
||||||
ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
|
ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
|
||||||
|
ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt());
|
||||||
m_minSync=m_settings->value("MinSync",0).toInt();
|
m_minSync=m_settings->value("MinSync",0).toInt();
|
||||||
ui->syncSpinBox->setValue(m_minSync);
|
ui->syncSpinBox->setValue(m_minSync);
|
||||||
ui->cbAutoSeq->setChecked (m_settings->value ("AutoSeq", false).toBool());
|
ui->cbAutoSeq->setChecked (m_settings->value ("AutoSeq", false).toBool());
|
||||||
@ -1256,6 +1241,7 @@ void MainWindow::readSettings()
|
|||||||
m_ndepth=m_settings->value("NDepth",3).toInt();
|
m_ndepth=m_settings->value("NDepth",3).toInt();
|
||||||
ui->sbTxPercent->setValue (m_settings->value ("PctTx", 20).toInt ());
|
ui->sbTxPercent->setValue (m_settings->value ("PctTx", 20).toInt ());
|
||||||
on_sbTxPercent_valueChanged (ui->sbTxPercent->value ());
|
on_sbTxPercent_valueChanged (ui->sbTxPercent->value ());
|
||||||
|
ui->RoundRobin->setCurrentText(m_settings->value("RoundRobin",tr("Random")).toString());
|
||||||
m_dBm=m_settings->value("dBm",37).toInt();
|
m_dBm=m_settings->value("dBm",37).toInt();
|
||||||
m_send_RR73=m_settings->value("RR73",false).toBool();
|
m_send_RR73=m_settings->value("RR73",false).toBool();
|
||||||
if(m_send_RR73) {
|
if(m_send_RR73) {
|
||||||
@ -1897,7 +1883,7 @@ void MainWindow::on_monitorButton_clicked (bool checked)
|
|||||||
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
|
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
|
||||||
}
|
}
|
||||||
//Get Configuration in/out of strict split and mode checking
|
//Get Configuration in/out of strict split and mode checking
|
||||||
Q_EMIT m_config.sync_transceiver (true, checked);
|
m_config.sync_transceiver (true, checked);
|
||||||
} else {
|
} else {
|
||||||
ui->monitorButton->setChecked (false); // disallow
|
ui->monitorButton->setChecked (false); // disallow
|
||||||
}
|
}
|
||||||
@ -2120,9 +2106,6 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
|
|||||||
if(ui->tabWidget->currentIndex()==0) {
|
if(ui->tabWidget->currentIndex()==0) {
|
||||||
ui->tx5->clearEditText();
|
ui->tx5->clearEditText();
|
||||||
ui->tx5->setFocus();
|
ui->tx5->setFocus();
|
||||||
} else {
|
|
||||||
ui->freeTextMsg->clearEditText();
|
|
||||||
ui->freeTextMsg->setFocus();
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2218,7 +2201,7 @@ void MainWindow::displayDialFrequency ()
|
|||||||
{
|
{
|
||||||
// only change this when necessary as we get called a lot and it
|
// only change this when necessary as we get called a lot and it
|
||||||
// would trash any user input to the band combo box line edit
|
// would trash any user input to the band combo box line edit
|
||||||
ui->bandComboBox->setCurrentText (band_name);
|
ui->bandComboBox->setCurrentText (band_name.size () ? band_name : m_config.bands ()->oob ());
|
||||||
m_wideGraph->setRxBand (band_name);
|
m_wideGraph->setRxBand (band_name);
|
||||||
m_lastBand = band_name;
|
m_lastBand = band_name;
|
||||||
band_changed(dial_frequency);
|
band_changed(dial_frequency);
|
||||||
@ -2480,9 +2463,9 @@ void MainWindow::on_actionFT8_DXpedition_Mode_User_Guide_triggered()
|
|||||||
QDesktopServices::openUrl (QUrl {"http://physics.princeton.edu/pulsar/k1jt/FT8_DXpedition_Mode.pdf"});
|
QDesktopServices::openUrl (QUrl {"http://physics.princeton.edu/pulsar/k1jt/FT8_DXpedition_Mode.pdf"});
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionQuick_Start_Guide_v2_triggered()
|
void MainWindow::on_actionQuick_Start_Guide_triggered()
|
||||||
{
|
{
|
||||||
QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/Quick_Start_WSJT-X_2.0.pdf"});
|
QDesktopServices::openUrl (QUrl {"https://physics.princeton.edu/pulsar/k1jt/FST4_Quick_Start.pdf"});
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionOnline_User_Guide_triggered() //Display manual
|
void MainWindow::on_actionOnline_User_Guide_triggered() //Display manual
|
||||||
@ -2600,9 +2583,7 @@ void MainWindow::hideMenus(bool checked)
|
|||||||
}
|
}
|
||||||
ui->decodedTextLabel->setVisible(!checked);
|
ui->decodedTextLabel->setVisible(!checked);
|
||||||
ui->gridLayout_5->layout()->setSpacing(spacing);
|
ui->gridLayout_5->layout()->setSpacing(spacing);
|
||||||
ui->horizontalLayout->layout()->setSpacing(spacing);
|
|
||||||
ui->horizontalLayout_2->layout()->setSpacing(spacing);
|
ui->horizontalLayout_2->layout()->setSpacing(spacing);
|
||||||
ui->horizontalLayout_3->layout()->setSpacing(spacing);
|
|
||||||
ui->horizontalLayout_5->layout()->setSpacing(spacing);
|
ui->horizontalLayout_5->layout()->setSpacing(spacing);
|
||||||
ui->horizontalLayout_6->layout()->setSpacing(spacing);
|
ui->horizontalLayout_6->layout()->setSpacing(spacing);
|
||||||
ui->horizontalLayout_7->layout()->setSpacing(spacing);
|
ui->horizontalLayout_7->layout()->setSpacing(spacing);
|
||||||
@ -2616,7 +2597,6 @@ void MainWindow::hideMenus(bool checked)
|
|||||||
ui->verticalLayout->layout()->setSpacing(spacing);
|
ui->verticalLayout->layout()->setSpacing(spacing);
|
||||||
ui->verticalLayout_2->layout()->setSpacing(spacing);
|
ui->verticalLayout_2->layout()->setSpacing(spacing);
|
||||||
ui->verticalLayout_3->layout()->setSpacing(spacing);
|
ui->verticalLayout_3->layout()->setSpacing(spacing);
|
||||||
ui->verticalLayout_4->layout()->setSpacing(spacing);
|
|
||||||
ui->verticalLayout_5->layout()->setSpacing(spacing);
|
ui->verticalLayout_5->layout()->setSpacing(spacing);
|
||||||
ui->verticalLayout_7->layout()->setSpacing(spacing);
|
ui->verticalLayout_7->layout()->setSpacing(spacing);
|
||||||
ui->verticalLayout_8->layout()->setSpacing(spacing);
|
ui->verticalLayout_8->layout()->setSpacing(spacing);
|
||||||
@ -3081,6 +3061,7 @@ void MainWindow::decode() //decode()
|
|||||||
dec_data.params.ntol=20;
|
dec_data.params.ntol=20;
|
||||||
dec_data.params.naggressive=0;
|
dec_data.params.naggressive=0;
|
||||||
}
|
}
|
||||||
|
if(m_mode=="FST4W") dec_data.params.ntol=ui->sbFST4W_FTol->value ();
|
||||||
if(dec_data.params.nutc < m_nutc0) m_RxLog = 1; //Date and Time to file "ALL.TXT".
|
if(dec_data.params.nutc < m_nutc0) m_RxLog = 1; //Date and Time to file "ALL.TXT".
|
||||||
if(dec_data.params.newdat==1 and !m_diskData) m_nutc0=dec_data.params.nutc;
|
if(dec_data.params.newdat==1 and !m_diskData) m_nutc0=dec_data.params.nutc;
|
||||||
dec_data.params.ntxmode=9;
|
dec_data.params.ntxmode=9;
|
||||||
@ -3832,8 +3813,6 @@ void MainWindow::guiUpdate()
|
|||||||
if(m_ntx == 4) txMsg=ui->tx4->text();
|
if(m_ntx == 4) txMsg=ui->tx4->text();
|
||||||
if(m_ntx == 5) txMsg=ui->tx5->currentText();
|
if(m_ntx == 5) txMsg=ui->tx5->currentText();
|
||||||
if(m_ntx == 6) txMsg=ui->tx6->text();
|
if(m_ntx == 6) txMsg=ui->tx6->text();
|
||||||
if(m_ntx == 7) txMsg=ui->genMsg->text();
|
|
||||||
if(m_ntx == 8) txMsg=ui->freeTextMsg->currentText();
|
|
||||||
int msgLength=txMsg.trimmed().length();
|
int msgLength=txMsg.trimmed().length();
|
||||||
if(msgLength==0 and !m_tune) on_stopTxButton_clicked();
|
if(msgLength==0 and !m_tune) on_stopTxButton_clicked();
|
||||||
|
|
||||||
@ -3883,7 +3862,7 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
|
|
||||||
setXIT (ui->TxFreqSpinBox->value ());
|
setXIT (ui->TxFreqSpinBox->value ());
|
||||||
Q_EMIT m_config.transceiver_ptt (true); //Assert the PTT
|
m_config.transceiver_ptt (true); //Assert the PTT
|
||||||
m_tx_when_ready = true;
|
m_tx_when_ready = true;
|
||||||
}
|
}
|
||||||
// if(!m_bTxTime and !m_tune and m_mode!="FT4") m_btxok=false; //Time to stop transmitting
|
// if(!m_bTxTime and !m_tune and m_mode!="FT4") m_btxok=false; //Time to stop transmitting
|
||||||
@ -3933,8 +3912,6 @@ void MainWindow::guiUpdate()
|
|||||||
if(m_ntx == 4) ba=ui->tx4->text().toLocal8Bit();
|
if(m_ntx == 4) ba=ui->tx4->text().toLocal8Bit();
|
||||||
if(m_ntx == 5) ba=ui->tx5->currentText().toLocal8Bit();
|
if(m_ntx == 5) ba=ui->tx5->currentText().toLocal8Bit();
|
||||||
if(m_ntx == 6) ba=ui->tx6->text().toLocal8Bit();
|
if(m_ntx == 6) ba=ui->tx6->text().toLocal8Bit();
|
||||||
if(m_ntx == 7) ba=ui->genMsg->text().toLocal8Bit();
|
|
||||||
if(m_ntx == 8) ba=ui->freeTextMsg->currentText().toLocal8Bit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ba2msg(ba,message);
|
ba2msg(ba,message);
|
||||||
@ -3980,7 +3957,7 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(m_modeTx=="FT8") {
|
if(m_modeTx=="FT8") {
|
||||||
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==2) {
|
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==1) {
|
||||||
foxTxSequencer();
|
foxTxSequencer();
|
||||||
} else {
|
} else {
|
||||||
int i3=0;
|
int i3=0;
|
||||||
@ -4037,7 +4014,7 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
genfst4_(message,&ichk,msgsent,const_cast<char *> (fst4msgbits),
|
genfst4_(message,&ichk,msgsent,const_cast<char *> (fst4msgbits),
|
||||||
const_cast<int *>(itone), &iwspr, 37, 37);
|
const_cast<int *>(itone), &iwspr, 37, 37);
|
||||||
int hmod=int(pow(2.0,double(m_nSubMode)));
|
int hmod=1; //No FST4/W submodes
|
||||||
int nsps=720;
|
int nsps=720;
|
||||||
if(m_TRperiod==30) nsps=1680;
|
if(m_TRperiod==30) nsps=1680;
|
||||||
if(m_TRperiod==60) nsps=3888;
|
if(m_TRperiod==60) nsps=3888;
|
||||||
@ -4056,18 +4033,6 @@ void MainWindow::guiUpdate()
|
|||||||
&fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave);
|
&fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave);
|
||||||
|
|
||||||
QString t = QString::fromStdString(message).trimmed();
|
QString t = QString::fromStdString(message).trimmed();
|
||||||
bool both=(t=="CQ BOTH K1JT FN20" or t=="CQ BOTH K9AN EN50");
|
|
||||||
if(both) {
|
|
||||||
float wave_both[15*48000];
|
|
||||||
memcpy(wave_both,foxcom_.wave,4*15*48000); //Copy wave[] into wave_both[]
|
|
||||||
f0=f0 + 200 + 25;
|
|
||||||
hmod=2;
|
|
||||||
gen_fst4wave_(const_cast<int *>(itone),&nsym,&nsps,&nwave,
|
|
||||||
&fsample,&hmod,&f0,&icmplx,foxcom_.wave,foxcom_.wave);
|
|
||||||
for(int i=0; i<15*48000; i++) {
|
|
||||||
foxcom_.wave[i]=0.5*(wave_both[i] + foxcom_.wave[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(SpecOp::EU_VHF==m_config.special_op_id()) {
|
if(SpecOp::EU_VHF==m_config.special_op_id()) {
|
||||||
@ -4183,17 +4148,8 @@ void MainWindow::guiUpdate()
|
|||||||
m_restart=false;
|
m_restart=false;
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
} else {
|
} else {
|
||||||
if (!m_auto && m_sentFirst73)
|
if (!m_auto && m_sentFirst73) {
|
||||||
{
|
|
||||||
m_sentFirst73 = false;
|
m_sentFirst73 = false;
|
||||||
if (1 == ui->tabWidget->currentIndex())
|
|
||||||
{
|
|
||||||
ui->genMsg->setText(ui->tx6->text());
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = CALLING;
|
|
||||||
m_gen_message_is_cq = true;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (g_iptt == 1 && m_iptt0 == 0) {
|
if (g_iptt == 1 && m_iptt0 == 0) {
|
||||||
@ -4258,9 +4214,10 @@ void MainWindow::guiUpdate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Once per second:
|
//Once per second (onesec)
|
||||||
if(nsec != m_sec0) {
|
if(nsec != m_sec0) {
|
||||||
// qDebug() << "AAA" << nsec;
|
// qDebug() << "AAA" << nsec;
|
||||||
|
if(m_mode=="FST4") sbFtolMaxVal();
|
||||||
m_currentBand=m_config.bands()->find(m_freqNominal);
|
m_currentBand=m_config.bands()->find(m_freqNominal);
|
||||||
if( SpecOp::HOUND == m_config.special_op_id() ) {
|
if( SpecOp::HOUND == m_config.special_op_id() ) {
|
||||||
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
|
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
|
||||||
@ -4293,7 +4250,7 @@ void MainWindow::guiUpdate()
|
|||||||
|
|
||||||
if(m_transmitting) {
|
if(m_transmitting) {
|
||||||
char s[42];
|
char s[42];
|
||||||
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==2) {
|
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==1) {
|
||||||
sprintf(s,"Tx: %d Slots",foxcom_.nslots);
|
sprintf(s,"Tx: %d Slots",foxcom_.nslots);
|
||||||
} else {
|
} else {
|
||||||
sprintf(s,"Tx: %s",msgsent);
|
sprintf(s,"Tx: %s",msgsent);
|
||||||
@ -4315,7 +4272,7 @@ void MainWindow::guiUpdate()
|
|||||||
} else {
|
} else {
|
||||||
s[40]=0;
|
s[40]=0;
|
||||||
QString t{QString::fromLatin1(s)};
|
QString t{QString::fromLatin1(s)};
|
||||||
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==2 and foxcom_.nslots==1) {
|
if(SpecOp::FOX==m_config.special_op_id() and ui->tabWidget->currentIndex()==1 and foxcom_.nslots==1) {
|
||||||
t=m_fm1.trimmed();
|
t=m_fm1.trimmed();
|
||||||
}
|
}
|
||||||
if(m_mode=="FT4") t="Tx: "+ m_currentMessage;
|
if(m_mode=="FT4") t="Tx: "+ m_currentMessage;
|
||||||
@ -4417,7 +4374,7 @@ void MainWindow::stopTx()
|
|||||||
|
|
||||||
void MainWindow::stopTx2()
|
void MainWindow::stopTx2()
|
||||||
{
|
{
|
||||||
Q_EMIT m_config.transceiver_ptt (false); //Lower PTT
|
m_config.transceiver_ptt (false); //Lower PTT
|
||||||
if (m_mode == "JT9" && m_bFast9
|
if (m_mode == "JT9" && m_bFast9
|
||||||
&& ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked()
|
&& ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked()
|
||||||
&& m_ntx == 5 && m_nTx73 >= 5) {
|
&& m_ntx == 5 && m_nTx73 >= 5) {
|
||||||
@ -4802,7 +4759,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
ui->TxFreqSpinBox->setValue(frequency);
|
ui->TxFreqSpinBox->setValue(frequency);
|
||||||
}
|
}
|
||||||
if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
|
if(m_mode != "JT4" && m_mode != "JT65" && !m_mode.startsWith ("JT9") &&
|
||||||
m_mode != "QRA64" && m_mode!="FT8" && m_mode!="FT4") {
|
m_mode != "QRA64" && m_mode!="FT8" && m_mode!="FT4" && m_mode!="FST4") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4815,7 +4772,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
// Determine appropriate response to received message
|
// Determine appropriate response to received message
|
||||||
auto dtext = " " + message.string () + " ";
|
auto dtext = " " + message.string () + " ";
|
||||||
dtext=dtext.remove("<").remove(">");
|
dtext=dtext.remove("<").remove(">");
|
||||||
int gen_msg {0};
|
|
||||||
if(dtext.contains (" " + m_baseCall + " ")
|
if(dtext.contains (" " + m_baseCall + " ")
|
||||||
|| dtext.contains ("<" + m_baseCall + "> ")
|
|| dtext.contains ("<" + m_baseCall + "> ")
|
||||||
//###??? || dtext.contains ("<" + m_baseCall + " " + hiscall + "> ")
|
//###??? || dtext.contains ("<" + m_baseCall + " " + hiscall + "> ")
|
||||||
@ -4874,57 +4830,52 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
|
or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
|
||||||
if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
|
if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
|
||||||
if(SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()){
|
if(SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()){
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
} else {
|
} else {
|
||||||
if(m_mode=="JT65" and message_words.size()>4 and message_words.at(4)=="OOO") {
|
if(m_mode=="JT65" and message_words.size()>4 and message_words.at(4)=="OOO") {
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
} else {
|
} else {
|
||||||
gen_msg=setTxMsg(2);
|
setTxMsg(2);
|
||||||
m_QSOProgress=REPORT;
|
m_QSOProgress=REPORT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(w34.contains(grid_regexp) and SpecOp::EU_VHF==m_config.special_op_id()) {
|
} else if(w34.contains(grid_regexp) and SpecOp::EU_VHF==m_config.special_op_id()) {
|
||||||
|
|
||||||
if(nrpt==0) {
|
if(nrpt==0) {
|
||||||
gen_msg=setTxMsg(2);
|
setTxMsg(2);
|
||||||
m_QSOProgress=REPORT;
|
m_QSOProgress=REPORT;
|
||||||
} else {
|
} else {
|
||||||
if(w2=="R") {
|
if(w2=="R") {
|
||||||
gen_msg=setTxMsg(4);
|
setTxMsg(4);
|
||||||
m_QSOProgress=ROGERS;
|
m_QSOProgress=ROGERS;
|
||||||
} else {
|
} else {
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(SpecOp::RTTY == m_config.special_op_id() and bRTTY) {
|
} else if(SpecOp::RTTY == m_config.special_op_id() and bRTTY) {
|
||||||
if(w2=="R") {
|
if(w2=="R") {
|
||||||
gen_msg=setTxMsg(4);
|
setTxMsg(4);
|
||||||
m_QSOProgress=ROGERS;
|
m_QSOProgress=ROGERS;
|
||||||
} else {
|
} else {
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
}
|
}
|
||||||
m_xRcvd=t[n-2] + " " + t[n-1];
|
m_xRcvd=t[n-2] + " " + t[n-1];
|
||||||
} else if(SpecOp::FIELD_DAY==m_config.special_op_id() and bFieldDay_msg) {
|
} else if(SpecOp::FIELD_DAY==m_config.special_op_id() and bFieldDay_msg) {
|
||||||
if(t0=="R") {
|
if(t0=="R") {
|
||||||
gen_msg=setTxMsg(4);
|
setTxMsg(4);
|
||||||
m_QSOProgress=ROGERS;
|
m_QSOProgress=ROGERS;
|
||||||
} else {
|
} else {
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
}
|
}
|
||||||
} else { // no grid on end of msg
|
} else { // no grid on end of msg
|
||||||
QString r=message_words.at (3);
|
QString r=message_words.at (3);
|
||||||
if(m_QSOProgress >= ROGER_REPORT && (r=="RRR" || r.toInt()==73 || "RR73" == r)) {
|
if(m_QSOProgress >= ROGER_REPORT && (r=="RRR" || r.toInt()==73 || "RR73" == r)) {
|
||||||
if(m_mode=="FT4" and r=="RR73") m_dateTimeRcvdRR73=QDateTime::currentDateTimeUtc();
|
if(m_mode=="FT4" and r=="RR73") m_dateTimeRcvdRR73=QDateTime::currentDateTimeUtc();
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
|
||||||
gen_msg = 5;
|
|
||||||
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
} else {
|
|
||||||
m_bTUmsg=false;
|
m_bTUmsg=false;
|
||||||
m_nextCall=""; //### Temporary: disable use of "TU;" message
|
m_nextCall=""; //### Temporary: disable use of "TU;" message
|
||||||
if(SpecOp::RTTY == m_config.special_op_id() and m_nextCall!="") {
|
if(SpecOp::RTTY == m_config.special_op_id() and m_nextCall!="") {
|
||||||
@ -4945,7 +4896,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
ui->txrb5->setChecked(true);
|
ui->txrb5->setChecked(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
m_QSOProgress = SIGNOFF;
|
m_QSOProgress = SIGNOFF;
|
||||||
} else if((m_QSOProgress >= REPORT
|
} else if((m_QSOProgress >= REPORT
|
||||||
|| (m_QSOProgress >= REPLYING &&
|
|| (m_QSOProgress >= REPLYING &&
|
||||||
@ -4959,24 +4909,19 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
if(nRpt>=529 and nRpt<=599) m_xRcvd=t[n-2] + " " + t[n-1];
|
if(nRpt>=529 and nRpt<=599) m_xRcvd=t[n-2] + " " + t[n-1];
|
||||||
}
|
}
|
||||||
ui->txrb4->setChecked(true);
|
ui->txrb4->setChecked(true);
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
|
||||||
gen_msg = 4;
|
|
||||||
m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
} else if(m_QSOProgress>=CALLING and
|
} else if(m_QSOProgress>=CALLING and
|
||||||
((r.toInt()>=-50 && r.toInt()<=49) or (r.toInt()>=529 && r.toInt()<=599))) {
|
((r.toInt()>=-50 && r.toInt()<=49) or (r.toInt()>=529 && r.toInt()<=599))) {
|
||||||
if(SpecOp::EU_VHF==m_config.special_op_id() or
|
if(SpecOp::EU_VHF==m_config.special_op_id() or
|
||||||
SpecOp::FIELD_DAY==m_config.special_op_id() or
|
SpecOp::FIELD_DAY==m_config.special_op_id() or
|
||||||
SpecOp::RTTY==m_config.special_op_id()) {
|
SpecOp::RTTY==m_config.special_op_id()) {
|
||||||
gen_msg=setTxMsg(2);
|
setTxMsg(2);
|
||||||
m_QSOProgress=REPORT;
|
m_QSOProgress=REPORT;
|
||||||
} else {
|
} else {
|
||||||
if(r.left(2)=="R-" or r.left(2)=="R+") {
|
if(r.left(2)=="R-" or r.left(2)=="R+") {
|
||||||
gen_msg=setTxMsg(4);
|
setTxMsg(4);
|
||||||
m_QSOProgress=ROGERS;
|
m_QSOProgress=ROGERS;
|
||||||
} else {
|
} else {
|
||||||
gen_msg=setTxMsg(3);
|
setTxMsg(3);
|
||||||
m_QSOProgress=ROGER_REPORT;
|
m_QSOProgress=ROGER_REPORT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4989,15 +4934,8 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
&& message_words.size () > 2 && message_words.at (1).contains (m_baseCall)
|
&& message_words.size () > 2 && message_words.at (1).contains (m_baseCall)
|
||||||
&& message_words.at (2) == "73") {
|
&& message_words.at (2) == "73") {
|
||||||
// 73 back to compound call holder
|
// 73 back to compound call holder
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
m_ntx=5;
|
||||||
gen_msg = 5;
|
ui->txrb5->setChecked(true);
|
||||||
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ntx=5;
|
|
||||||
ui->txrb5->setChecked(true);
|
|
||||||
}
|
|
||||||
m_QSOProgress = SIGNOFF;
|
m_QSOProgress = SIGNOFF;
|
||||||
}
|
}
|
||||||
else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) {
|
else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) {
|
||||||
@ -5007,21 +4945,10 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
m_ntx=3;
|
m_ntx=3;
|
||||||
m_QSOProgress = ROGER_REPORT;
|
m_QSOProgress = ROGER_REPORT;
|
||||||
ui->txrb3->setChecked (true);
|
ui->txrb3->setChecked (true);
|
||||||
if (ui->tabWidget->currentIndex () == 1) {
|
|
||||||
gen_msg = 3;
|
|
||||||
m_ntx = 7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
} else if (!is_73) { // don't respond to sign off messages
|
} else if (!is_73) { // don't respond to sign off messages
|
||||||
m_ntx=2;
|
m_ntx=2;
|
||||||
m_QSOProgress = REPORT;
|
m_QSOProgress = REPORT;
|
||||||
ui->txrb2->setChecked(true);
|
ui->txrb2->setChecked(true);
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
|
||||||
gen_msg = 2;
|
|
||||||
m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_bDoubleClickAfterCQnnn and m_transmitting) {
|
if (m_bDoubleClickAfterCQnnn and m_transmitting) {
|
||||||
on_stopTxButton_clicked();
|
on_stopTxButton_clicked();
|
||||||
TxAgainTimer.start(1500);
|
TxAgainTimer.start(1500);
|
||||||
@ -5050,14 +4977,8 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
else if (firstcall == "DE" && message_words.size () > 3 && message_words.at (3) == "73") {
|
else if (firstcall == "DE" && message_words.size () > 3 && message_words.at (3) == "73") {
|
||||||
if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
|
if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
|
||||||
// 73 back to compound call holder
|
// 73 back to compound call holder
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
m_ntx=5;
|
||||||
gen_msg = 5;
|
ui->txrb5->setChecked(true);
|
||||||
m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
} else {
|
|
||||||
m_ntx=5;
|
|
||||||
ui->txrb5->setChecked(true);
|
|
||||||
}
|
|
||||||
m_QSOProgress = SIGNOFF;
|
m_QSOProgress = SIGNOFF;
|
||||||
} else {
|
} else {
|
||||||
// treat like a CQ/QRZ
|
// treat like a CQ/QRZ
|
||||||
@ -5070,22 +4991,11 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
m_QSOProgress = REPORT;
|
m_QSOProgress = REPORT;
|
||||||
ui->txrb2->setChecked (true);
|
ui->txrb2->setChecked (true);
|
||||||
}
|
}
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
|
||||||
gen_msg = 1;
|
|
||||||
m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (is_73 && !message.isStandardMessage ()) {
|
else if (is_73 && !message.isStandardMessage ()) {
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
m_ntx=5;
|
||||||
gen_msg = 5;
|
ui->txrb5->setChecked(true);
|
||||||
if (ui->rbGenMsg->isChecked ()) m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
} else {
|
|
||||||
m_ntx=5;
|
|
||||||
ui->txrb5->setChecked(true);
|
|
||||||
}
|
|
||||||
m_QSOProgress = SIGNOFF;
|
m_QSOProgress = SIGNOFF;
|
||||||
} else {
|
} else {
|
||||||
// just work them
|
// just work them
|
||||||
@ -5098,11 +5008,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
m_QSOProgress = REPORT;
|
m_QSOProgress = REPORT;
|
||||||
ui->txrb2->setChecked (true);
|
ui->txrb2->setChecked (true);
|
||||||
}
|
}
|
||||||
if (1 == ui->tabWidget->currentIndex ()) {
|
|
||||||
gen_msg = m_ntx;
|
|
||||||
m_ntx=7;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// if we get here then we are reacting to the message
|
// if we get here then we are reacting to the message
|
||||||
if (m_bAutoReply) m_bCallingCQ = CALLING == m_QSOProgress;
|
if (m_bAutoReply) m_bCallingCQ = CALLING == m_QSOProgress;
|
||||||
@ -5156,18 +5061,6 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
m_bTUmsg=false; //### Temporary: disable use of "TU;" messages
|
m_bTUmsg=false; //### Temporary: disable use of "TU;" messages
|
||||||
if (!m_nTx73 and !m_bTUmsg) {
|
if (!m_nTx73 and !m_bTUmsg) {
|
||||||
genStdMsgs(rpt);
|
genStdMsgs(rpt);
|
||||||
if (gen_msg) {
|
|
||||||
switch (gen_msg) {
|
|
||||||
case 1: ui->genMsg->setText (ui->tx1->text ()); break;
|
|
||||||
case 2: ui->genMsg->setText (ui->tx2->text ()); break;
|
|
||||||
case 3: ui->genMsg->setText (ui->tx3->text ()); break;
|
|
||||||
case 4: ui->genMsg->setText (ui->tx4->text ()); break;
|
|
||||||
case 5: ui->genMsg->setText (ui->tx5->currentText ()); break;
|
|
||||||
}
|
|
||||||
if (gen_msg != 5) { // allow user to pre-select a free message
|
|
||||||
ui->rbGenMsg->setChecked (true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(m_transmitting) m_restart=true;
|
if(m_transmitting) m_restart=true;
|
||||||
if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked ()
|
if (ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isChecked ()
|
||||||
@ -5178,7 +5071,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
|
|||||||
m_bDoubleClicked=false;
|
m_bDoubleClicked=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MainWindow::setTxMsg(int n)
|
void MainWindow::setTxMsg(int n)
|
||||||
{
|
{
|
||||||
m_ntx=n;
|
m_ntx=n;
|
||||||
if(n==1) ui->txrb1->setChecked(true);
|
if(n==1) ui->txrb1->setChecked(true);
|
||||||
@ -5187,11 +5080,6 @@ int MainWindow::setTxMsg(int n)
|
|||||||
if(n==4) ui->txrb4->setChecked(true);
|
if(n==4) ui->txrb4->setChecked(true);
|
||||||
if(n==5) ui->txrb5->setChecked(true);
|
if(n==5) ui->txrb5->setChecked(true);
|
||||||
if(n==6) ui->txrb6->setChecked(true);
|
if(n==6) ui->txrb6->setChecked(true);
|
||||||
if(ui->tabWidget->currentIndex()==1) {
|
|
||||||
m_ntx=7; //### FIX THIS ###
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::genCQMsg ()
|
void MainWindow::genCQMsg ()
|
||||||
@ -5283,7 +5171,6 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
|
|||||||
ui->tx3->clear ();
|
ui->tx3->clear ();
|
||||||
ui->tx4->clear ();
|
ui->tx4->clear ();
|
||||||
if(unconditional) ui->tx5->lineEdit ()->clear (); //Test if it needs sending again
|
if(unconditional) ui->tx5->lineEdit ()->clear (); //Test if it needs sending again
|
||||||
ui->genMsg->clear ();
|
|
||||||
m_gen_message_is_cq = false;
|
m_gen_message_is_cq = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -5525,19 +5412,12 @@ void MainWindow::clearDX ()
|
|||||||
m_qsoStop.clear ();
|
m_qsoStop.clear ();
|
||||||
m_inQSOwith.clear();
|
m_inQSOwith.clear();
|
||||||
genStdMsgs (QString {});
|
genStdMsgs (QString {});
|
||||||
if (ui->tabWidget->currentIndex() == 1) {
|
if (m_mode=="FT8" and SpecOp::HOUND == m_config.special_op_id()) {
|
||||||
ui->genMsg->setText(ui->tx6->text());
|
m_ntx=1;
|
||||||
m_ntx=7;
|
ui->txrb1->setChecked(true);
|
||||||
m_gen_message_is_cq = true;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
} else {
|
} else {
|
||||||
if (m_mode=="FT8" and SpecOp::HOUND == m_config.special_op_id()) {
|
m_ntx=6;
|
||||||
m_ntx=1;
|
ui->txrb6->setChecked(true);
|
||||||
ui->txrb1->setChecked(true);
|
|
||||||
} else {
|
|
||||||
m_ntx=6;
|
|
||||||
ui->txrb6->setChecked(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
m_QSOProgress = CALLING;
|
m_QSOProgress = CALLING;
|
||||||
}
|
}
|
||||||
@ -6002,23 +5882,21 @@ void MainWindow::displayWidgets(qint64 n)
|
|||||||
|
|
||||||
void MainWindow::on_actionFST4_triggered()
|
void MainWindow::on_actionFST4_triggered()
|
||||||
{
|
{
|
||||||
int nsub=m_nSubMode;
|
|
||||||
on_actionJT65_triggered();
|
|
||||||
ui->label_6->setText(tr ("Band Activity"));
|
|
||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
|
||||||
ui->sbSubmode->setMaximum(3);
|
|
||||||
m_nSubMode=nsub;
|
|
||||||
ui->sbSubmode->setValue(m_nSubMode);
|
|
||||||
m_mode="FST4";
|
m_mode="FST4";
|
||||||
m_modeTx="FST4";
|
m_modeTx="FST4";
|
||||||
ui->actionFST4->setChecked(true);
|
ui->actionFST4->setChecked(true);
|
||||||
|
m_nsps=6912; //For symspec only
|
||||||
|
m_FFTSize = m_nsps / 2;
|
||||||
|
Q_EMIT FFTSize(m_FFTSize);
|
||||||
|
ui->label_6->setText(tr ("Band Activity"));
|
||||||
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
WSPR_config(false);
|
WSPR_config(false);
|
||||||
bool bVHF=m_config.enable_VHF_features();
|
|
||||||
// 0123456789012345678901234567890123
|
// 0123456789012345678901234567890123
|
||||||
displayWidgets(nWidgets("1111110001001111000100000001000000"));
|
displayWidgets(nWidgets("1111110001001110000100000001000000"));
|
||||||
setup_status_bar (bVHF);
|
setup_status_bar(false);
|
||||||
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
|
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
|
||||||
on_sbTR_valueChanged (ui->sbTR->value());
|
on_sbTR_valueChanged (ui->sbTR->value());
|
||||||
|
sbFtolMaxVal();
|
||||||
ui->cbAutoSeq->setChecked(true);
|
ui->cbAutoSeq->setChecked(true);
|
||||||
m_wideGraph->setMode(m_mode);
|
m_wideGraph->setMode(m_mode);
|
||||||
m_wideGraph->setModeTx(m_modeTx);
|
m_wideGraph->setModeTx(m_modeTx);
|
||||||
@ -6031,25 +5909,25 @@ void MainWindow::on_actionFST4_triggered()
|
|||||||
|
|
||||||
void MainWindow::on_actionFST4W_triggered()
|
void MainWindow::on_actionFST4W_triggered()
|
||||||
{
|
{
|
||||||
on_actionFST4_triggered();
|
|
||||||
m_mode="FST4W";
|
m_mode="FST4W";
|
||||||
m_modeTx="FST4W";
|
m_modeTx="FST4W";
|
||||||
WSPR_config(true);
|
|
||||||
ui->actionFST4W->setChecked(true);
|
ui->actionFST4W->setChecked(true);
|
||||||
|
m_nsps=6912; //For symspec only
|
||||||
|
m_FFTSize = m_nsps / 2;
|
||||||
|
Q_EMIT FFTSize(m_FFTSize);
|
||||||
|
WSPR_config(true);
|
||||||
// 0123456789012345678901234567890123
|
// 0123456789012345678901234567890123
|
||||||
displayWidgets(nWidgets("0000000000000000010100000000000001"));
|
displayWidgets(nWidgets("0000000000000000010100000000000001"));
|
||||||
bool bVHF=m_config.enable_VHF_features();
|
setup_status_bar(false);
|
||||||
setup_status_bar (bVHF);
|
|
||||||
m_nSubMode=0;
|
|
||||||
ui->sbSubmode->setValue(m_nSubMode);
|
|
||||||
ui->band_hopping_group_box->setChecked(false);
|
ui->band_hopping_group_box->setChecked(false);
|
||||||
ui->band_hopping_group_box->setVisible(false);
|
ui->band_hopping_group_box->setVisible(false);
|
||||||
on_sbTR_FST4W_valueChanged (ui->sbTR_FST4W->value ());
|
on_sbTR_FST4W_valueChanged (ui->sbTR_FST4W->value ());
|
||||||
ui->sbSubmode->setMaximum(3);
|
|
||||||
m_wideGraph->setMode(m_mode);
|
m_wideGraph->setMode(m_mode);
|
||||||
m_wideGraph->setModeTx(m_modeTx);
|
m_wideGraph->setModeTx(m_modeTx);
|
||||||
m_wideGraph->setPeriod(m_TRperiod,6912);
|
m_wideGraph->setPeriod(m_TRperiod,6912);
|
||||||
m_wideGraph->setTxFreq(ui->WSPRfreqSpinBox->value());
|
m_wideGraph->setTxFreq(ui->WSPRfreqSpinBox->value());
|
||||||
|
m_wideGraph->setRxFreq(ui->sbFST4W_RxFreq->value());
|
||||||
|
m_wideGraph->setTol(ui->sbFST4W_FTol->value());
|
||||||
ui->sbFtol->setValue(100);
|
ui->sbFtol->setValue(100);
|
||||||
ui->RxFreqSpinBox->setValue(1500);
|
ui->RxFreqSpinBox->setValue(1500);
|
||||||
switch_mode (Modes::FST4W);
|
switch_mode (Modes::FST4W);
|
||||||
@ -6151,7 +6029,7 @@ void MainWindow::on_actionFT8_triggered()
|
|||||||
ui->txFirstCheckBox->setEnabled(false);
|
ui->txFirstCheckBox->setEnabled(false);
|
||||||
ui->cbHoldTxFreq->setChecked(true);
|
ui->cbHoldTxFreq->setChecked(true);
|
||||||
ui->cbAutoSeq->setEnabled(false);
|
ui->cbAutoSeq->setEnabled(false);
|
||||||
ui->tabWidget->setCurrentIndex(2);
|
ui->tabWidget->setCurrentIndex(1);
|
||||||
ui->TxFreqSpinBox->setValue(300);
|
ui->TxFreqSpinBox->setValue(300);
|
||||||
displayWidgets(nWidgets("1110100001001110000100000000001000"));
|
displayWidgets(nWidgets("1110100001001110000100000000001000"));
|
||||||
ui->labDXped->setText(tr ("Fox"));
|
ui->labDXped->setText(tr ("Fox"));
|
||||||
@ -6625,14 +6503,15 @@ void MainWindow::switch_mode (Mode mode)
|
|||||||
m_fastGraph->setMode(m_mode);
|
m_fastGraph->setMode(m_mode);
|
||||||
m_config.frequencies ()->filter (m_config.region (), mode);
|
m_config.frequencies ()->filter (m_config.region (), mode);
|
||||||
auto const& row = m_config.frequencies ()->best_working_frequency (m_freqNominal);
|
auto const& row = m_config.frequencies ()->best_working_frequency (m_freqNominal);
|
||||||
|
ui->bandComboBox->setCurrentIndex (row);
|
||||||
if (row >= 0) {
|
if (row >= 0) {
|
||||||
ui->bandComboBox->setCurrentIndex (row);
|
|
||||||
on_bandComboBox_activated (row);
|
on_bandComboBox_activated (row);
|
||||||
}
|
}
|
||||||
ui->rptSpinBox->setSingleStep(1);
|
ui->rptSpinBox->setSingleStep(1);
|
||||||
ui->rptSpinBox->setMinimum(-50);
|
ui->rptSpinBox->setMinimum(-50);
|
||||||
ui->rptSpinBox->setMaximum(49);
|
ui->rptSpinBox->setMaximum(49);
|
||||||
ui->sbFtol->values ({10, 20, 50, 100, 200, 500, 1000});
|
ui->sbFtol->values ({1, 2, 5, 10, 20, 50, 100, 200, 300, 400, 500, 1000});
|
||||||
|
ui->sbFST4W_FTol->values({1, 2, 5, 10, 20, 50, 100});
|
||||||
if(m_mode=="MSK144") {
|
if(m_mode=="MSK144") {
|
||||||
ui->RxFreqSpinBox->setMinimum(1400);
|
ui->RxFreqSpinBox->setMinimum(1400);
|
||||||
ui->RxFreqSpinBox->setMaximum(1600);
|
ui->RxFreqSpinBox->setMaximum(1600);
|
||||||
@ -6665,9 +6544,12 @@ void MainWindow::WSPR_config(bool b)
|
|||||||
ui->label_7->setVisible(!b and ui->cbMenus->isChecked());
|
ui->label_7->setVisible(!b and ui->cbMenus->isChecked());
|
||||||
ui->logQSOButton->setVisible(!b);
|
ui->logQSOButton->setVisible(!b);
|
||||||
ui->DecodeButton->setEnabled(!b);
|
ui->DecodeButton->setEnabled(!b);
|
||||||
ui->sbTxPercent->setEnabled (m_mode != "FST4W" || tr ("Random") == ui->RoundRobin->currentText ());
|
bool bFST4W=(m_mode=="FST4W");
|
||||||
|
ui->sbTxPercent->setEnabled(!bFST4W or (tr("Random") == ui->RoundRobin->currentText()));
|
||||||
ui->band_hopping_group_box->setVisible(true);
|
ui->band_hopping_group_box->setVisible(true);
|
||||||
ui->RoundRobin->setVisible(m_mode=="FST4W");
|
ui->RoundRobin->setVisible(bFST4W);
|
||||||
|
ui->sbFST4W_RxFreq->setVisible(bFST4W);
|
||||||
|
ui->sbFST4W_FTol->setVisible(bFST4W);
|
||||||
ui->RoundRobin->lineEdit()->setAlignment(Qt::AlignCenter);
|
ui->RoundRobin->lineEdit()->setAlignment(Qt::AlignCenter);
|
||||||
if(b and m_mode!="Echo" and m_mode!="FST4W") {
|
if(b and m_mode!="Echo" and m_mode!="FST4W") {
|
||||||
QString t="UTC dB DT Freq Drift Call Grid dBm ";
|
QString t="UTC dB DT Freq Drift Call Grid dBm ";
|
||||||
@ -6675,7 +6557,7 @@ void MainWindow::WSPR_config(bool b)
|
|||||||
if(!m_config.miles()) t += " km";
|
if(!m_config.miles()) t += " km";
|
||||||
ui->decodedTextLabel->setText(t);
|
ui->decodedTextLabel->setText(t);
|
||||||
if (m_config.is_transceiver_online ()) {
|
if (m_config.is_transceiver_online ()) {
|
||||||
Q_EMIT m_config.transceiver_tx_frequency (0); // turn off split
|
m_config.transceiver_tx_frequency (0); // turn off split
|
||||||
}
|
}
|
||||||
m_bSimplex = true;
|
m_bSimplex = true;
|
||||||
} else
|
} else
|
||||||
@ -6821,17 +6703,20 @@ void MainWindow::on_bandComboBox_currentIndexChanged (int index)
|
|||||||
|
|
||||||
// Lookup band
|
// Lookup band
|
||||||
auto const& band = m_config.bands ()->find (frequency);
|
auto const& band = m_config.bands ()->find (frequency);
|
||||||
if (!band.isEmpty ())
|
ui->bandComboBox->setCurrentText (band.size () ? band : m_config.bands ()->oob ());
|
||||||
|
displayDialFrequency ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_bandComboBox_editTextChanged (QString const& text)
|
||||||
|
{
|
||||||
|
if (text.size () && m_config.bands ()->oob () != text)
|
||||||
{
|
{
|
||||||
ui->bandComboBox->lineEdit ()->setStyleSheet ({});
|
ui->bandComboBox->lineEdit ()->setStyleSheet ({});
|
||||||
ui->bandComboBox->setCurrentText (band);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->bandComboBox->lineEdit ()->setStyleSheet ("QLineEdit {color: yellow; background-color : red;}");
|
ui->bandComboBox->lineEdit ()->setStyleSheet ("QLineEdit {color: yellow; background-color : red;}");
|
||||||
ui->bandComboBox->setCurrentText (m_config.bands ()->oob ());
|
|
||||||
}
|
}
|
||||||
displayDialFrequency ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_bandComboBox_activated (int index)
|
void MainWindow::on_bandComboBox_activated (int index)
|
||||||
@ -6903,111 +6788,6 @@ void MainWindow::enable_DXCC_entity (bool on)
|
|||||||
updateGeometry ();
|
updateGeometry ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_pbCallCQ_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
ui->genMsg->setText(ui->tx6->text());
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = CALLING;
|
|
||||||
m_gen_message_is_cq = true;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
set_dateTimeQSO(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_pbAnswerCaller_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
QString t=ui->tx3->text();
|
|
||||||
int i0=t.indexOf(" R-");
|
|
||||||
if(i0<0) i0=t.indexOf(" R+");
|
|
||||||
t=t.mid(0,i0+1)+t.mid(i0+2,3);
|
|
||||||
ui->genMsg->setText(t);
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = REPORT;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
set_dateTimeQSO(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_pbSendRRR_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
ui->genMsg->setText(ui->tx4->text());
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = ROGERS;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_pbAnswerCQ_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
ui->genMsg->setText(ui->tx1->text());
|
|
||||||
QString t=ui->tx2->text();
|
|
||||||
int i0=t.indexOf("/");
|
|
||||||
int i1=t.indexOf(" ");
|
|
||||||
if(i0>0 and i0<i1) ui->genMsg->setText(t);
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = REPLYING;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_pbSendReport_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
ui->genMsg->setText(ui->tx3->text());
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = ROGER_REPORT;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
set_dateTimeQSO(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_pbSend73_clicked()
|
|
||||||
{
|
|
||||||
genStdMsgs(m_rpt);
|
|
||||||
ui->genMsg->setText(ui->tx5->currentText());
|
|
||||||
m_ntx=7;
|
|
||||||
m_QSOProgress = SIGNOFF;
|
|
||||||
m_gen_message_is_cq = false;
|
|
||||||
ui->rbGenMsg->setChecked(true);
|
|
||||||
if(m_transmitting) m_restart=true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_rbGenMsg_clicked(bool checked)
|
|
||||||
{
|
|
||||||
m_freeText=!checked;
|
|
||||||
if(!m_freeText) {
|
|
||||||
if(m_ntx != 7 && m_transmitting) m_restart=true;
|
|
||||||
m_ntx=7;
|
|
||||||
// would like to set m_QSOProgress but what to? So leave alone and
|
|
||||||
// assume it is correct
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_rbFreeText_clicked(bool checked)
|
|
||||||
{
|
|
||||||
m_freeText=checked;
|
|
||||||
if(m_freeText) {
|
|
||||||
m_ntx=8;
|
|
||||||
// would like to set m_QSOProgress but what to? So leave alone and
|
|
||||||
// assume it is correct. Perhaps should store old value to be
|
|
||||||
// restored above in on_rbGenMsg_clicked
|
|
||||||
if (m_transmitting) m_restart=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_freeTextMsg_currentTextChanged (QString const& text)
|
|
||||||
{
|
|
||||||
msgtype(text, ui->freeTextMsg->lineEdit ());
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::on_rptSpinBox_valueChanged(int n)
|
void MainWindow::on_rptSpinBox_valueChanged(int n)
|
||||||
{
|
{
|
||||||
int step=ui->rptSpinBox->singleStep();
|
int step=ui->rptSpinBox->singleStep();
|
||||||
@ -7094,7 +6874,7 @@ void MainWindow::rigOpen ()
|
|||||||
ui->readFreq->setText ("");
|
ui->readFreq->setText ("");
|
||||||
ui->readFreq->setEnabled (true);
|
ui->readFreq->setEnabled (true);
|
||||||
m_config.transceiver_online ();
|
m_config.transceiver_online ();
|
||||||
Q_EMIT m_config.sync_transceiver (true, true);
|
m_config.sync_transceiver (true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_pbR2T_clicked()
|
void MainWindow::on_pbR2T_clicked()
|
||||||
@ -7117,7 +6897,7 @@ void MainWindow::on_readFreq_clicked()
|
|||||||
|
|
||||||
if (m_config.transceiver_online ())
|
if (m_config.transceiver_online ())
|
||||||
{
|
{
|
||||||
Q_EMIT m_config.sync_transceiver (true, true);
|
m_config.sync_transceiver (true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7167,7 +6947,7 @@ void MainWindow::setXIT(int n, Frequency base)
|
|||||||
// frequency
|
// frequency
|
||||||
m_freqTxNominal = base + m_XIT;
|
m_freqTxNominal = base + m_XIT;
|
||||||
if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal);
|
if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal);
|
||||||
Q_EMIT m_config.transceiver_tx_frequency (m_freqTxNominal + m_astroCorrection.tx);
|
m_config.transceiver_tx_frequency (m_freqTxNominal + m_astroCorrection.tx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//Now set the audio Tx freq
|
//Now set the audio Tx freq
|
||||||
@ -7363,7 +7143,7 @@ void MainWindow::transmit (double snr)
|
|||||||
if(m_TRperiod==300) nsps=21504;
|
if(m_TRperiod==300) nsps=21504;
|
||||||
if(m_TRperiod==900) nsps=66560;
|
if(m_TRperiod==900) nsps=66560;
|
||||||
if(m_TRperiod==1800) nsps=134400;
|
if(m_TRperiod==1800) nsps=134400;
|
||||||
int hmod=int(pow(2.0,double(m_nSubMode)));
|
int hmod=1; //No FST4/W submodes
|
||||||
double dfreq=hmod*12000.0/nsps;
|
double dfreq=hmod*12000.0/nsps;
|
||||||
double f0=ui->WSPRfreqSpinBox->value() - m_XIT;
|
double f0=ui->WSPRfreqSpinBox->value() - m_XIT;
|
||||||
if(!m_tune) f0 += + 1.5*dfreq;
|
if(!m_tune) f0 += + 1.5*dfreq;
|
||||||
@ -7666,6 +7446,7 @@ void MainWindow::on_sbTR_valueChanged(int value)
|
|||||||
m_wideGraph->setPeriod (value, m_nsps);
|
m_wideGraph->setPeriod (value, m_nsps);
|
||||||
progressBar.setMaximum (value);
|
progressBar.setMaximum (value);
|
||||||
}
|
}
|
||||||
|
if(m_mode=="FST4") sbFtolMaxVal();
|
||||||
if(m_monitoring) {
|
if(m_monitoring) {
|
||||||
on_stopButton_clicked();
|
on_stopButton_clicked();
|
||||||
on_monitorButton_clicked(true);
|
on_monitorButton_clicked(true);
|
||||||
@ -7676,6 +7457,14 @@ void MainWindow::on_sbTR_valueChanged(int value)
|
|||||||
statusUpdate ();
|
statusUpdate ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::sbFtolMaxVal()
|
||||||
|
{
|
||||||
|
if(m_TRperiod<=60) ui->sbFtol->setMaximum(1000);
|
||||||
|
if(m_TRperiod==120) ui->sbFtol->setMaximum(500);
|
||||||
|
if(m_TRperiod==300) ui->sbFtol->setMaximum(200);
|
||||||
|
if(m_TRperiod>=900) ui->sbFtol->setMaximum(100);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_sbTR_FST4W_valueChanged(int value)
|
void MainWindow::on_sbTR_FST4W_valueChanged(int value)
|
||||||
{
|
{
|
||||||
on_sbTR_valueChanged(value);
|
on_sbTR_valueChanged(value);
|
||||||
@ -8147,6 +7936,19 @@ void MainWindow::on_WSPRfreqSpinBox_valueChanged(int n)
|
|||||||
ui->TxFreqSpinBox->setValue(n);
|
ui->TxFreqSpinBox->setValue(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_sbFST4W_RxFreq_valueChanged(int n)
|
||||||
|
{
|
||||||
|
m_wideGraph->setRxFreq(n);
|
||||||
|
statusUpdate ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_sbFST4W_FTol_valueChanged(int n)
|
||||||
|
{
|
||||||
|
ui->sbFST4W_RxFreq->setSingleStep(n);
|
||||||
|
m_wideGraph->setTol(n);
|
||||||
|
statusUpdate ();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_pbTxNext_clicked(bool b)
|
void MainWindow::on_pbTxNext_clicked(bool b)
|
||||||
{
|
{
|
||||||
if (b && !ui->autoButton->isChecked ())
|
if (b && !ui->autoButton->isChecked ())
|
||||||
@ -8312,11 +8114,11 @@ void MainWindow::setRig (Frequency f)
|
|||||||
{
|
{
|
||||||
if (m_transmitting && m_config.split_mode ())
|
if (m_transmitting && m_config.split_mode ())
|
||||||
{
|
{
|
||||||
Q_EMIT m_config.transceiver_tx_frequency (m_freqTxNominal + m_astroCorrection.tx);
|
m_config.transceiver_tx_frequency (m_freqTxNominal + m_astroCorrection.tx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Q_EMIT m_config.transceiver_frequency (m_freqNominal + m_astroCorrection.rx);
|
m_config.transceiver_frequency (m_freqNominal + m_astroCorrection.rx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ private slots:
|
|||||||
void on_stopButton_clicked();
|
void on_stopButton_clicked();
|
||||||
void on_actionRelease_Notes_triggered ();
|
void on_actionRelease_Notes_triggered ();
|
||||||
void on_actionFT8_DXpedition_Mode_User_Guide_triggered();
|
void on_actionFT8_DXpedition_Mode_User_Guide_triggered();
|
||||||
void on_actionQuick_Start_Guide_v2_triggered();
|
void on_actionQuick_Start_Guide_triggered();
|
||||||
void on_actionOnline_User_Guide_triggered();
|
void on_actionOnline_User_Guide_triggered();
|
||||||
void on_actionLocal_User_Guide_triggered();
|
void on_actionLocal_User_Guide_triggered();
|
||||||
void on_actionWide_Waterfall_triggered();
|
void on_actionWide_Waterfall_triggered();
|
||||||
@ -222,15 +222,6 @@ private slots:
|
|||||||
void startP1();
|
void startP1();
|
||||||
void stopTx();
|
void stopTx();
|
||||||
void stopTx2();
|
void stopTx2();
|
||||||
void on_pbCallCQ_clicked();
|
|
||||||
void on_pbAnswerCaller_clicked();
|
|
||||||
void on_pbSendRRR_clicked();
|
|
||||||
void on_pbAnswerCQ_clicked();
|
|
||||||
void on_pbSendReport_clicked();
|
|
||||||
void on_pbSend73_clicked();
|
|
||||||
void on_rbGenMsg_clicked(bool checked);
|
|
||||||
void on_rbFreeText_clicked(bool checked);
|
|
||||||
void on_freeTextMsg_currentTextChanged (QString const&);
|
|
||||||
void on_rptSpinBox_valueChanged(int n);
|
void on_rptSpinBox_valueChanged(int n);
|
||||||
void killFile();
|
void killFile();
|
||||||
void on_tuneButton_clicked (bool);
|
void on_tuneButton_clicked (bool);
|
||||||
@ -245,6 +236,7 @@ private slots:
|
|||||||
, QString const& exchange_sent, QString const& exchange_rcvd
|
, QString const& exchange_sent, QString const& exchange_rcvd
|
||||||
, QString const& propmode, QByteArray const& ADIF);
|
, QString const& propmode, QByteArray const& ADIF);
|
||||||
void on_bandComboBox_currentIndexChanged (int index);
|
void on_bandComboBox_currentIndexChanged (int index);
|
||||||
|
void on_bandComboBox_editTextChanged (QString const& text);
|
||||||
void on_bandComboBox_activated (int index);
|
void on_bandComboBox_activated (int index);
|
||||||
void on_readFreq_clicked();
|
void on_readFreq_clicked();
|
||||||
void on_pbTxMode_clicked();
|
void on_pbTxMode_clicked();
|
||||||
@ -288,6 +280,8 @@ private slots:
|
|||||||
void TxAgain();
|
void TxAgain();
|
||||||
void uploadResponse(QString response);
|
void uploadResponse(QString response);
|
||||||
void on_WSPRfreqSpinBox_valueChanged(int n);
|
void on_WSPRfreqSpinBox_valueChanged(int n);
|
||||||
|
void on_sbFST4W_RxFreq_valueChanged(int n);
|
||||||
|
void on_sbFST4W_FTol_valueChanged(int n);
|
||||||
void on_pbTxNext_clicked(bool b);
|
void on_pbTxNext_clicked(bool b);
|
||||||
void on_actionEcho_Graph_triggered();
|
void on_actionEcho_Graph_triggered();
|
||||||
void on_actionEcho_triggered();
|
void on_actionEcho_triggered();
|
||||||
@ -317,7 +311,8 @@ private slots:
|
|||||||
void checkMSK144ContestType();
|
void checkMSK144ContestType();
|
||||||
void on_pbBestSP_clicked();
|
void on_pbBestSP_clicked();
|
||||||
void on_RoundRobin_currentTextChanged(QString text);
|
void on_RoundRobin_currentTextChanged(QString text);
|
||||||
int setTxMsg(int n);
|
void setTxMsg(int n);
|
||||||
|
void sbFtolMaxVal();
|
||||||
bool stdCall(QString const& w);
|
bool stdCall(QString const& w);
|
||||||
void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
|
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
|
, bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
|
||||||
|
@ -721,6 +721,9 @@ QPushButton[state="ok"] {
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Set Tx frequency to Rx Frequency</string>
|
<string>Set Tx frequency to Rx Frequency</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Set Tx frequency to Rx Frequency</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>▲</string>
|
<string>▲</string>
|
||||||
</property>
|
</property>
|
||||||
@ -771,6 +774,9 @@ QPushButton[state="ok"] {
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Set Rx frequency to Tx Frequency</string>
|
<string>Set Rx frequency to Tx Frequency</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="accessibleName">
|
||||||
|
<string>Set Rx frequency to Tx Frequency</string>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>▼</string>
|
<string>▼</string>
|
||||||
</property>
|
</property>
|
||||||
@ -1507,274 +1513,9 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab_2">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>2</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
|
||||||
<property name="horizontalSpacing">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="label_9">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Calling CQ </string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QPushButton" name="pbCallCQ">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate a CQ message</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>CQ</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
|
||||||
<widget class="QPushButton" name="pbSendRRR">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate message with RRR</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>RRR</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QPushButton" name="pbAnswerCaller">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate message with report</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>dB</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QLabel" name="label_10">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Answering CQ</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPushButton" name="pbAnswerCQ">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate message for replying to a CQ</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Grid</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QPushButton" name="pbSendReport">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate message with R+report</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>R+dB</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QPushButton" name="pbSend73">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>2</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Generate message with 73</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>73</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="genMsg">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
|
||||||
<horstretch>3</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QRadioButton" name="rbGenMsg">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>26</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Send this standard (generated) message</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Gen msg</string>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QComboBox" name="freeTextMsg">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
|
||||||
<horstretch>3</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>150</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Enter a free text message (maximum 13 characters)
|
|
||||||
or select a predefined macro from the dropdown list.
|
|
||||||
Press ENTER to add the current text to the predefined
|
|
||||||
list. The list can be maintained in Settings (F2).</string>
|
|
||||||
</property>
|
|
||||||
<property name="editable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="insertPolicy">
|
|
||||||
<enum>QComboBox::InsertAtBottom</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QRadioButton" name="rbFreeText">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
|
||||||
<horstretch>1</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Send this free-text message (max 13 characters)</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Free msg</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="tab_3">
|
<widget class="QWidget" name="tab_3">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>3</string>
|
<string>2</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QGridLayout" name="gridLayout_11">
|
<layout class="QGridLayout" name="gridLayout_11">
|
||||||
<item row="0" column="1" rowspan="2">
|
<item row="0" column="1" rowspan="2">
|
||||||
@ -2159,69 +1900,50 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSpinBox" name="sbTxPercent">
|
<widget class="QSpinBox" name="sbFST4W_RxFreq">
|
||||||
<property name="toolTip">
|
|
||||||
<string>Percentage of minute sequences devoted to transmitting.</string>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">QSpinBox:enabled[notx="true"] {
|
|
||||||
color: rgb(0, 0, 0);
|
|
||||||
background-color: rgb(255, 255, 0);
|
|
||||||
}</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> %</string>
|
<string> Hz</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="prefix">
|
<property name="prefix">
|
||||||
<string>Tx Pct </string>
|
<string>Rx </string>
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>100</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="RestrictedSpinBox" name="sbTR_FST4W">
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string> s</string>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>T/R </string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>15</number>
|
<number>100</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>1800</number>
|
<number>4900</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1500</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="band_hopping_group_box">
|
<widget class="HintedSpinBox" name="sbFST4W_FTol">
|
||||||
<property name="title">
|
<property name="alignment">
|
||||||
<string>Band Hopping</string>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
<property name="suffix">
|
||||||
<bool>true</bool>
|
<string> Hz</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>F Tol </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>500</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>100</number>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="band_hopping_schedule_push_button">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Choose bands and times of day for band-hopping.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Schedule ...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -2339,6 +2061,72 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="sbTxPercent">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Percentage of minute sequences devoted to transmitting.</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QSpinBox:enabled[notx="true"] {
|
||||||
|
color: rgb(0, 0, 0);
|
||||||
|
background-color: rgb(255, 255, 0);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> %</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Tx Pct </string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="RestrictedSpinBox" name="sbTR_FST4W">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> s</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>T/R </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>15</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1800</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="band_hopping_group_box">
|
||||||
|
<property name="title">
|
||||||
|
<string>Band Hopping</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="band_hopping_schedule_push_button">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Choose bands and times of day for band-hopping.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Schedule ...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -2994,7 +2782,7 @@ Yellow when too low</string>
|
|||||||
<addaction name="actionOnline_User_Guide"/>
|
<addaction name="actionOnline_User_Guide"/>
|
||||||
<addaction name="actionLocal_User_Guide"/>
|
<addaction name="actionLocal_User_Guide"/>
|
||||||
<addaction name="actionFT8_DXpedition_Mode_User_Guide"/>
|
<addaction name="actionFT8_DXpedition_Mode_User_Guide"/>
|
||||||
<addaction name="actionQuick_Start_Guide_v2"/>
|
<addaction name="actionQuick_Start_Guide"/>
|
||||||
<addaction name="download_samples_action"/>
|
<addaction name="download_samples_action"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionKeyboard_shortcuts"/>
|
<addaction name="actionKeyboard_shortcuts"/>
|
||||||
@ -3064,17 +2852,6 @@ Yellow when too low</string>
|
|||||||
<enum>QAction::QuitRole</enum>
|
<enum>QAction::QuitRole</enum>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDeviceSetup">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Configuration</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>F2</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionAbout">
|
<action name="actionAbout">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>About WSJT-X</string>
|
<string>About WSJT-X</string>
|
||||||
@ -3203,14 +2980,6 @@ Yellow when too low</string>
|
|||||||
<string>Deep</string>
|
<string>Deep</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionMonitor_OFF_at_startup">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Monitor OFF at startup</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionErase_ALL_TXT">
|
<action name="actionErase_ALL_TXT">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Erase ALL.TXT</string>
|
<string>Erase ALL.TXT</string>
|
||||||
@ -3221,97 +2990,6 @@ Yellow when too low</string>
|
|||||||
<string>Erase wsjtx_log.adi</string>
|
<string>Erase wsjtx_log.adi</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionConvert_JT9_x_to_RTTY">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Convert mode to RTTY for logging</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionLog_dB_reports_to_Comments">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Log dB reports to Comments</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionPrompt_to_log_QSO">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Prompt me to log QSO</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionBlank_line_between_decoding_periods">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Blank line between decoding periods</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionClear_DX_Call_and_Grid_after_logging">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Clear DX Call and Grid after logging</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionDisplay_distance_in_miles">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Display distance in miles</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionDouble_click_on_call_sets_Tx_Enable">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Double-click on call sets Tx Enable</string>
|
|
||||||
</property>
|
|
||||||
<property name="shortcut">
|
|
||||||
<string>F7</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="action_73TxDisable">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx disabled after sending 73</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionRunaway_Tx_watchdog">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Runaway Tx watchdog</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionAllow_multiple_instances">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Allow multiple instances</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionLockTxFreq">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx freq locked to Rx freq</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionJT65">
|
<action name="actionJT65">
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -3328,30 +3006,6 @@ Yellow when too low</string>
|
|||||||
<string>JT9+JT65</string>
|
<string>JT9+JT65</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionTx2QSO">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx messages to Rx Frequency window</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionGray1">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Gray1</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionEnable_DXCC_entity">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Show DXCC entity and worked B4 status</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionAstronomical_data">
|
<action name="actionAstronomical_data">
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -3594,19 +3248,14 @@ Yellow when too low</string>
|
|||||||
<string>Color highlighting scheme</string>
|
<string>Color highlighting scheme</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionContest_Log">
|
|
||||||
<property name="text">
|
|
||||||
<string>Contest Log</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionExport_Cabrillo_log">
|
<action name="actionExport_Cabrillo_log">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Export Cabrillo log ...</string>
|
<string>Export Cabrillo log ...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionQuick_Start_Guide_v2">
|
<action name="actionQuick_Start_Guide">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Quick-Start Guide to WSJT-X 2.0</string>
|
<string>Quick-Start Guide to FST4 and FST4W</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="contest_log_action">
|
<action name="contest_log_action">
|
||||||
@ -3635,11 +3284,6 @@ Yellow when too low</string>
|
|||||||
<string>FST4</string>
|
<string>FST4</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionFT240W">
|
|
||||||
<property name="text">
|
|
||||||
<string>FT240W</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionFST4W">
|
<action name="actionFST4W">
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@ -3648,17 +3292,6 @@ Yellow when too low</string>
|
|||||||
<string>FST4W</string>
|
<string>FST4W</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionAlso_FST4W">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Also FST4W</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
@ -3727,16 +3360,6 @@ Yellow when too low</string>
|
|||||||
<tabstop>sbSubmode</tabstop>
|
<tabstop>sbSubmode</tabstop>
|
||||||
<tabstop>syncSpinBox</tabstop>
|
<tabstop>syncSpinBox</tabstop>
|
||||||
<tabstop>tabWidget</tabstop>
|
<tabstop>tabWidget</tabstop>
|
||||||
<tabstop>pbCallCQ</tabstop>
|
|
||||||
<tabstop>pbAnswerCQ</tabstop>
|
|
||||||
<tabstop>pbAnswerCaller</tabstop>
|
|
||||||
<tabstop>pbSendReport</tabstop>
|
|
||||||
<tabstop>pbSendRRR</tabstop>
|
|
||||||
<tabstop>pbSend73</tabstop>
|
|
||||||
<tabstop>genMsg</tabstop>
|
|
||||||
<tabstop>rbGenMsg</tabstop>
|
|
||||||
<tabstop>freeTextMsg</tabstop>
|
|
||||||
<tabstop>rbFreeText</tabstop>
|
|
||||||
<tabstop>outAttenuation</tabstop>
|
<tabstop>outAttenuation</tabstop>
|
||||||
<tabstop>genStdMsgsPushButton</tabstop>
|
<tabstop>genStdMsgsPushButton</tabstop>
|
||||||
<tabstop>tx1</tabstop>
|
<tabstop>tx1</tabstop>
|
||||||
|
@ -48,7 +48,8 @@ CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor
|
|||||||
m_Percent2DScreen0 {0},
|
m_Percent2DScreen0 {0},
|
||||||
m_rxFreq {1020},
|
m_rxFreq {1020},
|
||||||
m_txFreq {0},
|
m_txFreq {0},
|
||||||
m_startFreq {0}
|
m_startFreq {0},
|
||||||
|
m_tol {100}
|
||||||
{
|
{
|
||||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
setFocusPolicy(Qt::StrongFocus);
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
@ -485,8 +486,8 @@ void CPlotter::DrawOverlay() //DrawOverlay()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(m_mode=="FST4W") {
|
if(m_mode=="FST4W") {
|
||||||
x1=XfromFreq(2600);
|
x1=XfromFreq(m_rxFreq-m_tol);
|
||||||
x2=XfromFreq(2700);
|
x2=XfromFreq(m_rxFreq+m_tol);
|
||||||
painter0.drawLine(x1,26,x2,26);
|
painter0.drawLine(x1,26,x2,26);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ include(widgets/widgets.pri)
|
|||||||
include(Decoder/decodedtext.pri)
|
include(Decoder/decodedtext.pri)
|
||||||
include(Detector/Detector.pri)
|
include(Detector/Detector.pri)
|
||||||
include(Modulator/Modulator.pri)
|
include(Modulator/Modulator.pri)
|
||||||
|
include(Audio/Audio.pri)
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
Radio.cpp NetworkServerLookup.cpp revision_utils.cpp \
|
Radio.cpp NetworkServerLookup.cpp revision_utils.cpp \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user