Merge branch 'hotfix-2.0.0-rc4' of bitbucket.org:k1jt/wsjtx into hotfix-2.0.0-rc4

This commit is contained in:
Bill Somerville 2018-10-22 12:55:35 +01:00
commit fd0a056726
14 changed files with 421 additions and 627 deletions

View File

@ -456,7 +456,6 @@ set (wsjt_FSRCS
lib/ft8/ft8code.f90 lib/ft8/ft8code.f90
lib/ft8/ft8_downsample.f90 lib/ft8/ft8_downsample.f90
lib/ft8/ft8sim.f90 lib/ft8/ft8sim.f90
lib/ft8/ft8sim2.f90
lib/gen4.f90 lib/gen4.f90
lib/gen65.f90 lib/gen65.f90
lib/gen9.f90 lib/gen9.f90
@ -497,7 +496,7 @@ set (wsjt_FSRCS
lib/moondopjpl.f90 lib/moondopjpl.f90
lib/morse.f90 lib/morse.f90
lib/move.f90 lib/move.f90
lib/msk144d2.f90 lib/msk144d.f90
lib/msk40decodeframe.f90 lib/msk40decodeframe.f90
lib/msk144decodeframe.f90 lib/msk144decodeframe.f90
lib/msk144sd.f90 lib/msk144sd.f90
@ -515,7 +514,6 @@ set (wsjt_FSRCS
lib/ft8/osd174.f90 lib/ft8/osd174.f90
lib/wsprd/osdwspr.f90 lib/wsprd/osdwspr.f90
lib/ft8/osd174_91.f90 lib/ft8/osd174_91.f90
lib/77bit/parse77.f90
lib/pctile.f90 lib/pctile.f90
lib/peakdt9.f90 lib/peakdt9.f90
lib/peakup.f90 lib/peakup.f90
@ -1250,17 +1248,14 @@ target_link_libraries (ft8code wsjt_fort wsjt_cxx)
add_executable (ft8sim lib/ft8/ft8sim.f90 wsjtx.rc) add_executable (ft8sim lib/ft8/ft8sim.f90 wsjtx.rc)
target_link_libraries (ft8sim wsjt_fort wsjt_cxx) target_link_libraries (ft8sim wsjt_fort wsjt_cxx)
add_executable (ft8sim2 lib/ft8/ft8sim2.f90 wsjtx.rc)
target_link_libraries (ft8sim2 wsjt_fort wsjt_cxx)
add_executable (msk144sd lib/msk144sd.f90 wsjtx.rc) add_executable (msk144sd lib/msk144sd.f90 wsjtx.rc)
target_link_libraries (msk144sd wsjt_fort wsjt_cxx) target_link_libraries (msk144sd wsjt_fort wsjt_cxx)
add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc) add_executable (msk144sim lib/msk144sim.f90 wsjtx.rc)
target_link_libraries (msk144sim wsjt_fort wsjt_cxx) target_link_libraries (msk144sim wsjt_fort wsjt_cxx)
add_executable (msk144d2 lib/msk144d2.f90 wsjtx.rc) add_executable (msk144d lib/msk144d.f90 wsjtx.rc)
target_link_libraries (msk144d2 wsjt_fort wsjt_cxx) target_link_libraries (msk144d wsjt_fort wsjt_cxx)
endif(WSJT_BUILD_UTILS) endif(WSJT_BUILD_UTILS)
# build the main application # build the main application

View File

@ -414,7 +414,6 @@ private:
void delete_stations (); void delete_stations ();
void insert_station (); void insert_station ();
void chk77();
Q_SLOT void on_font_push_button_clicked (); Q_SLOT void on_font_push_button_clicked ();
Q_SLOT void on_decoded_text_font_push_button_clicked (); Q_SLOT void on_decoded_text_font_push_button_clicked ();
@ -451,7 +450,6 @@ private:
Q_SLOT void on_cbHound_clicked (bool); Q_SLOT void on_cbHound_clicked (bool);
Q_SLOT void on_cbx2ToneSpacing_clicked(bool); Q_SLOT void on_cbx2ToneSpacing_clicked(bool);
Q_SLOT void on_cbx4ToneSpacing_clicked(bool); Q_SLOT void on_cbx4ToneSpacing_clicked(bool);
Q_SLOT void on_rbNone_toggled(bool);
Q_SLOT void on_rbFieldDay_toggled(); Q_SLOT void on_rbFieldDay_toggled();
Q_SLOT void on_rbRTTYroundup_toggled(); Q_SLOT void on_rbRTTYroundup_toggled();
Q_SLOT void on_FieldDay_Exchange_textChanged(); Q_SLOT void on_FieldDay_Exchange_textChanged();
@ -579,8 +577,6 @@ private:
bool twoPass_; bool twoPass_;
bool bFox_; bool bFox_;
bool bHound_; bool bHound_;
bool bGenerate77_;
bool bDecode77_;
bool bNoSpecial_; bool bNoSpecial_;
bool bFieldDay_; bool bFieldDay_;
bool bRTTYroundup_; bool bRTTYroundup_;
@ -679,8 +675,6 @@ bool Configuration::single_decode () const {return m_->single_decode_;}
bool Configuration::twoPass() const {return m_->twoPass_;} bool Configuration::twoPass() const {return m_->twoPass_;}
bool Configuration::bFox() const {return m_->bFox_;} bool Configuration::bFox() const {return m_->bFox_;}
bool Configuration::bHound() const {return m_->bHound_;} bool Configuration::bHound() const {return m_->bHound_;}
bool Configuration::bGenerate77() const {return m_->bGenerate77_;}
bool Configuration::bDecode77() const {return m_->bDecode77_;}
bool Configuration::bNoSpecial() const {return m_->bNoSpecial_;} bool Configuration::bNoSpecial() const {return m_->bNoSpecial_;}
bool Configuration::bFieldDay() const {return m_->bFieldDay_;} bool Configuration::bFieldDay() const {return m_->bFieldDay_;}
bool Configuration::bRTTYroundup() const {return m_->bRTTYroundup_;} bool Configuration::bRTTYroundup() const {return m_->bRTTYroundup_;}
@ -835,7 +829,6 @@ void Configuration::setEU_VHF_Contest()
{ {
m_->bEU_VHF_Contest_ = true; m_->bEU_VHF_Contest_ = true;
m_->ui_->rbEU_VHF_Contest->setChecked(m_->bEU_VHF_Contest_); m_->ui_->rbEU_VHF_Contest->setChecked(m_->bEU_VHF_Contest_);
m_->ui_->cbGenerate77->setChecked(true);
m_->write_settings(); m_->write_settings();
} }
@ -925,7 +918,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
, default_audio_output_device_selected_ {false} , default_audio_output_device_selected_ {false}
{ {
ui_->setupUi (this); ui_->setupUi (this);
// ui_->groupBox_6->setVisible(false); //### Temporary ??? ###
{ {
// Find a suitable data file location // Find a suitable data file location
@ -1208,8 +1200,6 @@ void Configuration::impl::initialize_models ()
ui_->cbTwoPass->setChecked(twoPass_); ui_->cbTwoPass->setChecked(twoPass_);
ui_->cbFox->setChecked(bFox_); ui_->cbFox->setChecked(bFox_);
ui_->cbHound->setChecked(bHound_); ui_->cbHound->setChecked(bHound_);
ui_->cbGenerate77->setChecked(bGenerate77_);
ui_->cbDecode77->setChecked(bDecode77_);
ui_->rbNone->setChecked(bNoSpecial_); ui_->rbNone->setChecked(bNoSpecial_);
ui_->rbFieldDay->setChecked(bFieldDay_); ui_->rbFieldDay->setChecked(bFieldDay_);
ui_->rbRTTYroundup->setChecked(bRTTYroundup_); ui_->rbRTTYroundup->setChecked(bRTTYroundup_);
@ -1256,7 +1246,6 @@ void Configuration::impl::initialize_models ()
ui_->udpWindowRestore->setChecked(udpWindowRestore_); ui_->udpWindowRestore->setChecked(udpWindowRestore_);
ui_->calibration_intercept_spin_box->setValue (calibration_.intercept); ui_->calibration_intercept_spin_box->setValue (calibration_.intercept);
ui_->calibration_slope_ppm_spin_box->setValue (calibration_.slope_ppm); ui_->calibration_slope_ppm_spin_box->setValue (calibration_.slope_ppm);
chk77();
if (rig_params_.ptt_port.isEmpty ()) if (rig_params_.ptt_port.isEmpty ())
{ {
@ -1461,8 +1450,6 @@ void Configuration::impl::read_settings ()
twoPass_ = settings_->value("TwoPass",true).toBool (); twoPass_ = settings_->value("TwoPass",true).toBool ();
bFox_ = settings_->value("Fox",false).toBool (); bFox_ = settings_->value("Fox",false).toBool ();
bHound_ = settings_->value("Hound",false).toBool (); bHound_ = settings_->value("Hound",false).toBool ();
bGenerate77_ = settings_->value("Generate77",false).toBool ();
bDecode77_ = settings_->value("Decode77",false).toBool ();
bNoSpecial_ = settings_->value("NoSpecial",false).toBool (); bNoSpecial_ = settings_->value("NoSpecial",false).toBool ();
bFieldDay_ = settings_->value("FieldDay",false).toBool (); bFieldDay_ = settings_->value("FieldDay",false).toBool ();
bRTTYroundup_ = settings_->value("RTTYroundup",false).toBool (); bRTTYroundup_ = settings_->value("RTTYroundup",false).toBool ();
@ -1573,8 +1560,6 @@ void Configuration::impl::write_settings ()
settings_->setValue ("TwoPass", twoPass_); settings_->setValue ("TwoPass", twoPass_);
settings_->setValue ("Fox", bFox_); settings_->setValue ("Fox", bFox_);
settings_->setValue ("Hound", bHound_); settings_->setValue ("Hound", bHound_);
settings_->setValue ("Generate77", bGenerate77_);
settings_->setValue ("Decode77", bDecode77_);
settings_->setValue ("NoSpecial", bNoSpecial_); settings_->setValue ("NoSpecial", bNoSpecial_);
settings_->setValue ("FieldDay", bFieldDay_); settings_->setValue ("FieldDay", bFieldDay_);
settings_->setValue ("RTTYroundup", bRTTYroundup_); settings_->setValue ("RTTYroundup", bRTTYroundup_);
@ -1983,8 +1968,6 @@ void Configuration::impl::accept ()
bFox_ = ui_->cbFox->isChecked (); bFox_ = ui_->cbFox->isChecked ();
bHound_ = ui_->cbHound->isChecked (); bHound_ = ui_->cbHound->isChecked ();
if(bFox_ or bHound_) ui_->rbNone->setChecked(true); //### if(bFox_ or bHound_) ui_->rbNone->setChecked(true); //###
bGenerate77_ = ui_->cbGenerate77->isChecked();
bDecode77_ = ui_->cbDecode77->isChecked();
bNoSpecial_ = ui_->rbNone->isChecked (); bNoSpecial_ = ui_->rbNone->isChecked ();
bFieldDay_ = ui_->rbFieldDay->isChecked (); bFieldDay_ = ui_->rbFieldDay->isChecked ();
bRTTYroundup_ = ui_->rbRTTYroundup->isChecked (); bRTTYroundup_ = ui_->rbRTTYroundup->isChecked ();
@ -2474,7 +2457,6 @@ void Configuration::impl::on_cbFox_clicked (bool checked)
ui_->cbHound->setChecked (false); ui_->cbHound->setChecked (false);
ui_->rbNone->setChecked(true); ui_->rbNone->setChecked(true);
} }
chk77();
} }
void Configuration::impl::on_cbHound_clicked (bool checked) void Configuration::impl::on_cbHound_clicked (bool checked)
@ -2483,22 +2465,6 @@ void Configuration::impl::on_cbHound_clicked (bool checked)
ui_->cbFox->setChecked (false); ui_->cbFox->setChecked (false);
ui_->rbNone->setChecked(true); ui_->rbNone->setChecked(true);
} }
chk77();
}
void Configuration::impl::chk77()
{
bool b77OK = !ui_->cbFox->isChecked() and !ui_->cbHound->isChecked();
ui_->groupBox_9->setEnabled(b77OK);
if(!b77OK) {
ui_->cbGenerate77->setChecked(true);
ui_->cbDecode77->setChecked(true);
}
}
void Configuration::impl::on_rbNone_toggled(bool b)
{
if(!b) ui_->cbGenerate77->setChecked(true);
} }
void Configuration::impl::on_rbFieldDay_toggled() void Configuration::impl::on_rbFieldDay_toggled()

