mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-27 06:38:44 -05:00
Improved, simplified sort routine; faster and better "flatten"
procedure; better window functions for some FFTs, resulting in better decoder performance; User-selectable colors for backgrounds of decoded messages. NB: more testing is desirable! git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4951 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
d8075a758e
commit
d91aed5aee
@ -291,7 +291,7 @@ set (wsjt_FSRCS
|
||||
lib/fillcom.f90
|
||||
lib/flat1.f90
|
||||
lib/flat2.f90
|
||||
lib/flat3.f90
|
||||
lib/flat4.f90
|
||||
lib/flat65.f90
|
||||
lib/four2a.f90
|
||||
lib/fmtmsg.f90
|
||||
@ -335,7 +335,6 @@ set (wsjt_FSRCS
|
||||
lib/smo121.f90
|
||||
lib/softsym.f90
|
||||
lib/sort.f90
|
||||
lib/ssort.f90
|
||||
lib/stdmsg.f90
|
||||
lib/sun.f90
|
||||
lib/symspec.f90
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <QStandardPaths>
|
||||
#include <QFont>
|
||||
#include <QFontDialog>
|
||||
#include <QColorDialog>
|
||||
#include <QDebug>
|
||||
|
||||
#include "ui_Configuration.h"
|
||||
@ -251,6 +252,7 @@ public:
|
||||
Q_SLOT void reject () override;
|
||||
Q_SLOT void done (int) override;
|
||||
|
||||
|
||||
private:
|
||||
typedef QList<QAudioDeviceInfo> AudioDevices;
|
||||
|
||||
@ -272,59 +274,41 @@ private:
|
||||
|
||||
Q_SLOT void on_font_push_button_clicked ();
|
||||
Q_SLOT void on_decoded_text_font_push_button_clicked ();
|
||||
|
||||
Q_SLOT void on_PTT_port_combo_box_activated (int);
|
||||
|
||||
Q_SLOT void on_CAT_port_combo_box_activated (int);
|
||||
|
||||
Q_SLOT void on_CAT_serial_baud_combo_box_currentIndexChanged (int);
|
||||
|
||||
Q_SLOT void on_CAT_data_bits_button_group_buttonClicked (int);
|
||||
|
||||
Q_SLOT void on_CAT_stop_bits_button_group_buttonClicked (int);
|
||||
|
||||
Q_SLOT void on_CAT_handshake_button_group_buttonClicked (int);
|
||||
|
||||
Q_SLOT void on_CAT_poll_interval_spin_box_valueChanged (int);
|
||||
|
||||
Q_SLOT void on_split_mode_button_group_buttonClicked (int);
|
||||
|
||||
Q_SLOT void on_test_CAT_push_button_clicked ();
|
||||
|
||||
Q_SLOT void on_test_PTT_push_button_clicked ();
|
||||
|
||||
Q_SLOT void on_CAT_DTR_check_box_toggled (bool);
|
||||
|
||||
Q_SLOT void on_CAT_RTS_check_box_toggled (bool);
|
||||
|
||||
Q_SLOT void on_rig_combo_box_currentIndexChanged (int);
|
||||
|
||||
Q_SLOT void on_sound_input_combo_box_currentTextChanged (QString const&);
|
||||
Q_SLOT void on_sound_output_combo_box_currentTextChanged (QString const&);
|
||||
|
||||
Q_SLOT void on_add_macro_push_button_clicked (bool = false);
|
||||
Q_SLOT void on_delete_macro_push_button_clicked (bool = false);
|
||||
|
||||
Q_SLOT void on_PTT_method_button_group_buttonClicked (int);
|
||||
|
||||
Q_SLOT void on_callsign_line_edit_editingFinished ();
|
||||
|
||||
Q_SLOT void on_grid_line_edit_editingFinished ();
|
||||
|
||||
Q_SLOT void on_add_macro_line_edit_editingFinished ();
|
||||
Q_SLOT void delete_macro ();
|
||||
void delete_selected_macros (QModelIndexList);
|
||||
|
||||
Q_SLOT void on_save_path_select_push_button_clicked (bool);
|
||||
|
||||
Q_SLOT void delete_frequencies ();
|
||||
Q_SLOT void insert_frequency ();
|
||||
|
||||
Q_SLOT void delete_stations ();
|
||||
Q_SLOT void insert_station ();
|
||||
|
||||
Q_SLOT void handle_transceiver_update (TransceiverState);
|
||||
Q_SLOT void handle_transceiver_failure (QString reason);
|
||||
Q_SLOT void on_pbCQmsg_clicked();
|
||||
Q_SLOT void on_pbMyCall_clicked();
|
||||
Q_SLOT void on_pbTxMsg_clicked();
|
||||
Q_SLOT void on_pbNewDXCC_clicked();
|
||||
Q_SLOT void on_pbNewCall_clicked();
|
||||
|
||||
// typenames used as arguments must match registered type names :(
|
||||
Q_SIGNAL void stop_transceiver () const;
|
||||
@ -409,6 +393,11 @@ private:
|
||||
// configuration fields that we publish
|
||||
QString my_callsign_;
|
||||
QString my_grid_;
|
||||
QColor color_CQ_;
|
||||
QColor color_MyCall_;
|
||||
QColor color_TxMsg_;
|
||||
QColor color_DXCC_;
|
||||
QColor color_NewCall_;
|
||||
qint32 id_interval_;
|
||||
bool id_after_73_;
|
||||
bool tx_QSY_allowed_;
|
||||
@ -466,6 +455,11 @@ float Configuration::jt9w_min_dt () const {return m_->jt9w_min_dt_;}
|
||||
float Configuration::jt9w_max_dt () const {return m_->jt9w_max_dt_;}
|
||||
QString Configuration::my_callsign () const {return m_->my_callsign_;}
|
||||
QString Configuration::my_grid () const {return m_->my_grid_;}
|
||||
QColor Configuration::color_CQ () const {return m_->color_CQ_;}
|
||||
QColor Configuration::color_MyCall () const {return m_->color_MyCall_;}
|
||||
QColor Configuration::color_TxMsg () const {return m_->color_TxMsg_;}
|
||||
QColor Configuration::color_DXCC () const {return m_->color_DXCC_;}
|
||||
QColor Configuration::color_NewCall () const {return m_->color_NewCall_;}
|
||||
QFont Configuration::decoded_text_font () const {return m_->decoded_text_font_;}
|
||||
qint32 Configuration::id_interval () const {return m_->id_interval_;}
|
||||
bool Configuration::id_after_73 () const {return m_->id_after_73_;}
|
||||
@ -872,6 +866,11 @@ void Configuration::impl::initialise_models ()
|
||||
ui_->grid_line_edit->setPalette (pal);
|
||||
ui_->callsign_line_edit->setText (my_callsign_);
|
||||
ui_->grid_line_edit->setText (my_grid_);
|
||||
ui_->labCQ->setStyleSheet(QString("background: %1").arg(color_CQ_.name()));
|
||||
ui_->labMyCall->setStyleSheet(QString("background: %1").arg(color_MyCall_.name()));
|
||||
ui_->labTx->setStyleSheet(QString("background: %1").arg(color_TxMsg_.name()));
|
||||
ui_->labDXCC->setStyleSheet(QString("background: %1").arg(color_DXCC_.name()));
|
||||
ui_->labNewCall->setStyleSheet(QString("background: %1").arg(color_NewCall_.name()));
|
||||
font_changed_ = false;
|
||||
decoded_text_font_changed_ = false;
|
||||
ui_->CW_id_interval_spin_box->setValue (id_interval_);
|
||||
@ -945,6 +944,11 @@ void Configuration::impl::read_settings ()
|
||||
|
||||
my_callsign_ = settings_->value ("MyCall", "").toString ();
|
||||
my_grid_ = settings_->value ("MyGrid", "").toString ();
|
||||
color_CQ_ = settings_->value("colorCQ","#66ff66").toString();
|
||||
color_MyCall_ = settings_->value("colorMyCall","#ff6666").toString();
|
||||
color_TxMsg_ = settings_->value("colorTxMsg","#ffff00").toString();
|
||||
color_DXCC_ = settings_->value("colorDXCC","#ff00ff").toString();
|
||||
color_NewCall_ = settings_->value("colorNewCall","#ffaaff").toString();
|
||||
|
||||
if (next_font_.fromString (settings_->value ("Font", QGuiApplication::font ().toString ()).toString ())
|
||||
&& next_font_ != QGuiApplication::font ())
|
||||
@ -1073,12 +1077,14 @@ void Configuration::impl::write_settings ()
|
||||
|
||||
settings_->setValue ("MyCall", my_callsign_);
|
||||
settings_->setValue ("MyGrid", my_grid_);
|
||||
|
||||
settings_->setValue("colorCQ",color_CQ_);
|
||||
settings_->setValue("colorMyCall",color_MyCall_);
|
||||
settings_->setValue("colorTxMsg",color_TxMsg_);
|
||||
settings_->setValue("colorDXCC",color_DXCC_);
|
||||
settings_->setValue("colorNewCall",color_NewCall_);
|
||||
settings_->setValue ("Font", font_.toString ());
|
||||
settings_->setValue ("DecodedTextFont", decoded_text_font_.toString ());
|
||||
|
||||
settings_->setValue ("IDint", id_interval_);
|
||||
|
||||
settings_->setValue ("PTTMethod", QVariant::fromValue (rig_params_.PTT_method_));
|
||||
settings_->setValue ("PTTport", rig_params_.PTT_port_);
|
||||
settings_->setValue ("SaveDir", save_directory_.absolutePath ());
|
||||
@ -1531,6 +1537,39 @@ void Configuration::impl::on_font_push_button_clicked ()
|
||||
next_font_ = QFontDialog::getFont (&font_changed_, this);
|
||||
}
|
||||
|
||||
void Configuration::impl::on_pbCQmsg_clicked()
|
||||
{
|
||||
color_CQ_ = QColorDialog::getColor("#6666ff");
|
||||
ui_->labCQ->setStyleSheet(QString("background: %1").arg(color_CQ_.name()));
|
||||
}
|
||||
|
||||
void Configuration::impl::on_pbMyCall_clicked()
|
||||
{
|
||||
color_MyCall_ = QColorDialog::getColor("#ff6666");
|
||||
ui_->labMyCall->setStyleSheet(QString("background: %1").arg(color_MyCall_.name()));
|
||||
}
|
||||
|
||||
void Configuration::impl::on_pbTxMsg_clicked()
|
||||
{
|
||||
color_TxMsg_ = QColorDialog::getColor("#ffff00");
|
||||
ui_->labTx->setStyleSheet(QString("background: %1").arg(color_TxMsg_.name()));
|
||||
}
|
||||
|
||||
void Configuration::impl::on_pbNewDXCC_clicked()
|
||||
{
|
||||
color_DXCC_ = QColorDialog::getColor("#ff00ff");
|
||||
ui_->labDXCC->setStyleSheet(QString("background: %1").arg(color_DXCC_.name()));
|
||||
}
|
||||
|
||||
void Configuration::impl::on_pbNewCall_clicked()
|
||||
{
|
||||
color_NewCall_ = QColorDialog::getColor("#ffaaff");
|
||||
ui_->labNewCall->setStyleSheet(QString("background: %1").arg(color_NewCall_.name()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void Configuration::impl::on_decoded_text_font_push_button_clicked ()
|
||||
{
|
||||
next_decoded_text_font_ = QFontDialog::getFont (&decoded_text_font_changed_
|
||||
|
@ -110,6 +110,11 @@ public:
|
||||
unsigned jt9w_bw_mult () const;
|
||||
float jt9w_min_dt () const;
|
||||
float jt9w_max_dt () const;
|
||||
QColor color_CQ () const;
|
||||
QColor color_MyCall () const;
|
||||
QColor color_TxMsg () const;
|
||||
QColor color_DXCC () const;
|
||||
QColor color_NewCall () const;
|
||||
|
||||
// This method queries if a CAT and PTT connection is operational,
|
||||
//
|
||||
|
189
Configuration.ui
189
Configuration.ui
@ -22,6 +22,12 @@
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="configuration_tabs">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Select tab to change configuration parameters.</string>
|
||||
</property>
|
||||
@ -1682,6 +1688,183 @@ Right click for insert and delete options.</string>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Colors</string>
|
||||
</attribute>
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>44</x>
|
||||
<y>60</y>
|
||||
<width>198</width>
|
||||
<height>141</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_13">
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="pbCQmsg">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>110</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>CQ in message</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="labCQ">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel{background-color: #66ff66}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>K1ABC</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="pbMyCall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>110</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>My Call in message</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="labMyCall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel{background-color: #ff6666}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>K1ABC</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="pbTxMsg">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>110</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Transmitted message</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="labTx">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel{background-color: yellow}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>K1ABC</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="pbNewDXCC">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>110</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>New DXCC</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="labDXCC">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel{background-color: #ff66ff}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>K1ABC</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QPushButton" name="pbNewCall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>110</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>New Call</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="labNewCall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QLabel{background-color: #66ffff}</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>K1ABC</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -1834,12 +2017,12 @@ soundcard changes</string>
|
||||
</connection>
|
||||
</connections>
|
||||
<buttongroups>
|
||||
<buttongroup name="TX_mode_button_group"/>
|
||||
<buttongroup name="CAT_stop_bits_button_group"/>
|
||||
<buttongroup name="split_mode_button_group"/>
|
||||
<buttongroup name="CAT_data_bits_button_group"/>
|
||||
<buttongroup name="CAT_handshake_button_group"/>
|
||||
<buttongroup name="PTT_method_button_group"/>
|
||||
<buttongroup name="TX_mode_button_group"/>
|
||||
<buttongroup name="TX_audio_source_button_group"/>
|
||||
<buttongroup name="split_mode_button_group"/>
|
||||
<buttongroup name="PTT_method_button_group"/>
|
||||
</buttongroups>
|
||||
</ui>
|
||||
|
@ -59,7 +59,10 @@ void DisplayText::_insertText(const QString text, const QString bg)
|
||||
}
|
||||
|
||||
|
||||
void DisplayText::_appendDXCCWorkedB4(/*mod*/DecodedText& t1, QString& bg, /*uses*/LogBook logBook)
|
||||
void DisplayText::_appendDXCCWorkedB4(DecodedText& t1, QString& bg,
|
||||
LogBook logBook, QColor color_CQ,
|
||||
QColor color_DXCC,
|
||||
QColor color_NewCall)
|
||||
{
|
||||
// extract the CQer's call TODO: does this work with all call formats? What about 'CQ DX'?
|
||||
int s1 = 4 + t1.indexOf(" CQ ");
|
||||
@ -86,18 +89,18 @@ void DisplayText::_appendDXCCWorkedB4(/*mod*/DecodedText& t1, QString& bg, /*use
|
||||
if (!countryWorkedBefore) // therefore not worked call either
|
||||
{
|
||||
t1 += "!";
|
||||
bg = "#66ff66"; // strong green
|
||||
bg=color_DXCC.name();
|
||||
}
|
||||
else
|
||||
if (!callWorkedBefore) // but have worked the country
|
||||
{
|
||||
t1 += "~";
|
||||
bg = "#76cd76"; // mid green
|
||||
bg=color_NewCall.name();
|
||||
}
|
||||
else
|
||||
{
|
||||
t1 += " "; // have worked this call before
|
||||
bg="#9cc79c"; // pale green
|
||||
bg=color_CQ.name();
|
||||
}
|
||||
charsAvail -= 1;
|
||||
|
||||
@ -107,29 +110,34 @@ void DisplayText::_appendDXCCWorkedB4(/*mod*/DecodedText& t1, QString& bg, /*use
|
||||
}
|
||||
}
|
||||
|
||||
void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall, bool displayDXCCEntity, LogBook logBook)
|
||||
void DisplayText::displayDecodedText(DecodedText decodedText, QString myCall,
|
||||
bool displayDXCCEntity, LogBook logBook,
|
||||
QColor color_CQ, QColor color_MyCall,
|
||||
QColor color_DXCC, QColor color_NewCall)
|
||||
{
|
||||
QString bg="white";
|
||||
bool CQcall = false;
|
||||
if (decodedText.indexOf(" CQ ") > 0)
|
||||
{
|
||||
CQcall = true;
|
||||
bg="#66ff66"; //green
|
||||
bg=color_CQ.name();
|
||||
}
|
||||
if (myCall != "" and decodedText.indexOf(" " + myCall + " ") > 0)
|
||||
bg="#ff6666"; //red
|
||||
bg=color_MyCall.name();
|
||||
|
||||
// if enabled add the DXCC entity and B4 status to the end of the preformated text line t1
|
||||
if (displayDXCCEntity && CQcall)
|
||||
_appendDXCCWorkedB4(/*mod*/decodedText,bg,logBook);
|
||||
_appendDXCCWorkedB4(/*mod*/decodedText,bg,logBook,color_CQ,
|
||||
color_DXCC,color_NewCall);
|
||||
|
||||
_insertText(decodedText.string(),bg);
|
||||
}
|
||||
|
||||
|
||||
void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq)
|
||||
void DisplayText::displayTransmittedText(QString text, QString modeTx, qint32 txFreq,
|
||||
QColor color_TxMsg)
|
||||
{
|
||||
QString bg="yellow";
|
||||
QString bg=color_TxMsg.name();
|
||||
QString t1=" @ ";
|
||||
if(modeTx=="JT65") t1=" # ";
|
||||
QString t2;
|
||||
|
@ -16,8 +16,11 @@ public:
|
||||
void setFont(QFont const& font);
|
||||
|
||||
void insertLineSpacer();
|
||||
void displayDecodedText(DecodedText decodedText, QString myCall, bool displayDXCCEntity, LogBook logBook);
|
||||
void displayTransmittedText(QString text, QString modeTx, qint32 txFreq);
|
||||
void displayDecodedText(DecodedText decodedText, QString myCall, bool displayDXCCEntity,
|
||||
LogBook logBook, QColor color_CQ, QColor color_MyCall,
|
||||
QColor color_DXCC, QColor color_NewCall);
|
||||
void displayTransmittedText(QString text, QString modeTx, qint32 txFreq,
|
||||
QColor color_TxMsg);
|
||||
|
||||
signals:
|
||||
void selectCallsign(bool shift, bool ctrl);
|
||||
@ -33,7 +36,8 @@ private:
|
||||
int _fontWidth;
|
||||
int _maxDisplayedCharacters;
|
||||
void _insertText(const QString text, const QString bg);
|
||||
void _appendDXCCWorkedB4(/*mod*/DecodedText& t1, QString &bg, LogBook logBook);
|
||||
void _appendDXCCWorkedB4(/*mod*/DecodedText& t1, QString &bg, LogBook logBook,
|
||||
QColor color_CQ, QColor color_DXCC, QColor color_NewCall);
|
||||
|
||||
};
|
||||
|
||||
|
@ -30,7 +30,7 @@ CFLAGS = -I. -DWIN32
|
||||
|
||||
all: libjt9.a libastro.a jt9.exe jt9code.exe jt65code.exe jt9sim.exe
|
||||
|
||||
OBJS1 = pctile.o graycode.o sort.o ssort.o chkmsg.o \
|
||||
OBJS1 = pctile.o graycode.o sort.o chkmsg.o \
|
||||
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
|
||||
grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
|
||||
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
|
||||
@ -47,7 +47,7 @@ OBJS1 = pctile.o graycode.o sort.o ssort.o chkmsg.o \
|
||||
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
|
||||
move.o indexx.o graycode65.o twkfreq65.o smo121.o \
|
||||
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
|
||||
flat3.o polfit.o determ.o baddata.o prog_args.o \
|
||||
flat4.o polfit.o determ.o baddata.o prog_args.o \
|
||||
options.o fmtmsg.o decjt9.o
|
||||
|
||||
libjt9.a: $(OBJS1)
|
||||
|
@ -31,7 +31,7 @@ all: libjt9.a jt9sim jt9 jt9code jt65code
|
||||
|
||||
OBJS1 = astrosub.o astro0.o astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \
|
||||
fmtmsg.o geocentric.o moon2.o toxyz.o dot.o dcoord.o \
|
||||
prog_args.o options.o pctile.o graycode.o sort.o ssort.o chkmsg.o \
|
||||
prog_args.o options.o pctile.o graycode.o sort.o chkmsg.o \
|
||||
unpackmsg.o igray.o unpackcall.o unpackgrid.o \
|
||||
grid2k.o unpacktext.o getpfx2.o packmsg.o deg2grid.o \
|
||||
packtext.o getpfx1.o packcall.o k2grid.o packgrid.o \
|
||||
@ -49,7 +49,7 @@ OBJS1 = astrosub.o astro0.o astro.o tm2.o sun.o moondop.o coord.o tmoonsub.o \
|
||||
extract.o fchisq65.o demod64a.o chkhist.o interleave63.o ccf2.o \
|
||||
move.o indexx.o graycode65.o twkfreq65.o smo.o smo121.o \
|
||||
wrapkarn.o init_rs.o encode_rs.o decode_rs.o gen65.o fil4.o \
|
||||
flat3.o polfit.o determ.o baddata.o
|
||||
flat4.o polfit.o determ.o baddata.o
|
||||
|
||||
libjt9.a: $(OBJS1)
|
||||
$(AR) libjt9.a $(OBJS1)
|
||||
|
@ -1,74 +0,0 @@
|
||||
subroutine flat3(s0,iz,nfa,nfb,nterms,ynoise,s)
|
||||
|
||||
implicit real*8 (a-h,o-z)
|
||||
parameter (NSMAX=6827)
|
||||
real*4 s0(iz)
|
||||
real*4 s(iz)
|
||||
real*4 ynoise,y4,db
|
||||
|
||||
real*8 x(NSMAX)
|
||||
real*8 y(NSMAX)
|
||||
real*8 y0(NSMAX)
|
||||
real*8 yfit(NSMAX)
|
||||
real*8 a(10)
|
||||
integer ii(NSMAX)
|
||||
|
||||
npts0=999999
|
||||
df=12000.0/16384.0
|
||||
|
||||
do i=1,iz
|
||||
y0(i)=db(s0(i))
|
||||
enddo
|
||||
ia=(nfa+200.0)/df
|
||||
ib=5000.0/df
|
||||
if(nfb.gt.0) ib=nfb/df
|
||||
j=0
|
||||
do i=ia,ib
|
||||
j=j+1
|
||||
x(j)=i*df
|
||||
y(j)=y0(i)
|
||||
ii(j)=i
|
||||
enddo
|
||||
|
||||
npts=j
|
||||
mode=0
|
||||
a=0.0
|
||||
|
||||
do iter=1,99
|
||||
call polfit(x,y,y,npts,nterms,mode,a,chisqr)
|
||||
|
||||
do i=1,ib
|
||||
f=i*df
|
||||
yfit(i)=a(nterms)
|
||||
do n=nterms-1,1,-1
|
||||
yfit(i)=f*yfit(i) + a(n)
|
||||
enddo
|
||||
! write(21,1010) f,y0(i),yfit(i),y0(i)-yfit(i)
|
||||
!1010 format(4f12.3)
|
||||
enddo
|
||||
k=0
|
||||
do j=1,npts
|
||||
y1=y(j)-yfit(ii(j))
|
||||
if(y1.lt.ynoise) then
|
||||
! if(y1.lt.ynoise .and. y1.gt.-ynoise) then
|
||||
k=k+1
|
||||
x(k)=x(j)
|
||||
y(k)=y(j)
|
||||
ii(k)=ii(j)
|
||||
endif
|
||||
enddo
|
||||
npts=k
|
||||
if(npts.eq.npts0 .or. npts.lt.(ib-ia)/10) exit
|
||||
npts0=npts
|
||||
enddo
|
||||
|
||||
! do j=1,npts
|
||||
! write(22,1010) x(j),y(j),yfit(ii(j)),y(j)-yfit(ii(j))
|
||||
! enddo
|
||||
|
||||
do i=1,ib
|
||||
y4=y0(i)-yfit(i) - 10.0
|
||||
s(i)=10.0**(0.1*y4)
|
||||
enddo
|
||||
|
||||
end subroutine flat3
|
50
lib/flat4.f90
Normal file
50
lib/flat4.f90
Normal file
@ -0,0 +1,50 @@
|
||||
subroutine flat4(s,npts,nflatten)
|
||||
|
||||
! Flatten a spectrum for optimum display
|
||||
! Input: s(npts) Linear scale in power
|
||||
! nflatten If nflatten=0, convert to dB but do not flatten
|
||||
! Output: s(npts) Flattened, with dB scale
|
||||
|
||||
|
||||
implicit real*8 (a-h,o-z)
|
||||
real*4 s(6827)
|
||||
real*4 base
|
||||
real*8 x(1000),y(1000),a(5)
|
||||
data nseg/10/,npct/10/
|
||||
|
||||
if(s(1).gt.1.e29) go to 900 !Boundary between Rx intervals: do nothing
|
||||
do i=1,npts
|
||||
s(i)=10.0*log10(s(i)) !Convert to dB scale
|
||||
enddo
|
||||
if(nflatten.eq.0) go to 900
|
||||
|
||||
nlen=npts/nseg !Length of test segment
|
||||
i0=npts/2 !Midpoint
|
||||
k=0
|
||||
do n=2,nseg !Skip first segment, likely rolloff here
|
||||
ib=n*nlen
|
||||
ia=ib-nlen+1
|
||||
if(n.eq.nseg) ib=npts
|
||||
call pctile(s(ia),ib-ia+1,npct,base) !Find lowest npct of points in segment
|
||||
do i=ia,ib
|
||||
if(s(i).le.base) then
|
||||
k=k+1 !Save thesde "lower envelope" points
|
||||
x(k)=i-i0
|
||||
y(k)=s(i)
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
kz=k
|
||||
a=0.
|
||||
nterms=3
|
||||
|
||||
call polfit(x,y,y,kz,nterms,0,a,chisqr) !Fit a low-order polynomial
|
||||
|
||||
do i=1,npts
|
||||
t=i-i0
|
||||
yfit=a(1)+t*(a(2)+t*(a(3)+t*(a(4)+t*(a(5)))))
|
||||
s(i)=s(i)-yfit !Subtract the fitted baseline
|
||||
enddo
|
||||
|
||||
900 return
|
||||
end subroutine flat4
|
87
lib/sort.f90
87
lib/sort.f90
@ -1,4 +1,87 @@
|
||||
subroutine sort(n,arr)
|
||||
call ssort(arr,tmp,n,1)
|
||||
return
|
||||
|
||||
integer n,m,nstack
|
||||
real arr(n)
|
||||
parameter (m=7,nstack=50)
|
||||
integer i,ir,j,jstack,k,l,istack(nstack)
|
||||
real a,temp
|
||||
|
||||
jstack=0
|
||||
l=1
|
||||
ir=n
|
||||
|
||||
1 if(ir-l.lt.m) then
|
||||
do j=l+1,ir
|
||||
a=arr(j)
|
||||
do i=j-1,1,-1
|
||||
if(arr(i).le.a) goto 2
|
||||
arr(i+1)=arr(i)
|
||||
enddo
|
||||
i=0
|
||||
2 arr(i+1)=a
|
||||
enddo
|
||||
|
||||
if(jstack.eq.0) return
|
||||
|
||||
ir=istack(jstack)
|
||||
l=istack(jstack-1)
|
||||
jstack=jstack-2
|
||||
|
||||
else
|
||||
k=(l+ir)/2
|
||||
temp=arr(k)
|
||||
arr(k)=arr(l+1)
|
||||
arr(l+1)=temp
|
||||
|
||||
if(arr(l+1).gt.arr(ir)) then
|
||||
temp=arr(l+1)
|
||||
arr(l+1)=arr(ir)
|
||||
arr(ir)=temp
|
||||
endif
|
||||
|
||||
if(arr(l).gt.arr(ir)) then
|
||||
temp=arr(l)
|
||||
arr(l)=arr(ir)
|
||||
arr(ir)=temp
|
||||
endif
|
||||
|
||||
if(arr(l+1).gt.arr(l)) then
|
||||
temp=arr(l+1)
|
||||
arr(l+1)=arr(l)
|
||||
arr(l)=temp
|
||||
endif
|
||||
|
||||
i=l+1
|
||||
j=ir
|
||||
a=arr(l)
|
||||
3 i=i+1
|
||||
if(arr(i).lt.a) goto 3
|
||||
|
||||
4 j=j-1
|
||||
if(arr(j).gt.a) goto 4
|
||||
|
||||
if(j.lt.i) goto 5
|
||||
temp=arr(i)
|
||||
arr(i)=arr(j)
|
||||
arr(j)=temp
|
||||
goto 3
|
||||
|
||||
5 arr(l)=arr(j)
|
||||
arr(j)=a
|
||||
jstack=jstack+2
|
||||
if(jstack.gt.nstack) stop 'nstack too small in sort'
|
||||
|
||||
if(ir-i+1.ge.j-l) then
|
||||
istack(jstack)=ir
|
||||
istack(jstack-1)=i
|
||||
ir=j-1
|
||||
else
|
||||
istack(jstack)=j-1
|
||||
istack(jstack-1)=l
|
||||
l=i
|
||||
endif
|
||||
|
||||
endif
|
||||
goto 1
|
||||
|
||||
end subroutine sort
|
||||
|
264
lib/ssort.f90
264
lib/ssort.f90
@ -1,264 +0,0 @@
|
||||
subroutine ssort (x,y,n,kflag)
|
||||
! Sort an array and optionally make the same interchanges in
|
||||
! an auxiliary array. the array may be sorted in increasing
|
||||
! or decreasing order. a slightly modified quicksort
|
||||
! algorithm is used.
|
||||
|
||||
! ssort sorts array x and optionally makes the same interchanges in
|
||||
! array y. the array x may be sorted in increasing order or
|
||||
! decreasing order. a slightly modified quicksort algorithm is used.
|
||||
|
||||
! Description of parameters
|
||||
! x - array of values to be sorted
|
||||
! y - array to be (optionally) carried along
|
||||
! n - number of values in array x to be sorted
|
||||
! kflag - control parameter
|
||||
! = 2 means sort x in increasing order and carry y along.
|
||||
! = 1 means sort x in increasing order (ignoring y)
|
||||
! = -1 means sort x in decreasing order (ignoring y)
|
||||
! = -2 means sort x in decreasing order and carry y along.
|
||||
|
||||
integer kflag, n
|
||||
integer x(n), y(n)
|
||||
real r
|
||||
integer t, tt, tty, ty
|
||||
integer i, ij, j, k, kk, l, m, nn
|
||||
integer il(21), iu(21)
|
||||
|
||||
nn = n
|
||||
if (nn .lt. 1) then
|
||||
! print*,'ssort: The number of sort elements is not positive.'
|
||||
! print*,'ssort: n = ',nn,' kflag = ',kflag
|
||||
return
|
||||
endif
|
||||
|
||||
kk = abs(kflag)
|
||||
if (kk.ne.1 .and. kk.ne.2) then
|
||||
print *,'the sort control parameter, k, is not 2, 1, -1, or -2.'
|
||||
return
|
||||
endif
|
||||
|
||||
! Alter array x to get decreasing order if needed
|
||||
|
||||
if (kflag .le. -1) then
|
||||
do i=1,nn
|
||||
x(i) = -x(i)
|
||||
enddo
|
||||
endif
|
||||
|
||||
if (kk .eq. 2) go to 100
|
||||
|
||||
! Sort x only
|
||||
|
||||
m = 1
|
||||
i = 1
|
||||
j = nn
|
||||
r = 0.375e0
|
||||
|
||||
20 if (i .eq. j) go to 60
|
||||
if (r .le. 0.5898437e0) then
|
||||
r = r+3.90625e-2
|
||||
else
|
||||
r = r-0.21875e0
|
||||
endif
|
||||
|
||||
30 k = i
|
||||
|
||||
! Select a central element of the array and save it in location t
|
||||
|
||||
ij = i + int((j-i)*r)
|
||||
t = x(ij)
|
||||
|
||||
! If first element of array is greater than t, interchange with t
|
||||
|
||||
if (x(i) .gt. t) then
|
||||
x(ij) = x(i)
|
||||
x(i) = t
|
||||
t = x(ij)
|
||||
endif
|
||||
l = j
|
||||
|
||||
! If last element of array is less than than t, interchange with t
|
||||
if (x(j) .lt. t) then
|
||||
x(ij) = x(j)
|
||||
x(j) = t
|
||||
t = x(ij)
|
||||
|
||||
! If first element of array is greater than t, interchange with t
|
||||
if (x(i) .gt. t) then
|
||||
x(ij) = x(i)
|
||||
x(i) = t
|
||||
t = x(ij)
|
||||
endif
|
||||
endif
|
||||
|
||||
! Find an element in the second half of the array which is smaller than t
|
||||
40 l = l-1
|
||||
if (x(l) .gt. t) go to 40
|
||||
|
||||
! Find an element in the first half of the array which is greater than t
|
||||
50 k = k+1
|
||||
if (x(k) .lt. t) go to 50
|
||||
|
||||
! Interchange these elements
|
||||
if (k .le. l) then
|
||||
tt = x(l)
|
||||
x(l) = x(k)
|
||||
x(k) = tt
|
||||
go to 40
|
||||
endif
|
||||
|
||||
! Save upper and lower subscripts of the array yet to be sorted
|
||||
if (l-i .gt. j-k) then
|
||||
il(m) = i
|
||||
iu(m) = l
|
||||
i = k
|
||||
m = m+1
|
||||
else
|
||||
il(m) = k
|
||||
iu(m) = j
|
||||
j = l
|
||||
m = m+1
|
||||
endif
|
||||
go to 70
|
||||
|
||||
! Begin again on another portion of the unsorted array
|
||||
60 m = m-1
|
||||
if (m .eq. 0) go to 190
|
||||
i = il(m)
|
||||
j = iu(m)
|
||||
|
||||
70 if (j-i .ge. 1) go to 30
|
||||
if (i .eq. 1) go to 20
|
||||
i = i-1
|
||||
|
||||
80 i = i+1
|
||||
if (i .eq. j) go to 60
|
||||
t = x(i+1)
|
||||
if (x(i) .le. t) go to 80
|
||||
k = i
|
||||
|
||||
90 x(k+1) = x(k)
|
||||
k = k-1
|
||||
if (t .lt. x(k)) go to 90
|
||||
x(k+1) = t
|
||||
go to 80
|
||||
|
||||
! Sort x and carry y along
|
||||
|
||||
100 m = 1
|
||||
i = 1
|
||||
j = nn
|
||||
r = 0.375e0
|
||||
|
||||
110 if (i .eq. j) go to 150
|
||||
if (r .le. 0.5898437e0) then
|
||||
r = r+3.90625e-2
|
||||
else
|
||||
r = r-0.21875e0
|
||||
endif
|
||||
|
||||
120 k = i
|
||||
! Select a central element of the array and save it in location t
|
||||
ij = i + int((j-i)*r)
|
||||
t = x(ij)
|
||||
ty = y(ij)
|
||||
|
||||
! If first element of array is greater than t, interchange with t
|
||||
if (x(i) .gt. t) then
|
||||
x(ij) = x(i)
|
||||
x(i) = t
|
||||
t = x(ij)
|
||||
y(ij) = y(i)
|
||||
y(i) = ty
|
||||
ty = y(ij)
|
||||
endif
|
||||
l = j
|
||||
|
||||
! If last element of array is less than t, interchange with t
|
||||
if (x(j) .lt. t) then
|
||||
x(ij) = x(j)
|
||||
x(j) = t
|
||||
t = x(ij)
|
||||
y(ij) = y(j)
|
||||
y(j) = ty
|
||||
ty = y(ij)
|
||||
|
||||
! If first element of array is greater than t, interchange with t
|
||||
if (x(i) .gt. t) then
|
||||
x(ij) = x(i)
|
||||
x(i) = t
|
||||
t = x(ij)
|
||||
y(ij) = y(i)
|
||||
y(i) = ty
|
||||
ty = y(ij)
|
||||
endif
|
||||
endif
|
||||
|
||||
! Find an element in the second half of the array which is smaller than t
|
||||
130 l = l-1
|
||||
if (x(l) .gt. t) go to 130
|
||||
|
||||
! Find an element in the first half of the array which is greater than t
|
||||
140 k = k+1
|
||||
if (x(k) .lt. t) go to 140
|
||||
|
||||
! Interchange these elements
|
||||
if (k .le. l) then
|
||||
tt = x(l)
|
||||
x(l) = x(k)
|
||||
x(k) = tt
|
||||
tty = y(l)
|
||||
y(l) = y(k)
|
||||
y(k) = tty
|
||||
go to 130
|
||||
endif
|
||||
|
||||
! Save upper and lower subscripts of the array yet to be sorted
|
||||
if (l-i .gt. j-k) then
|
||||
il(m) = i
|
||||
iu(m) = l
|
||||
i = k
|
||||
m = m+1
|
||||
else
|
||||
il(m) = k
|
||||
iu(m) = j
|
||||
j = l
|
||||
m = m+1
|
||||
endif
|
||||
go to 160
|
||||
|
||||
! Begin again on another portion of the unsorted array
|
||||
150 m = m-1
|
||||
if (m .eq. 0) go to 190
|
||||
i = il(m)
|
||||
j = iu(m)
|
||||
|
||||
160 if (j-i .ge. 1) go to 120
|
||||
if (i .eq. 1) go to 110
|
||||
i = i-1
|
||||
|
||||
170 i = i+1
|
||||
if (i .eq. j) go to 150
|
||||
t = x(i+1)
|
||||
ty = y(i+1)
|
||||
if (x(i) .le. t) go to 170
|
||||
k = i
|
||||
|
||||
180 x(k+1) = x(k)
|
||||
y(k+1) = y(k)
|
||||
k = k-1
|
||||
if (t .lt. x(k)) go to 180
|
||||
x(k+1) = t
|
||||
y(k+1) = ty
|
||||
go to 170
|
||||
|
||||
! Clean up
|
||||
190 if (kflag .le. -1) then
|
||||
do i=1,nn
|
||||
x(i) = -x(i)
|
||||
enddo
|
||||
endif
|
||||
|
||||
return
|
||||
end subroutine ssort
|
@ -45,8 +45,10 @@ subroutine symspec(k,ntrperiod,nsps,ingain,nflatten,pxdb,s,df3,ihsym,npts8)
|
||||
if(nfft3.ne.nfft3z) then
|
||||
! Compute new window
|
||||
pi=4.0*atan(1.0)
|
||||
width=0.25*nsps
|
||||
do i=1,nfft3
|
||||
w3(i)=2.0*(sin(i*pi/nfft3))**2 !Window for nfft3 spectrum
|
||||
z=(i-nfft3/2)/width
|
||||
w3(i)=exp(-z*z)
|
||||
enddo
|
||||
nfft3z=nfft3
|
||||
endif
|
||||
@ -115,12 +117,6 @@ subroutine symspec(k,ntrperiod,nsps,ingain,nflatten,pxdb,s,df3,ihsym,npts8)
|
||||
where(syellow<0) syellow=0.
|
||||
endif
|
||||
|
||||
if(nflatten.ne.0) then
|
||||
call flat3(s,iz,nfa,nfb,3,1.0,s)
|
||||
call flat3(savg,iz,nfa,nfb,3,1.0,savg)
|
||||
savg=7.0*savg
|
||||
endif
|
||||
|
||||
900 npts8=k/8
|
||||
|
||||
return
|
||||
|
@ -10,22 +10,35 @@ subroutine symspec65(dd,npts,ss,nhsym,savg)
|
||||
real*4 ss(MAXHSYM,NSZ)
|
||||
real*4 savg(NSZ)
|
||||
real*4 x(NFFT)
|
||||
real*4 w(NFFT)
|
||||
complex c(0:NFFT/2)
|
||||
logical first
|
||||
common/refspec/dfref,ref(NSZ)
|
||||
equivalence (x,c)
|
||||
save /refspec/
|
||||
data first/.true./
|
||||
save /refspec/,first,w
|
||||
|
||||
hstep=2048.d0*12000.d0/11025.d0 !half-symbol = 2229.116 samples
|
||||
nsps=nint(2*hstep)
|
||||
df=12000.0/NFFT
|
||||
nhsym=npts/hstep - 1.0
|
||||
nhsym=(npts-NFFT)/hstep
|
||||
savg=0.
|
||||
fac1=1.e-3
|
||||
|
||||
if(first) then
|
||||
! Compute the FFT window
|
||||
pi=4.0*atan(1.0)
|
||||
width=0.25*nsps
|
||||
do i=1,NFFT
|
||||
z=(i-NFFT/2)/width
|
||||
w(i)=exp(-z*z)
|
||||
enddo
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
do j=1,nhsym
|
||||
i0=(j-1)*hstep
|
||||
x(1:nsps)=fac1*dd(i0+1:i0+nsps)
|
||||
x(nsps+1:)=0.
|
||||
x=fac1*w*dd(i0+1:i0+NFFT)
|
||||
call four2a(c,NFFT,1,-1,0) !r2c forward FFT
|
||||
do i=1,NSZ
|
||||
s=real(c(i))**2 + aimag(c(i))**2
|
||||
|
@ -1384,12 +1384,23 @@ void MainWindow::readFromStdout() //readFromStdout
|
||||
ui->decodedTextBrowser->displayDecodedText (decodedtext
|
||||
, m_config.my_callsign ()
|
||||
, m_config.DXCC ()
|
||||
, m_logBook);
|
||||
, m_logBook
|
||||
, m_config.color_CQ()
|
||||
, m_config.color_MyCall()
|
||||
, m_config.color_DXCC()
|
||||
, m_config.color_NewCall());
|
||||
|
||||
if (abs(decodedtext.frequencyOffset() - m_wideGraph->rxFreq()) <= 10) // this msg is within 10 hertz of our tuned frequency
|
||||
{
|
||||
// the right QSO window
|
||||
ui->decodedTextBrowser2->displayDecodedText(decodedtext,m_config.my_callsign (),false,m_logBook);
|
||||
ui->decodedTextBrowser2->displayDecodedText(decodedtext
|
||||
, m_config.my_callsign ()
|
||||
, false
|
||||
, m_logBook
|
||||
, m_config.color_CQ()
|
||||
, m_config.color_MyCall()
|
||||
, m_config.color_DXCC()
|
||||
, m_config.color_NewCall());
|
||||
|
||||
bool b65=decodedtext.isJT65();
|
||||
if(b65 and m_modeTx!="JT65") on_pbTxMode_clicked();
|
||||
@ -1575,7 +1586,8 @@ void MainWindow::guiUpdate()
|
||||
}
|
||||
if (m_config.TX_messages ())
|
||||
{
|
||||
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,ui->TxFreqSpinBox->value ());
|
||||
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,
|
||||
ui->TxFreqSpinBox->value(),m_config.color_TxMsg());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1651,7 +1663,8 @@ void MainWindow::guiUpdate()
|
||||
|
||||
if (m_config.TX_messages () && !m_tune)
|
||||
{
|
||||
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,ui->TxFreqSpinBox->value ());
|
||||
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,
|
||||
ui->TxFreqSpinBox->value(),m_config.color_TxMsg());
|
||||
}
|
||||
|
||||
m_transmitting = true;
|
||||
@ -1917,7 +1930,14 @@ void MainWindow::doubleClickOnCall(bool shift, bool ctrl)
|
||||
int i9=m_QSOText.indexOf(decodedtext.string());
|
||||
if (i9<0 and !decodedtext.isTX())
|
||||
{
|
||||
ui->decodedTextBrowser2->displayDecodedText(decodedtext,m_config.my_callsign (),false,m_logBook);
|
||||
ui->decodedTextBrowser2->displayDecodedText(decodedtext
|
||||
, m_config.my_callsign ()
|
||||
, false
|
||||
, m_logBook
|
||||
, m_config.color_CQ()
|
||||
, m_config.color_MyCall()
|
||||
, m_config.color_DXCC()
|
||||
, m_config.color_NewCall());
|
||||
m_QSOText=decodedtext;
|
||||
}
|
||||
|
||||
|
29
plotter.cpp
29
plotter.cpp
@ -90,7 +90,7 @@ void CPlotter::draw(float swide[]) //draw()
|
||||
int j,j0,y2;
|
||||
float y;
|
||||
|
||||
double gain = pow(10.0,0.05*(m_plotGain+7));
|
||||
double gain = pow(10.0,0.05*m_plotGain);
|
||||
|
||||
//move current data down one line (must do this before attaching a QPainter object)
|
||||
m_WaterfallPixmap.scroll(0,1,0,0,m_w,m_h1);
|
||||
@ -108,27 +108,32 @@ void CPlotter::draw(float swide[]) //draw()
|
||||
j=0;
|
||||
j0=int(m_startFreq/m_fftBinWidth + 0.5);
|
||||
int iz=XfromFreq(5000.0);
|
||||
int jz=iz*m_binsPerPixel;
|
||||
m_fMax=FreqfromX(iz);
|
||||
|
||||
flat4_(swide,&iz,&m_Flatten);
|
||||
flat4_(&jt9com_.savg[j0],&jz,&m_Flatten);
|
||||
|
||||
for(int i=0; i<iz; i++) {
|
||||
if(i>iz) swide[i]=0;
|
||||
y=0.0;
|
||||
if(swide[i]>0.0) y = 10.0*log10(swide[i]);
|
||||
int y1 = 5.0*gain*y + 10*(m_plotZero-4);
|
||||
y=swide[i];
|
||||
int y1 = 10.0*gain*y + 10*m_plotZero +40;
|
||||
if (y1<0) y1=0;
|
||||
if (y1>254) y1=254;
|
||||
if (swide[i]>1.e29) y1=255;
|
||||
painter1.setPen(m_ColorTbl[y1]);
|
||||
painter1.drawPoint(i,0);
|
||||
|
||||
y2=0;
|
||||
if(m_bCurrent) y2 = 0.4*gain*y - 15;
|
||||
if(m_bCurrent) y2 = gain*y - 15;
|
||||
|
||||
if(m_bCumulative) {
|
||||
float sum=0.0;
|
||||
int j=j0+m_binsPerPixel*i;
|
||||
for(int k=0; k<m_binsPerPixel; k++) {
|
||||
sum+=jt9com_.savg[j++];
|
||||
}
|
||||
y2=gain*6.0*log10(sum/m_binsPerPixel) - 10.0;
|
||||
y2 += m_plotZero;
|
||||
y2=1.3*gain*sum/m_binsPerPixel + m_plotZero - 15;
|
||||
if(m_Flatten==0) y2 += 40;
|
||||
}
|
||||
|
||||
if(m_bLinearAvg) {
|
||||
@ -137,7 +142,7 @@ void CPlotter::draw(float swide[]) //draw()
|
||||
for(int k=0; k<m_binsPerPixel; k++) {
|
||||
sum+=jt9w_.syellow[j++];
|
||||
}
|
||||
y2=sum/m_binsPerPixel * (0.2*m_h/50.0) - 20.0;
|
||||
y2=gain*sum/m_binsPerPixel * (m_h/50.0) - 20.0;
|
||||
}
|
||||
|
||||
if(i==iz-1) painter2D.drawPolyline(LineBuf,j);
|
||||
@ -470,3 +475,9 @@ void CPlotter::setDialFreq(double d)
|
||||
DrawOverlay();
|
||||
update();
|
||||
}
|
||||
|
||||
void CPlotter::setFlatten(bool b)
|
||||
{
|
||||
m_Flatten=0;
|
||||
if(b) m_Flatten=1;
|
||||
}
|
||||
|
13
plotter.h
13
plotter.h
@ -60,24 +60,18 @@ public:
|
||||
void SetPercent2DScreen(int percent){m_Percent2DScreen=percent;}
|
||||
int getFmax();
|
||||
void setDialFreq(double d);
|
||||
|
||||
void setCurrent(bool b) {m_bCurrent = b;}
|
||||
bool current() const {return m_bCurrent;}
|
||||
|
||||
void setCumulative(bool b) {m_bCumulative = b;}
|
||||
bool cumulative() const {return m_bCumulative;}
|
||||
|
||||
void setLinearAvg(bool b) {m_bLinearAvg = b;}
|
||||
bool linearAvg() const {return m_bLinearAvg;}
|
||||
|
||||
void setBreadth(qint32 w) {m_w = w;}
|
||||
qint32 breadth() const {return m_w;}
|
||||
|
||||
float fSpan() const {return m_fSpan;}
|
||||
|
||||
void setLockTxFreq(bool b) {m_lockTxFreq = b;}
|
||||
|
||||
void setColours(QVector<QColor> const& cl) {m_ColorTbl = cl;}
|
||||
void setFlatten(bool b);
|
||||
|
||||
signals:
|
||||
void freezeDecode1(int n);
|
||||
@ -109,6 +103,7 @@ private:
|
||||
qint32 m_nSpan;
|
||||
qint32 m_binsPerPixel;
|
||||
qint32 m_w;
|
||||
qint32 m_Flatten;
|
||||
|
||||
QPixmap m_WaterfallPixmap;
|
||||
QPixmap m_2DPixmap;
|
||||
@ -156,4 +151,8 @@ private slots:
|
||||
void mouseDoubleClickEvent(QMouseEvent *event);
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
void flat4_(float swide[], int* iz, int* nflatten);
|
||||
}
|
||||
|
||||
#endif // PLOTTER_H
|
||||
|
@ -49,6 +49,7 @@ WideGraph::WideGraph(QSettings * settings, QWidget *parent) :
|
||||
int n = m_settings->value("FreqSpan",2).toInt();
|
||||
m_bFlatten=m_settings->value("Flatten",true).toBool();
|
||||
ui->cbFlatten->setChecked(m_bFlatten);
|
||||
ui->widePlot->setFlatten(m_bFlatten);
|
||||
ui->widePlot->setBreadth(m_settings->value("PlotWidth",1000).toInt());
|
||||
ui->freqSpanSpinBox->setValue(n);
|
||||
ui->widePlot->setNSpan(n);
|
||||
@ -364,6 +365,7 @@ void WideGraph::on_paletteComboBox_activated (QString const& palette)
|
||||
void WideGraph::on_cbFlatten_toggled(bool b)
|
||||
{
|
||||
m_bFlatten=b;
|
||||
ui->widePlot->setFlatten(m_bFlatten);
|
||||
}
|
||||
|
||||
void WideGraph::on_adjust_palette_push_button_clicked (bool)
|
||||
|
Loading…
Reference in New Issue
Block a user