View File

@ -2414,35 +2414,6 @@ Right click for insert and delete options.</string>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_8">
<property name="title">
<string>FT8 message types</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<widget class="QCheckBox" name="cbGenerate77">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;By default, early candidate releases of WSJT-X 2.0 generate 75-bit messages if the message content allows it.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Always generate 77-bit messages</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbDecode77">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check this box to ignore FT8 transmissions using the older 75-bit protocol.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Decode only 77-bit messages</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QGroupBox" name="groupBox_7"> <widget class="QGroupBox" name="groupBox_7">
<property name="title"> <property name="title">
@ -2472,154 +2443,7 @@ Right click for insert and delete options.</string>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Miscellaneous</string>
</property>
<layout class="QFormLayout" name="formLayout_10">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Degrade S/N of .wav file: </string>
</property>
<property name="buddy">
<cstring>sbDegrade</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="sbDegrade">
<property name="toolTip">
<string>For offline sensitivity tests</string>
</property>
<property name="suffix">
<string> dB</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="singleStep">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Receiver bandwidth:</string>
</property>
<property name="buddy">
<cstring>sbBandwidth</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbBandwidth">
<property name="toolTip">
<string>For offline sensitivity tests</string>
</property>
<property name="suffix">
<string> Hz</string>
</property>
<property name="maximum">
<number>6000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
<property name="value">
<number>2500</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Tx delay:</string>
</property>
<property name="buddy">
<cstring>sbTxDelay</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="sbTxDelay">
<property name="toolTip">
<string>Minimum delay between assertion of PTT and start of Tx audio.</string>
</property>
<property name="suffix">
<string> s</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>0.500000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_10">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="title">
<string>Tone spacing</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_19">
<item>
<widget class="QCheckBox" name="cbx2ToneSpacing">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>x 2</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbx4ToneSpacing">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>x 4 </string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="0" colspan="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_9"> <widget class="QGroupBox" name="groupBox_9">
<property name="title"> <property name="title">
<string>Special operating activity: Generation of FT8 and MSK144 messages</string> <string>Special operating activity: Generation of FT8 and MSK144 messages</string>
@ -2819,6 +2643,153 @@ Right click for insert and delete options.</string>
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="0" column="1">
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Miscellaneous</string>
</property>
<layout class="QFormLayout" name="formLayout_10">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Degrade S/N of .wav file: </string>
</property>
<property name="buddy">
<cstring>sbDegrade</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="sbDegrade">
<property name="toolTip">
<string>For offline sensitivity tests</string>
</property>
<property name="suffix">
<string> dB</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="singleStep">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Receiver bandwidth:</string>
</property>
<property name="buddy">
<cstring>sbBandwidth</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbBandwidth">
<property name="toolTip">
<string>For offline sensitivity tests</string>
</property>
<property name="suffix">
<string> Hz</string>
</property>
<property name="maximum">
<number>6000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
<property name="value">
<number>2500</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Tx delay:</string>
</property>
<property name="buddy">
<cstring>sbTxDelay</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="sbTxDelay">
<property name="toolTip">
<string>Minimum delay between assertion of PTT and start of Tx audio.</string>
</property>
<property name="suffix">
<string> s</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>0.500000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_10">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="title">
<string>Tone spacing</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_19">
<item>
<widget class="QCheckBox" name="cbx2ToneSpacing">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with twice the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-2 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>x 2</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbx4ToneSpacing">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Generate Tx audio with four times the normal tone spacing. Intended for special LF/MF transmitters that use a divide-by-4 before generating RF.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>x 4 </string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
@ -2947,8 +2918,6 @@ Right click for insert and delete options.</string>
<tabstop>cbx4ToneSpacing</tabstop> <tabstop>cbx4ToneSpacing</tabstop>
<tabstop>cbFox</tabstop> <tabstop>cbFox</tabstop>
<tabstop>cbHound</tabstop> <tabstop>cbHound</tabstop>
<tabstop>cbGenerate77</tabstop>
<tabstop>cbDecode77</tabstop>
<tabstop>rbNone</tabstop> <tabstop>rbNone</tabstop>
<tabstop>rbNA_VHF_Contest</tabstop> <tabstop>rbNA_VHF_Contest</tabstop>
<tabstop>rbEU_VHF_Contest</tabstop> <tabstop>rbEU_VHF_Contest</tabstop>
@ -3025,12 +2994,12 @@ Right click for insert and delete options.</string>
</connection> </connection>
</connections> </connections>
<buttongroups> <buttongroups>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="TX_mode_button_group"/> <buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/> <buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/> <buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/> <buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_audio_source_button_group"/> <buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
</buttongroups> </buttongroups>
</ui> </ui>

View File

@ -1,145 +1,51 @@
parameter (MAXTEST=75,NTEST=68) parameter (MAXTEST=75,NTEST=48)
character*40 testmsg(MAXTEST) character*37 testmsg(MAXTEST)
character*40 testmsgchk(MAXTEST)
! Test msgs should include the extremes for the different types
! See pfx.f90
! Type 1 P & A
! Type 1 1A & E5
data testmsg(1:NTEST)/ & data testmsg(1:NTEST)/ &
"CQ WB9XYZ EN34", & "CQ K1ABC FN42", &
"CQ DX WB9XYZ EN34", & "K1ABC W9XYZ EN37", &
"QRZ WB9XYZ EN34", & "W9XYZ K1ABC -11", &
"KA1ABC WB9XYZ EN34", & "K1ABC W9XYZ R-09", &
"KA1ABC WB9XYZ RO", & "W9XYZ K1ABC RRR", &
"KA1ABC WB9XYZ -21", & "K1ABC W9XYZ 73", &
"KA1ABC WB9XYZ R-19", & "K1ABC W9XYZ RR73", &
"KA1ABC WB9XYZ RRR", & "CQ KH1/KH7Z", &
"KA1ABC WB9XYZ 73", & "K1ABC RR73; W9XYZ <KH1/KH7Z> -08", &
"KA1ABC WB9XYZ", & "CQ FD K1ABC FN42", &
"CQ 000 WB9XYZ EN34", & "K1ABC W9XYZ 6A WI", &
"CQ 999 WB9XYZ EN34", & "W9XYZ K1ABC R 2B EMA", &
"CQ EU WB9XYZ EN34", & "CQ TEST K1ABC/R FN42", &
"CQ WY WB9XYZ EN34", & "K1ABC/R W9XYZ EN37", &
"1A/KA1ABC WB9XYZ", & "W9XYZ K1ABC/R R FN42", &
"E5/KA1ABC WB9XYZ", & "K1ABC/R W9XYZ RR73", &
"KA1ABC 1A/WB9XYZ", & "CQ TEST K1ABC FN42", &
"KA1ABC E5/WB9XYZ", & "K1ABC W9XYZ 579 WI", &
"KA1ABC/P WB9XYZ", & "W9XYZ K1ABC R 589 MA", &
"KA1ABC/A WB9XYZ", & "K1ABC KA0DEF 559 MO", &
"KA1ABC WB9XYZ/P", & "TU; KA0DEF K1ABC R 569 MA", &
"KA1ABC WB9XYZ/A", & "KA1ABC G3AAA 529 0013", &
"CQ KA1ABC/P", & "TU; G3AAA K1ABC R 559 MA", &
"CQ WB9XYZ/A", & "CQ G4ABC/P IO91", &
"QRZ KA1ABC/P", & "G4ABC/P PA9XYZ JO22", &
"QRZ WB9XYZ/A", & "PA9XYZ 590003 IO91NP", &
"DE KA1ABC/P", & "G4ABC/P R 570007 JO22DB", &
"DE WB9XYZ/A", & "PA9XYZ G4ABC/P RR73", &
"CQ 1A/KA1ABC", & "CQ PJ4/K1ABC", &
"CQ E5/KA1ABC", & "PJ4/K1ABC <W9XYZ>", &
"DE 1A/KA1ABC", & "W9XYZ <PJ4/K1ABC> -11", &
"DE E5/KA1ABC", & "<PJ4/K1ABC> W9XYZ R-09", &
"QRZ 1A/KA1ABC", & "<W9XYZ> PJ4/K1ABC RRR", &
"QRZ E5/KA1ABC", & "PJ4/K1ABC <W9XYZ> 73", &
"CQ WB9XYZ/1A", & "CQ W9XYZ EN37", &
"CQ WB9XYZ/E5", & "<W9XYZ> YW18FIFA", &
"QRZ WB9XYZ/1A", & "<YW18FIFA> W9XYZ -11", &
"QRZ WB9XYZ/E5", & "W9XYZ <YW18FIFA> R-09", &
"DE WB9XYZ/1A", & "YW18FIFA <W9XYZ> RRR", &
"DE WB9XYZ/E5", & "<W9XYZ> YW18FIFA 73", &
"CQ A000/KA1ABC FM07", & "TNX BOB 73 GL", &
"CQ ZZZZ/KA1ABC FM07", & "CQ YW18FIFA", &
"QRZ W4/KA1ABC FM07", & "<YW18FIFA> KA1ABC", &
"DE W4/KA1ABC FM07", & "KA1ABC <YW18FIFA> -11", &
"CQ W4/KA1ABC -22", & "<YW18FIFA> KA1ABC R-17", &
"DE W4/KA1ABC -22", & "<KA1ABC> YW18FIFA RR73", &
"QRZ W4/KA1ABC -22", & "<YW18FIFA> KA1ABC 73", &
"CQ W4/KA1ABC R-22", & "123456789ABCDEF012"/
"DE W4/KA1ABC R-22", &
"QRZ W4/KA1ABC R-22", &
"DE W4/KA1ABC 73", &
"CQ KA1ABC FM07", &
"QRZ KA1ABC FM07", &
"DE KA1ABC/VE6 FM07", &
"CQ KA1ABC/VE6 -22", &
"DE KA1ABC/VE6 -22", &
"QRZ KA1ABC/VE6 -22", &
"CQ KA1ABC/VE6 R-22", &
"DE KA1ABC/VE6 R-22", &
"QRZ KA1ABC/VE6 R-22", &
"DE KA1ABC 73", &
"HELLO WORLD", &
"ZL4/KA1ABC 73", &
"KA1ABC XL/WB9XYZ", &
"KA1ABC WB9XYZ/W4", &
"DE KA1ABC/QRP 2W", &
"KA1ABC/1 WB9XYZ/1", &
"123456789ABCDEFGH"/
data testmsgchk(1:NTEST)/ &
"CQ WB9XYZ EN34", &
"CQ DX WB9XYZ EN34", &
"QRZ WB9XYZ EN34", &
"KA1ABC WB9XYZ EN34", &
"KA1ABC WB9XYZ RO", &
"KA1ABC WB9XYZ -21", &
"KA1ABC WB9XYZ R-19", &
"KA1ABC WB9XYZ RRR", &
"KA1ABC WB9XYZ 73", &
"KA1ABC WB9XYZ", &
"CQ 000 WB9XYZ EN34", &
"CQ 999 WB9XYZ EN34", &
"CQ EU WB9XYZ EN34", &
"CQ WY WB9XYZ EN34", &
"1A/KA1ABC WB9XYZ", &
"E5/KA1ABC WB9XYZ", &
"KA1ABC 1A/WB9XYZ", &
"KA1ABC E5/WB9XYZ", &
"KA1ABC/P WB9XYZ", &
"KA1ABC/A WB9XYZ", &
"KA1ABC WB9XYZ/P", &
"KA1ABC WB9XYZ/A", &
"CQ KA1ABC/P", &
"CQ WB9XYZ/A", &
"QRZ KA1ABC/P", &
"QRZ WB9XYZ/A", &
"DE KA1ABC/P", &
"DE WB9XYZ/A", &
"CQ 1A/KA1ABC", &
"CQ E5/KA1ABC", &
"DE 1A/KA1ABC", &
"DE E5/KA1ABC", &
"QRZ 1A/KA1ABC", &
"QRZ E5/KA1ABC", &
"CQ WB9XYZ/1A", &
"CQ WB9XYZ/E5", &
"QRZ WB9XYZ/1A", &
"QRZ WB9XYZ/E5", &
"DE WB9XYZ/1A", &
"DE WB9XYZ/E5", &
"CQ A000/KA1ABC FM07", &
"CQ ZZZZ/KA1ABC FM07", &
"QRZ W4/KA1ABC FM07", &
"DE W4/KA1ABC FM07", &
"CQ W4/KA1ABC -22", &
"DE W4/KA1ABC -22", &
"QRZ W4/KA1ABC -22", &
"CQ W4/KA1ABC R-22", &
"DE W4/KA1ABC R-22", &
"QRZ W4/KA1ABC R-22", &
"DE W4/KA1ABC 73", &
"CQ KA1ABC FM07", &
"QRZ KA1ABC FM07", &
"DE KA1ABC/VE6 FM07", &
"CQ KA1ABC/VE6 -22", &
"DE KA1ABC/VE6 -22", &
"QRZ KA1ABC/VE6 -22", &
"CQ KA1ABC/VE6 R-22", &
"DE KA1ABC/VE6 R-22", &
"QRZ KA1ABC/VE6 R-22", &
"DE KA1ABC 73", &
"HELLO WORLD", &
"ZL4/KA1ABC 73", &
"KA1ABC XL/WB9", &
"KA1ABC WB9XYZ", &
"DE KA1ABC/QRP", &
"KA1ABC/1 WB9X", &
"123456789ABCD"/

View File

@ -1,31 +1,28 @@
program ft8code program ft8code
! Provides examples of message packing, LDPC(144,87) encoding, bit and ! Provides examples of message packing, LDPC(174,91) encoding, bit and
! symbol ordering, and other details of the FT8 protocol. ! symbol ordering, and other details of the FT8 protocol.
use packjt use packjt77
use crc
include 'ft8_params.f90' !Set various constants include 'ft8_params.f90' !Set various constants
include 'ft8_testmsg.f90' include 'ft8_testmsg.f90'
parameter (NWAVE=NN*NSPS) parameter (NWAVE=NN*NSPS)
character*40 msg,msgchk character*77 c77
character*37 msg37 character*37 msg,msgsent
character*6 c1,c2
character*9 comment character*9 comment
character*22 msgsent,message character bad*1,msgtype*16
character bad*1,msgtype*10 character*91 cbits
character*87 cbits
integer itone(NN) integer itone(NN)
integer dgen(12) integer*1 msgbits(77)
integer*1 msgbits(KK),decoded(KK),decoded0(KK) logical unpk77_success
! Get command-line argument(s) ! Get command-line argument(s)
nargs=iargc() nargs=iargc()
if(nargs.ne.1 .and. nargs.ne.3) then if(nargs.ne.1 .and. nargs.ne.3) then
print* print*
print*,'Program ft8code: Provides examples of message packing, ', & print*,'Program ft8code: Provides examples of message packing, ', &
'LDPC(174,87) encoding,' 'LDPC(174,91) encoding,'
print*,'bit and symbol ordering, and other details of the FT8 protocol.' print*,'bit and symbol ordering, and other details of the FT8 protocol.'
print* print*
print*,'Usage: ft8code [-c grid] "message" # Results for specified message' print*,'Usage: ft8code [-c grid] "message" # Results for specified message'
@ -35,89 +32,55 @@ program ft8code
call getarg(1,msg) !Message to be transmitted call getarg(1,msg) !Message to be transmitted
if(len(trim(msg)).eq.2 .and. msg(1:2).eq.'-t') then if(len(trim(msg)).eq.2 .and. msg(1:2).eq.'-t') then
testmsg(NTEST+1)='KA1ABC RR73; WB9XYZ <KH1/KH7Z> -11' nmsg=NTEST
nmsg=NTEST+1
else else
msgchk=msg call fmtmsg(msg,iz) !To upper case; collapse multiple blanks
call fmtmsg(msgchk,iz) !To upper case; collapse multiple blanks
nmsg=1 nmsg=1
endif endif
write(*,1010) write(*,1010)
1010 format(" Message Decoded Err? Type"/76("-")) 1010 format(4x,'Message',31x,'Decoded',29x,'Err i3.n3'/100('-'))
do imsg=1,nmsg do imsg=1,nmsg
if(nmsg.gt.1) msg=testmsg(imsg) if(nmsg.gt.1) msg=testmsg(imsg)
call fmtmsg(msg,iz) !To upper case, collapse multiple blanks
msgchk=msg
! Generate msgsent, msgbits, and itone ! Generate msgsent, msgbits, and itone
if(index(msg,';').le.0) then i3=-1
call packmsg(msg(1:22),dgen,itype) n3=-1
call genft8_174_91(msg,i3,n3,msgsent,msgbits,itone)
msgtype="" msgtype=""
if(itype.eq.1) msgtype="Std Msg" if(i3.eq.0) then
if(itype.eq.2) msgtype="Type 1 pfx" if(n3.eq.0) msgtype="Free text"
if(itype.eq.3) msgtype="Type 1 sfx" if(n3.eq.1) msgtype="DXpedition mode"
if(itype.eq.4) msgtype="Type 2 pfx" if(n3.eq.2) msgtype="EU VHF Contest"
if(itype.eq.5) msgtype="Type 2 sfx" if(n3.eq.3) msgtype="ARRL Field Day"
if(itype.eq.6) msgtype="Free text" if(n3.eq.4) msgtype="ARRL Field Day"
i3bit=0 if(n3.eq.5) msgtype="Telemetry"
call genft8(msg(1:22),i3bit,msgsent,msgbits,itone) if(n3.ge.6) msgtype="Undefined type"
else
call foxgen_wrap(msg,msgbits,itone)
i3bit=1
endif endif
decoded=msgbits if(i3.eq.1) msgtype="Standard msg"
i3bit=4*decoded(73) + 2*decoded(74) + decoded(75) if(i3.eq.2) msgtype="EU VHF Contest"
iFreeText=decoded(57) if(i3.eq.3) msgtype="ARRL RTTY Roundup"
decoded0=decoded if(i3.eq.4) msgtype="Nonstandard calls"
if(i3bit.eq.1) decoded(57:)=0 if(i3.ge.5) msgtype="Undefined msg type"
call extractmessage174(decoded,message,ncrcflag) if(i3.ge.1) n3=-1
decoded=decoded0
if(i3bit.eq.0) then
bad=" " bad=" "
comment=' ' comment=' '
if(itype.ne.6 .and. message.ne.msgchk) bad="*" if(msg.ne.msgsent) bad="*"
if(itype.eq.6 .and. message(1:13).ne.msgchk(1:13)) bad="*" if(n3.ge.0) then
if(itype.eq.6 .and. len(trim(msgchk)).gt.13) comment='truncated' write(*,1020) imsg,msg,msgsent,bad,i3,n3,msgtype,comment
write(*,1020) imsg,msgchk,message,bad,i3bit,itype,msgtype,comment 1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a16,1x,a9)
1020 format(i2,'.',1x,a22,1x,a22,1x,a1,2i2,1x,a10,1x,a9)
else else
write(cbits,1001) decoded write(*,1022) imsg,msg,msgsent,bad,i3,msgtype,comment
1001 format(87i1) 1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a16,1x,a9)
read(cbits,1002) nrpt
1002 format(66x,b6)
irpt=nrpt-30
i1=index(message,' ')
i2=index(message(i1+1:),' ') + i1
c1=message(1:i1)//' '
c2=message(i1+1:i2)//' '
msg37=c1//' RR73; '//c2//' <...> '
write(msg37(35:37),1003) irpt
1003 format(i3.2)
if(msg37(35:35).ne.'-') msg37(35:35)='+'
iz=len(trim(msg37))
do iter=1,10 !Collapse multiple blanks into one
ib2=index(msg37(1:iz),' ')
if(ib2.lt.1) exit
msg37=msg37(1:ib2)//msg37(ib2+2:)
iz=iz-1
enddo
write(*,1021) imsg,msgchk,msg37
1021 format(i2,'.',1x,a40,1x,a37)
endif endif
enddo enddo
if(nmsg.eq.1) then if(nmsg.eq.1) then
write(*,1030) msgbits(1:56) write(*,1030) msgbits
1030 format(/'Call1: ',28i1,' Call2: ',28i1) 1030 format(/'Message bits: ',/77i1)
write(*,1032) msgbits(57:72),msgbits(73:75),msgbits(76:87)
1032 format('Grid: ',16i1,' 3Bit: ',3i1,' CRC12: ',12i1)
write(*,1034) itone write(*,1034) itone
1034 format(/'Channel symbols:'/79i1) 1034 format(/'Channel symbols (tones):'/79i1)
endif endif
999 end program ft8code 999 end program ft8code

View File

@ -1,14 +1,16 @@
program ft8sim program ft8sim
! Generate simulated data for a 15-second HF/6m mode using 8-FSK. ! Generate simulated "type 2" ft8 files
! Output is saved to a *.wav file. ! Output is saved to a *.wav file.
use wavhdr use wavhdr
use packjt77
include 'ft8_params.f90' !Set various constants include 'ft8_params.f90' !Set various constants
parameter (NWAVE=NN*NSPS) parameter (NWAVE=NN*NSPS)
type(hdr) h !Header for .wav file type(hdr) h !Header for .wav file
character arg*12,fname*17 character arg*12,fname*17
character msg*37,msgsent*37,msg0*37 character msg37*37,msgsent37*37,msg40*40
character c77*77
complex c0(0:NMAX-1) complex c0(0:NMAX-1)
complex c(0:NMAX-1) complex c(0:NMAX-1)
real wave(NMAX) real wave(NMAX)
@ -19,14 +21,13 @@ program ft8sim
! Get command-line argument(s) ! Get command-line argument(s)
nargs=iargc() nargs=iargc()
if(nargs.ne.8) then if(nargs.ne.8) then
print*,'Usage: ft8sim "message" nsig|f0 DT fdop del width nfiles snr' print*,'Usage: ft8sim "message" f0 DT fdop del width nfiles snr'
print*,'Examples: ft8sim "K1ABC W9XYZ EN37" 1500.0 0.0 0.1 1.0 0 10 -18' print*,'Examples: ft8sim "K1ABC W9XYZ EN37" 1500.0 0.0 0.1 1.0 0 10 -18'
print*,' ft8sim "K1ABC W9XYZ EN37" 10 0.0 0.1 1.0 25 10 -18' print*,' ft8sim "WA9XYZ/R KA1ABC/R FN42" 1500.0 0.0 0.1 1.0 0 10 -18'
print*,' ft8sim "K1ABC W9XYZ EN37" 25 0.0 0.1 1.0 25 10 -18'
print*,' ft8sim "K1ABC RR73; W9XYZ <KH1/KH7Z> -11" 300 0 0 0 25 1 -10' print*,' ft8sim "K1ABC RR73; W9XYZ <KH1/KH7Z> -11" 300 0 0 0 25 1 -10'
go to 999 go to 999
endif endif
call getarg(1,msg) !Message to be transmitted call getarg(1,msg37) !Message to be transmitted
call getarg(2,arg) call getarg(2,arg)
read(arg,*) f0 !Frequency (only used for single-signal) read(arg,*) f0 !Frequency (only used for single-signal)
call getarg(3,arg) call getarg(3,arg)
@ -62,65 +63,37 @@ program ft8sim
txt=NN*NSPS/12000.0 txt=NN*NSPS/12000.0
! Source-encode, then get itone() ! Source-encode, then get itone()
if(index(msg,';').le.0) then i3=-1
i3bit=0 n3=-1
call genft8(msg,i3bit,0,1,msgsent,msgbits,itone) call pack77(msg37,i3,n3,c77)
write(*,1000) f0,xdt,txt,snrdb,bw,msgsent call genft8_174_91(msg37,i3,n3,msgsent37,msgbits,itone)
1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, &
' BW:',f4.1,2x,a22)
else
call foxgen_wrap(msg,msgbits,itone)
write(*,1001) f0,xdt,txt,snrdb,bw,msg
1001 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, &
' BW:',f4.1,2x,a37)
endif
write(*,1030) msgbits(1:56) write(*,*)
1030 format(/'Call1: ',28i1,' Call2: ',28i1) write(*,'(a23,a37,3x,a7,i1,a1,i1)') 'New Style FT8 Message: ',msgsent37,'i3.n3: ',i3,'.',n3
write(*,1032) msgbits(57:72),msgbits(73:75) write(*,1000) f0,xdt,txt,snrdb,bw
1032 format('Grid: ',16i1,' 3Bit: ',3i1) 1000 format('f0:',f9.3,' DT:',f6.2,' TxT:',f6.1,' SNR:',f6.1, &
write(*,1034) itone ' BW:',f4.1)
1034 format(/'Channel symbols:'/79i1/) write(*,*)
if(i3.eq.1) then
write(*,*) ' mycall hiscall hisgrid'
write(*,'(28i1,1x,i1,1x,28i1,1x,i1,1x,i1,1x,15i1,1x,3i1)') msgbits(1:77)
else
write(*,'(a14)') 'Message bits: '
write(*,'(77i1)') msgbits
endif
write(*,*)
write(*,'(a17)') 'Channel symbols: '
write(*,'(79i1)') itone
write(*,*)
call sgran() call sgran()
msg0=msg msg0=msg
do ifile=1,nfiles do ifile=1,nfiles
c=0.
do isig=1,nsig
c0=0.
if(nsig.eq.2) then
if(index(msg,'R-').gt.0) f0=500
i1=index(msg,' ')
msg(i1+4:i1+4)=char(ichar('A')+isig-1)
if(isig.eq.2) then
f0=f0+100
endif
call genft8(msg,i3bit,msgsent,msgbits,itone)
endif
if(nsig.eq.25) then
f0=(isig+2)*100.0
else if(nsig.eq.50) then
msg=msg0
f0=1000.0 + (isig-1)*60.0
i1=index(msg,' ')
i2=index(msg(i1+1:),' ') + i1
msg(i1+2:i1+2)=char(ichar('0')+mod(isig-1,10))
msg(i1+3:i1+3)=char(ichar('A')+mod(isig-1,26))
msg(i1+4:i1+4)=char(ichar('A')+mod(isig-1,26))
msg(i1+5:i1+5)=char(ichar('A')+mod(isig-1,26))
write(msg(i2+3:i2+4),'(i2.2)') isig-1
if(ifile.ge.2 .and. isig.eq.ifile-1) then
write(msg(i2+1:i2+4),1002) -isig
1002 format('R',i3.2)
f0=600.0 + mod(isig-1,5)*60.0
endif
call genft8(msg,i3bit,msgsent,msgbits,itone)
endif
! k=nint((xdt+0.5+0.01*gran())/dt)
k=nint((xdt+0.5)/dt) k=nint((xdt+0.5)/dt)
ia=k ia=k
phi=0.0 phi=0.0
c0=0.0
do j=1,NN !Generate complex waveform do j=1,NN !Generate complex waveform
dphi=twopi*(f0*dt+itone(j)/real(NSPS)) dphi=twopi*(f0*dt+itone(j)/real(NSPS))
do i=1,NSPS do i=1,NSPS
@ -130,8 +103,8 @@ program ft8sim
enddo enddo
enddo enddo
if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c0,NMAX,fs,delay,fspread) if(fspread.ne.0.0 .or. delay.ne.0.0) call watterson(c0,NMAX,fs,delay,fspread)
c=c+sig*c0 c=sig*c0
enddo
ib=k ib=k
wave=real(c) wave=real(c)
peak=maxval(abs(wave(ia:ib))) peak=maxval(abs(wave(ia:ib)))
@ -160,7 +133,4 @@ program ft8sim
write(*,1110) ifile,xdt,f0,snrdb,fname write(*,1110) ifile,xdt,f0,snrdb,fname
1110 format(i4,f7.2,f8.2,f7.1,2x,a17) 1110 format(i4,f7.2,f8.2,f7.1,2x,a17)
enddo enddo
999 end program ft8sim 999 end program ft8sim

47
lib/msk144_testmsg.f90 Normal file
View File

@ -0,0 +1,47 @@
parameter (MAXTEST=75,NTEST=43)
character*37 testmsg(MAXTEST)
data testmsg(1:NTEST)/ &
"CQ K1ABC FN42", &
"K1ABC W9XYZ EN37", &
"W9XYZ K1ABC -11", &
"K1ABC W9XYZ R-09", &
"W9XYZ K1ABC RRR", &
"K1ABC W9XYZ 73", &
"K1ABC W9XYZ RR73", &
"CQ KH1/KH7Z", &
"CQ TEST K1ABC/R FN42", &
"K1ABC/R W9XYZ EN37", &
"W9XYZ K1ABC/R R FN42", &
"K1ABC/R W9XYZ RR73", &
"CQ TEST K1ABC FN42", &
"K1ABC/R W9XYZ/R R FN42", &
"CQ G4ABC/P IO91", &
"G4ABC/P PA9XYZ JO22", &
"PA9XYZ 590003 IO91NP", &
"G4ABC/P R 570007 JO22DB", &
"PA9XYZ G4ABC/P RR73", &
"CQ PJ4/K1ABC", &
"PJ4/K1ABC <W9XYZ>", &
"W9XYZ <PJ4/K1ABC> -11", &
"<PJ4/K1ABC> W9XYZ R-09", &
"<W9XYZ> PJ4/K1ABC RRR", &
"PJ4/K1ABC <W9XYZ> 73", &
"CQ W9XYZ EN37", &
"<W9XYZ> YW18FIFA", &
"<YW18FIFA> W9XYZ -11", &
"W9XYZ <YW18FIFA> R-09", &
"YW18FIFA <W9XYZ> RRR", &
"<W9XYZ> YW18FIFA 73", &
"TNX BOB 73 GL", &
"CQ YW18FIFA", &
"<YW18FIFA> KA1ABC", &
"KA1ABC <YW18FIFA> -11", &
"<YW18FIFA> KA1ABC R-17", &
"<KA1ABC> YW18FIFA RR73", &
"<YW18FIFA> KA1ABC 73", &
"123456789ABCDEF012", &
"<KA1ABC WB9XYZ> -03", &
"<KA1ABC WB9XYZ> R+03", &
"<KA1ABC WB9XYZ> RRR", &
"<KA1ABC WB9XYZ> 73"/

View File

@ -3,11 +3,11 @@ program msk144code
! Provides examples of message packing, bit and symbol ordering, ! Provides examples of message packing, bit and symbol ordering,
! LDPC encoding, and other necessary details of the MSK144 protocol. ! LDPC encoding, and other necessary details of the MSK144 protocol.
use packjt use packjt77
character msg*37,msgsent*37,decoded,bad*1,msgtype*13 character*77 c77
character msg*37,msgsent*37,decoded,bad*1,msgtype*16
integer*4 i4tone(144) integer*4 i4tone(144)
logical*1 bcontest include 'msk144_testmsg.f90'
include 'testmsg.f90'
nargs=iargc() nargs=iargc()
if(nargs.ne.1) then if(nargs.ne.1) then
@ -24,44 +24,57 @@ program msk144code
call getarg(1,msg) call getarg(1,msg)
nmsg=1 nmsg=1
if(msg(1:2).eq."-t") then if(msg(1:2).eq."-t") then
testmsg(NTEST+1)="<KA1ABC WB9XYZ> -03" nmsg=NTEST
testmsg(NTEST+2)="<KA1ABC WB9XYZ> R+03"
testmsg(NTEST+3)="<KA1ABC WB9XYZ> RRR"
testmsg(NTEST+4)="<KA1ABC WB9XYZ> 73"
testmsg(NTEST+5)="KA1ABC WB9XYZ R EN37"
nmsg=NTEST+5
endif endif
write(*,1010) write(*,1010)
1010 format(" Message Decoded Err? Type"/ & 1010 format(4x,"Message",31x,"Decoded",29x,"Err i3.n3"/100("-"))
74("-"))
do imsg=1,nmsg do imsg=1,nmsg
if(nmsg.gt.1) msg=testmsg(imsg) if(nmsg.gt.1) msg=testmsg(imsg)
call fmtmsg(msg,iz) !To upper case, collapse multiple blanks call fmtmsg(msg,iz) !To upper case, collapse multiple blanks
i1=len(trim(msg))-5 call genmsk_128_90(msg,ichk,msgsent,i4tone,itype)
bcontest=.false. i3=-1
if(msg(i1:i1+1).eq.'R ') bcontest=.true. n3=-1
ichk=0 call pack77(msg,i3,n3,c77)
call genmsk_128_90(msg,ichk,bcontest,msgsent,i4tone,itype)
msgtype="" msgtype=""
if(itype.eq.1) msgtype="Std Msg" if(i3.eq.0) then
if(itype.eq.2) msgtype="Type 1 prefix" if(n3.eq.0) msgtype="Free text"
if(itype.eq.3) msgtype="Type 1 suffix" if(n3.eq.1) msgtype="DXpedition mode"
if(itype.eq.4) msgtype="Type 2 prefix" if(n3.eq.2) msgtype="EU VHF Contest"
if(itype.eq.5) msgtype="Type 2 suffix" if(n3.eq.3) msgtype="ARRL Field Day"
if(itype.eq.6) msgtype="Free text" if(n3.eq.4) msgtype="ARRL Field Day"
if(itype.eq.7) msgtype="Hashed calls" if(n3.eq.5) msgtype="Telemetry"
if(n3.ge.6) msgtype="Undefined type"
endif
if(i3.eq.1) msgtype="Standard msg"
if(i3.eq.2) msgtype="EU VHF Contest"
if(i3.eq.3) msgtype="ARRL RTTY Roundup"
if(i3.eq.4) msgtype="Nonstandard calls"
if(i3.ge.5) msgtype="Undefined msg type"
if(i3.ge.1) n3=-1
if(i4tone(41).lt.0) then
msgtype="Sh msg"
i3=-1
endif
bad=" " bad=" "
if(msgsent.ne.msg) bad="*" if(msg.ne.msgsent) bad="*"
write(*,1020) imsg,msg,msgsent,bad,itype,msgtype if(i3.eq.0.and.n3.ge.0) then
1020 format(i2,'.',2x,a37,2x,a37,3x,a1,i3,": ",a13) write(*,1020) imsg,msg,msgsent,bad,i3,n3,msgtype
1020 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',i1,1x,a16)
elseif(i3.ge.1) then
write(*,1022) imsg,msg,msgsent,bad,i3,msgtype
1022 format(i2,'.',1x,a37,1x,a37,1x,a1,2x,i1,'.',1x,1x,a16)
elseif(i3.lt.0) then
write(*,1024) imsg,msg,msgsent,bad,msgtype
1024 format(i2,'.',1x,a37,1x,a37,1x,a1,6x,a16)
endif
enddo enddo
if(nmsg.eq.1) then if(nmsg.eq.1) then
n=144 n=144
if(msg(1:1).eq."<") n=40 if(i4tone(41).lt.0) n=40
write(*,1030) i4tone(1:n) write(*,1030) i4tone(1:n)
1030 format(/'Channel symbols'/(72i1)) 1030 format(/'Channel symbols'/(72i1))
endif endif

View File

@ -1,4 +1,4 @@
program msk144d2 program msk144d
! Test the msk144 decoder for WSJT-X ! Test the msk144 decoder for WSJT-X
@ -17,7 +17,6 @@ program msk144d2
logical :: display_help=.false. logical :: display_help=.false.
logical*1 bShMsgs logical*1 bShMsgs
logical*1 bcontest
logical*1 btrain logical*1 btrain
logical*1 bswl logical*1 bswl
@ -47,7 +46,6 @@ program msk144d2
mygrid='EN50WC' mygrid='EN50WC'
hiscall='' hiscall=''
bShMsgs=.false. bShMsgs=.false.
bcontest=.false.
btrain=.false. btrain=.false.
bswl=.false. bswl=.false.
datadir='.' datadir='.'
@ -116,7 +114,7 @@ program msk144d2
tt=sum(float(abs(id2(i:i+7*512-1)))) tt=sum(float(abs(id2(i:i+7*512-1))))
if( tt .ne. 0.0 ) then if( tt .ne. 0.0 ) then
call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall,bShMsgs, & call mskrtd(ichunk,nutc,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall,bShMsgs, &
bcontest,btrain,pcoeffs,bswl,datadir,line) btrain,pcoeffs,bswl,datadir,line)
if( index(line,"&") .ne. 0 .or. & if( index(line,"&") .ne. 0 .or. &
index(line,"^") .ne. 0 .or. & index(line,"^") .ne. 0 .or. &
index(line,"!") .ne. 0 .or. & index(line,"!") .ne. 0 .or. &
@ -135,4 +133,4 @@ program msk144d2
print*,infile print*,infile
999 continue 999 continue
end program msk144d2 end program msk144d

View File

@ -22,7 +22,6 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
integer msgbits(144) integer msgbits(144)
integer values(8) integer values(8)
logical*1 bcontest
logical*1 btrain logical*1 btrain
logical*1 first logical*1 first
logical*1 currently_training logical*1 currently_training
@ -91,7 +90,6 @@ subroutine msk144signalquality(cframe,snr,freq,t0,softbits,msg,dxcall, &
! generate tones from decoded message ! generate tones from decoded message
ichk=0 ichk=0
bcontest=.false.
call genmsk_128_90(msg,ichk,msgsent,i4tone,itype) call genmsk_128_90(msg,ichk,msgsent,i4tone,itype)
! reconstruct message bits from tones ! reconstruct message bits from tones

View File

@ -41,8 +41,12 @@ program msk144sim
write(*,*) 'Requested message: ',msg write(*,*) 'Requested message: ',msg
write(*,*) 'Message sent : ',msgsent write(*,*) 'Message sent : ',msgsent
write(*,*) 'Tones: ' write(*,*) 'Tones: '
if(itone(41).ge.0) then
write(*,'(1x,72i1)') itone(1:72) write(*,'(1x,72i1)') itone(1:72)
write(*,'(1x,72i1)') itone(73:144) write(*,'(1x,72i1)') itone(73:144)
else
write(*,'(1x,40i1)') itone(1:40)
endif
twopi=8.d0*atan(1.d0) twopi=8.d0*atan(1.d0)
nsym=144 nsym=144

View File

@ -123,9 +123,11 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
np=8*NSPM np=8*NSPM
call msk144spd(cdat,np,ntol,ndecodesuccess,msgreceived,fc,fest,tdec,navg,ct, & call msk144spd(cdat,np,ntol,ndecodesuccess,msgreceived,fc,fest,tdec,navg,ct, &
softbits) softbits)
bshdecode=.false.
if(ndecodesuccess.eq.0 .and. (bshmsg.or.bswl)) then if(ndecodesuccess.eq.0 .and. (bshmsg.or.bswl)) then
call msk40spd(cdat,np,ntol,mycall,hiscall,bswl,nhasharray, & call msk40spd(cdat,np,ntol,mycall,hiscall,bswl,nhasharray, &
ndecodesuccess,msgreceived,fc,fest,tdec,navg) ndecodesuccess,msgreceived,fc,fest,tdec,navg)
if(ndecodesuccess .ge.1) bshdecode=.true.
endif endif
if( ndecodesuccess .ge. 1 ) then if( ndecodesuccess .ge. 1 ) then
tdec=tsec+tdec tdec=tsec+tdec
@ -187,14 +189,6 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
endif endif
nsnr=nint(snr0) nsnr=nint(snr0)
bshdecode=.false.
if( msgreceived(1:1) .eq. '<' ) then
i2=index(msgreceived,'>')
i1=0
if(i2.gt.0) i1=index(msgreceived(1:i2),' ')
if(i1.gt.0) bshdecode=.true.
endif
if(.not. bshdecode) then if(.not. bshdecode) then
call msk144signalquality(ct,snr0,fest,tdec,softbits,msgreceived,hiscall, & call msk144signalquality(ct,snr0,fest,tdec,softbits,msgreceived,hiscall, &
btrain,datadir,ncorrected,eyeopening,pcoeffs) btrain,datadir,ncorrected,eyeopening,pcoeffs)
@ -221,15 +215,6 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
endif endif
write(line,1021) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived,char(0) write(line,1021) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived,char(0)
1021 format(i6.6,i4,f5.1,i5,a4,a37,a1) 1021 format(i6.6,i4,f5.1,i5,a4,a37,a1)
! if( .not.bshdecode ) then
! write(line,1020) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived(1:22), &
! navg,ncorrected,eyeopening,char(0)
!1020 format(i6.6,i4,f5.1,i5,a4,a22,i2,i3,f5.1,a1)
! else
! write(line,1022) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived(1:22), &
! navg,char(0)
!1022 format(i6.6,i4,f5.1,i5,a4,a22,i2,a1)
! endif
elseif(bswl .and. ndecodesuccess.ge.2) then elseif(bswl .and. ndecodesuccess.ge.2) then
seenb4=.false. seenb4=.false.
do i=1,nshmem do i=1,nshmem
@ -245,8 +230,6 @@ subroutine mskrtd(id2,nutc0,tsec,ntol,nrxfreq,ndepth,mycall,mygrid,hiscall, &
msglastswl=msgreceived msglastswl=msgreceived
nsnrlastswl=nsnr nsnrlastswl=nsnr
write(line,1021) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived,char(0) write(line,1021) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived,char(0)
! write(line,1022) nutc0,nsnr,tdec,nint(fest),decsym,msgreceived, &
! navg,char(0)
endif endif
endif endif
999 tsec0=tsec 999 tsec0=tsec

View File

@ -82,8 +82,6 @@ extern "C" {
void genft8_(char* msg, int* i3, int* n3, int* isync, char* msgsent, void genft8_(char* msg, int* i3, int* n3, int* isync, char* msgsent,
char ft8msgbits[], int itone[], fortran_charlen_t, fortran_charlen_t); char ft8msgbits[], int itone[], fortran_charlen_t, fortran_charlen_t);
void parse77_(char* msg, int* i3, int* n3, fortran_charlen_t);
void gen4_(char* msg, int* ichk, char* msgsent, int itone[], void gen4_(char* msg, int* ichk, char* msgsent, int itone[],
int* itext, fortran_charlen_t, fortran_charlen_t); int* itext, fortran_charlen_t, fortran_charlen_t);
@ -1811,9 +1809,6 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
} }
break; break;
case Qt::Key_Escape:
on_stopTxButton_clicked();
return;
case Qt::Key_F1: case Qt::Key_F1:
on_actionOnline_User_Guide_triggered(); on_actionOnline_User_Guide_triggered();
return; return;
@ -1867,11 +1862,13 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
} }
} }
return; return;
case Qt::Key_A: case Qt::Key_Escape:
if(e->modifiers() & Qt::ControlModifier) { m_nextCall="";
ui->labNextCall->setStyleSheet("");
ui->labNextCall->setText("");
on_stopTxButton_clicked();
abortQSO(); abortQSO();
return; return;
}
case Qt::Key_X: case Qt::Key_X:
if(e->modifiers() & Qt::AltModifier) { if(e->modifiers() & Qt::AltModifier) {
foxTest(); foxTest();
@ -2746,7 +2743,7 @@ void MainWindow::decode() //decode()
dec_data.params.nexp_decode=m_nContest; dec_data.params.nexp_decode=m_nContest;
if(m_config.single_decode()) dec_data.params.nexp_decode += 32; if(m_config.single_decode()) dec_data.params.nexp_decode += 32;
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64; if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
dec_data.params.ldecode77 = m_config.bDecode77(); dec_data.params.ldecode77 = true;
strncpy(dec_data.params.datetime, m_dateTime.toLatin1(), 20); strncpy(dec_data.params.datetime, m_dateTime.toLatin1(), 20);
strncpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(),12); strncpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(),12);
@ -3536,24 +3533,8 @@ void MainWindow::guiUpdate()
if(m_config.bFox() and ui->tabWidget->currentIndex()==2) { if(m_config.bFox() and ui->tabWidget->currentIndex()==2) {
foxTxSequencer(); foxTxSequencer();
} else { } else {
parse77_(message, &m_i3, &m_n3, 37); m_isync=2;
int ichk=1,itype=-1; m_i3=0;
gen65_(message,&ichk,msgsent,const_cast<int *>(itone0),&itype,22,22);
/*
* itype:
* 1 Std msg
* 2 Type 1 prefix
* 3 Type 1 suffix
* 4 Type 2 prefix
* 5 Type 2 suffix
* 6 Free Text
* 7 Hashed calls (MSK144 short format)
*/
m_isync=1;
if(!m_config.bGenerate77() and itype == 6 and (m_i3>0 or m_n3>0)) m_isync=2;
if(m_config.bGenerate77()) m_isync=2;
if(m_isync==1) m_i3=0;
char ft8msgbits[77]; char ft8msgbits[77];
genft8_(message, &m_i3, &m_n3, &m_isync, msgsent, genft8_(message, &m_i3, &m_n3, &m_isync, msgsent,
const_cast<char *> (ft8msgbits), const_cast<int *> (itone), 37, 37); const_cast<char *> (ft8msgbits), const_cast<int *> (itone), 37, 37);
@ -4743,22 +4724,18 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
bool bMyCall=stdCall(my_callsign); bool bMyCall=stdCall(my_callsign);
bool bHisCall=stdCall(hisCall); bool bHisCall=stdCall(hisCall);
bool b77=(m_mode=="MSK144" or m_mode=="FT8") and
(!bMyCall or !bHisCall or m_config.bGenerate77());
QString t0=hisBase + " " + m_baseCall + " "; QString t0=hisBase + " " + m_baseCall + " ";
QString t0s=hisCall + " " + my_callsign + " "; QString t0s=hisCall + " " + my_callsign + " ";
QString t0a,t0b; QString t0a,t0b;
if(b77) {
if(bHisCall and bMyCall) t0=hisCall + " " + my_callsign + " "; if(bHisCall and bMyCall) t0=hisCall + " " + my_callsign + " ";
t0a="<"+hisCall + "> " + my_callsign + " "; t0a="<"+hisCall + "> " + my_callsign + " ";
t0b=hisCall + " <" + my_callsign + "> "; t0b=hisCall + " <" + my_callsign + "> ";
}
QString t00=t0; QString t00=t0;
QString t {t0 + my_grid}; QString t {t0 + my_grid};
// if(b77 and (!bMyCall or !bHisCall)) t=t0a; if(!bMyCall) t=t0a;
if(b77 and (!bMyCall)) t=t0a;
msgtype(t, ui->tx1); msgtype(t, ui->tx1);
if (eme_short_codes) { if (eme_short_codes) {
t=t+" OOO"; t=t+" OOO";
@ -4780,9 +4757,14 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
rst.sprintf("5%1d9 ",nn); rst.sprintf("5%1d9 ",nn);
rs=rst.mid(0,2); rs=rst.mid(0,2);
t=t0; t=t0;
if(b77 and !bMyCall) t=t0b; if(!bMyCall) {
if(b77 and !bHisCall) t=t0a; t=t0b;
if(b77 and (t!=t0)) msgtype(t, ui->tx1); msgtype(t0a, ui->tx1);
}
if(!bHisCall) {
t=t0a;
msgtype(t0a, ui->tx1);
}
if(m_config.bNA_VHF_Contest()) sent=my_grid; if(m_config.bNA_VHF_Contest()) sent=my_grid;
if(m_config.bFieldDay()) sent=m_config.FieldDayExchange(); if(m_config.bFieldDay()) sent=m_config.FieldDayExchange();
if(m_config.bRTTYroundup()) { if(m_config.bRTTYroundup()) {
@ -4856,7 +4838,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
} }
} }
if(m_config.bGenerate77() or "MSK144" == m_mode) return; if(m_mode=="FT8" or m_mode=="MSK144") return;
if (is_compound) { if (is_compound) {
if (is_type_one) { if (is_type_one) {
@ -5113,7 +5095,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype()
int i0=t.trimmed().length()-7; int i0=t.trimmed().length()-7;
if(t.mid(i0,3)==" R ") text=false; if(t.mid(i0,3)==" R ") text=false;
} }
if(m_config.bGenerate77()) text=false; text=false;
//### ... to here ... //### ... to here ...
@ -5467,7 +5449,7 @@ void MainWindow::on_actionFT8_triggered()
if(!m_config.bFox() and !m_config.bHound()) { if(!m_config.bFox() and !m_config.bHound()) {
QString t0=""; QString t0="";
if(m_config.bGenerate77()) t0=" Tx2.0 "; t0=" Tx2.0 ";
if(m_config.bNA_VHF_Contest()) t0+="NA VHF"; if(m_config.bNA_VHF_Contest()) t0+="NA VHF";
if(m_config.bEU_VHF_Contest()) t0+="EU VHF"; if(m_config.bEU_VHF_Contest()) t0+="EU VHF";
if(m_config.bFieldDay()) t0+="Field Day"; if(m_config.bFieldDay()) t0+="Field Day";

View File

@ -1,5 +1,5 @@
<table cellspacing=1> <table cellspacing=1>
<tr><td><b>Esc </b></td><td>Stop transmitting</td></tr> <tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr>
<tr><td><b>F1 </b></td><td>Online User's Guide</td></tr> <tr><td><b>F1 </b></td><td>Online User's Guide</td></tr>
<tr><td><b>Shift+F1 </b></td><td>Copyright Notice</td></tr> <tr><td><b>Shift+F1 </b></td><td>Copyright Notice</td></tr>
<tr><td><b>Ctrl+F1 </b></td><td>About WSJT-X</td></tr> <tr><td><b>Ctrl+F1 </b></td><td>About WSJT-X</td></tr>