Merged from trunk:

------------------------------------------------------------------------
r8179 | k1jt | 2017-10-23 14:41:11 +0100 (Mon, 23 Oct 2017) | 2 lines

Clarify some User Guide text about AP decoding.

------------------------------------------------------------------------
r8181 | k1jt | 2017-10-23 19:59:42 +0100 (Mon, 23 Oct 2017) | 2 lines

Clarify some wording of command-line startup options for wsjtx.

------------------------------------------------------------------------
r8183 | k1jt | 2017-10-24 18:47:05 +0100 (Tue, 24 Oct 2017) | 2 lines

Improve User Guide text on AP decoding.

------------------------------------------------------------------------
r8184 | k1jt | 2017-10-25 21:20:39 +0100 (Wed, 25 Oct 2017) | 2 lines

Make the "Controls" label slightly wider.

------------------------------------------------------------------------
r8185 | k1jt | 2017-10-25 21:21:48 +0100 (Wed, 25 Oct 2017) | 2 lines

Add a tip.

------------------------------------------------------------------------
r8186 | bsomervi | 2017-10-27 13:38:25 +0100 (Fri, 27 Oct 2017) | 5 lines

Add a contextual pop up menu to the wide graph

Initial button added is to set both Tx and Rx offset.

Tidied up encapsulation issue in CPlotter class.
------------------------------------------------------------------------

Bumped RC number.



git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx-1.8@8187 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2017-10-27 12:51:09 +00:00
parent dc6ce7a85c
commit 80728a8f9a
9 changed files with 101 additions and 68 deletions

View File

@ -2,5 +2,5 @@
set (WSJTX_VERSION_MAJOR 1) set (WSJTX_VERSION_MAJOR 1)
set (WSJTX_VERSION_MINOR 8) set (WSJTX_VERSION_MINOR 8)
set (WSJTX_VERSION_PATCH 0) set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 3) # release candidate number, comment out or zero for development versions set (WSJTX_RC 4) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build

View File

@ -33,6 +33,10 @@ the original frequency.
* *Erase* clears the right-hand decoded text window. * *Erase* clears the right-hand decoded text window.
Double-clicking *Erase* clears both text windows. Double-clicking *Erase* clears both text windows.
TIP: Right-clicking on either text window brings up a context menu
with several options (including *Erase*) which operate on that window
alone.
* *Clear Avg* is present only in modes that support message averaging. * *Clear Avg* is present only in modes that support message averaging.
It provides a way to erase the accumulating information, thus It provides a way to erase the accumulating information, thus
preparing to start a new average. preparing to start a new average.

View File

@ -27,8 +27,13 @@ configuration. These settings will be restored whenever you select
that configuration. that configuration.
As well as switching between configurations while running _WSJT-X_ you As well as switching between configurations while running _WSJT-X_ you
can also start the application in any configuration by using the can also start the application from the command line in any desired
`--config <configuration-name>` command line option (`-c` for short). configuration. Use the command-line option
`--config <configuration-name>`, or `-c` for short, as in these
examples for configurations `FT8` and `Echo`:
wsjtx --config FT8
wsjtx -c Echo
[[VIEW_MENU]] [[VIEW_MENU]]
==== View Menu ==== View Menu

View File

@ -16,7 +16,7 @@ Tx sequence) by clicking on the circle under *Next*.
* To change to a specified Tx message immediately during a * To change to a specified Tx message immediately during a
transmission, click on a rectangular button under the *Now* label. transmission, click on a rectangular button under the *Now* label.
Changing a Tx message in mid-stream will slightly reduce the chance of Changing a Tx message in mid-stream will slightly reduce the chance of
a correct decode, but it is usually OK if done in the first 10-15 s of a correct decode, but it is usually OK if done in the first 10-20% of
a transmission. a transmission.
* All six Tx message fields are editable. You can modify an * All six Tx message fields are editable. You can modify an

View File

@ -1,34 +1,26 @@
=== AP Decoding === AP Decoding
With the QRA64 decoder Nico Palermo, IV3NWV, introduced a technique The _WSJT-X_ decoders for QRA64 and FT8 include optional procedures
for decoding with the aid of information that naturally accumulates that use naturally accumulating information during a minimal QSO.
during a minimal QSO. This _a priori_ (AP) information can be This _a priori_ (AP) information increases sensitivity of the decoder
used to increase the sensitivity of the decoder. by up to 4 dB, at the cost of a slightly higher rate of false decodes.
When an operator decides to answer a CQ, he already knows his own For example: when you decide to answer a CQ, you already know your own
callsign and that of his potential QSO partner. He therefore knows callsign and that of your potential QSO partner. The software
what to expect for at least 56 of the 72 message bits in a therefore "`knows`" what to expect for 57 of the 72 message bits (28
standard-format response to his call. The _WSJT-X_ decoders for QRA64 bits for each of two callsigns, 1 bit for message type) in the next
and FT8 can use these and similar AP bits to decode messages received message. The decoder's task can thus be reduced to
containing them with higher sensitivity than otherwise possible. determining the remaining 15 bits of the message and ensuring that the
resulting solution is reliable.
We have implemented AP decoding in slightly different ways in QRA64 AP decoding starts by setting AP bits to the hypothesized values, as
and FT8. To provide some explicit examples for users, we provide here if they had been received correctly. We then determine whether the
a brief description of the FT8 behavior. remaining message and parity bits are consistent with the hypothesized
AP bits, with a specified level of confidence. Successful AP decodes
AP decoding attempts effectively set the AP bits to the hypothesized are labeled with an end-of-line indicator of the form `aP`, where `P`
values, as if they had been received correctly. The decoder then is one of the single-digit AP decoding types listed in Table 1. For
proceeds to determine whether the remaining message and parity bits example, `a2` indicates that the successful decode used MyCall as
are consistent with the hypothesized AP bits. If a codeword is found hypothetically known information.
that the decoder judges to have high (but not overwhelmingly high)
probability of being correct, a ? character is appended when the
decoded message is displayed. To avoid misleading spots of occasional
false decodes, messages so marked are not forwarded to {pskreporter}.
Successful AP decodes are always labeled with an end-of-line indicator
of the form aP, where P is one of the single-digit AP decoding types
listed in Table 1. For example, an `a2` designator says that the
successful decode used MyCall as hypothetically known information.
[[AP_INFO_TABLE]] [[AP_INFO_TABLE]]
.AP information types .AP information types
@ -43,6 +35,12 @@ successful decode used MyCall as hypothetically known information.
|6 | MyCall DxCall RR73 |6 | MyCall DxCall RR73
|=============================================== |===============================================
If a codeword is found that is judged to have high (but not
overwhelmingly high) probability of being correct, a `?` character is
appended when the decoded message is displayed. To avoid misleading
spots of occasional false decodes, messages so marked are not
forwarded to {pskreporter}.
Table 2 lists the six possible QSO states that are tracked by the Table 2 lists the six possible QSO states that are tracked by the
_WSJT-X_ auto-sequencer, along with the type of AP decoding that would _WSJT-X_ auto-sequencer, along with the type of AP decoding that would
be attempted in each state. be attempted in each state.

View File

@ -10,6 +10,7 @@
CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor
QFrame {parent}, QFrame {parent},
m_set_freq_action {new QAction {tr ("&Set Rx && Tx Offset"), this}},
m_bScaleOK {false}, m_bScaleOK {false},
m_bReference {false}, m_bReference {false},
m_bReference0 {false}, m_bReference0 {false},
@ -42,6 +43,19 @@ CPlotter::CPlotter(QWidget *parent) : //CPlotter Constructor
setAutoFillBackground(false); setAutoFillBackground(false);
setAttribute(Qt::WA_OpaquePaintEvent, false); setAttribute(Qt::WA_OpaquePaintEvent, false);
setAttribute(Qt::WA_NoSystemBackground, true); setAttribute(Qt::WA_NoSystemBackground, true);
// contextual pop up menu
setContextMenuPolicy (Qt::CustomContextMenu);
connect (this, &QWidget::customContextMenuRequested, [this] (QPoint const& pos) {
QMenu menu {this};
menu.addAction (m_set_freq_action);
auto const& connection = connect (m_set_freq_action, &QAction::triggered, [this, pos] () {
int newFreq = FreqfromX (pos.x ()) + .5;
emit setFreq1 (newFreq, newFreq);
});
menu.exec (mapToGlobal (pos));
disconnect (connection);
});
} }
CPlotter::~CPlotter() { } // Destructor CPlotter::~CPlotter() { } // Destructor
@ -629,8 +643,9 @@ void CPlotter::setRxFreq (int x) //setRxFreq
int CPlotter::rxFreq() {return m_rxFreq;} //rxFreq int CPlotter::rxFreq() {return m_rxFreq;} //rxFreq
void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent void CPlotter::mouseReleaseEvent (QMouseEvent * event)
{ {
if (Qt::LeftButton == event->button ()) {
int x=event->x(); int x=event->x();
if(x<0) x=0; if(x<0) x=0;
if(x>m_Size.width()) x=m_Size.width(); if(x>m_Size.width()) x=m_Size.width();
@ -651,14 +666,23 @@ void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent
if(ctrl) n+=100; if(ctrl) n+=100;
emit freezeDecode1(n); emit freezeDecode1(n);
} }
else {
event->ignore (); // let parent handle
}
}
void CPlotter::mouseDoubleClickEvent(QMouseEvent *event) //mouse2click void CPlotter::mouseDoubleClickEvent (QMouseEvent * event)
{ {
if (Qt::LeftButton == event->button ()) {
bool ctrl = (event->modifiers() & Qt::ControlModifier); bool ctrl = (event->modifiers() & Qt::ControlModifier);
int n=2; int n=2;
if(ctrl) n+=100; if(ctrl) n+=100;
emit freezeDecode1(n); emit freezeDecode1(n);
} }
else {
event->ignore (); // let parent handle
}
}
void CPlotter::setNsps(int ntrperiod, int nsps) //setNsps void CPlotter::setNsps(int ntrperiod, int nsps) //setNsps
{ {

View File

@ -23,9 +23,11 @@
extern bool g_single_decode; extern bool g_single_decode;
class QAction;
class CPlotter : public QFrame class CPlotter : public QFrame
{ {
Q_OBJECT; Q_OBJECT
public: public:
explicit CPlotter(QWidget *parent = 0); explicit CPlotter(QWidget *parent = 0);
@ -33,7 +35,6 @@ public:
QSize minimumSizeHint() const; QSize minimumSizeHint() const;
QSize sizeHint() const; QSize sizeHint() const;
bool m_bScaleOK;
void draw(float swide[], bool bScroll, bool bRed); //Update the waterfall void draw(float swide[], bool bScroll, bool bRed); //Update the waterfall
void SetRunningState(bool running); void SetRunningState(bool running);
@ -84,15 +85,17 @@ public:
void drawRed(int ia, int ib, float swide[]); void drawRed(int ia, int ib, float swide[]);
void setVHF(bool bVHF); void setVHF(bool bVHF);
void setRedFile(QString fRed); void setRedFile(QString fRed);
bool scaleOK () const {return m_bScaleOK;}
signals: signals:
void freezeDecode1(int n); void freezeDecode1(int n);
void setFreq1(int rxFreq, int txFreq); void setFreq1(int rxFreq, int txFreq);
protected: protected:
//re-implemented widget event handlers //re-implemented widget event handlers
void paintEvent(QPaintEvent *event); void paintEvent(QPaintEvent *event) override;
void resizeEvent(QResizeEvent* event); void resizeEvent(QResizeEvent* event) override;
void mouseReleaseEvent (QMouseEvent * event) override;
void mouseDoubleClickEvent (QMouseEvent * event) override;
private: private:
@ -100,6 +103,9 @@ private:
int XfromFreq(float f); int XfromFreq(float f);
float FreqfromX(int x); float FreqfromX(int x);
QAction * m_set_freq_action;
bool m_bScaleOK;
bool m_bCurrent; bool m_bCurrent;
bool m_bCumulative; bool m_bCumulative;
bool m_bLinearAvg; bool m_bLinearAvg;
@ -166,10 +172,6 @@ private:
qint32 m_tol; qint32 m_tol;
char m_sutc[6]; char m_sutc[6];
private slots:
void mousePressEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
}; };
extern QVector<QColor> g_ColorTbl; extern QVector<QColor> g_ColorTbl;

View File

@ -322,7 +322,7 @@ void WideGraph::on_spec2dComboBox_currentIndexChanged(const QString &arg1)
if(arg1=="Reference") { if(arg1=="Reference") {
ui->widePlot->setReference(true); ui->widePlot->setReference(true);
} }
if(ui->widePlot->m_bScaleOK) ui->widePlot->draw(swide,false,false); if(ui->widePlot->scaleOK ()) ui->widePlot->draw(swide,false,false);
} }
void WideGraph::on_fSplitSpinBox_valueChanged(int n) //fSplit void WideGraph::on_fSplitSpinBox_valueChanged(int n) //fSplit
@ -454,7 +454,7 @@ void WideGraph::on_zeroSlider_valueChanged(int value) //Zero
void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2 void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2
{ {
ui->widePlot->setPlot2dGain(value); ui->widePlot->setPlot2dGain(value);
if(ui->widePlot->m_bScaleOK) { if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false); ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true); if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
} }
@ -463,7 +463,7 @@ void WideGraph::on_gain2dSlider_valueChanged(int value) //Gain2
void WideGraph::on_zero2dSlider_valueChanged(int value) //Zero2 void WideGraph::on_zero2dSlider_valueChanged(int value) //Zero2
{ {
ui->widePlot->setPlot2dZero(value); ui->widePlot->setPlot2dZero(value);
if(ui->widePlot->m_bScaleOK) { if(ui->widePlot->scaleOK ()) {
ui->widePlot->draw(swide,false,false); ui->widePlot->draw(swide,false,false);
if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true); if(m_mode=="QRA64") ui->widePlot->draw(swide,false,true);
} }

View File

@ -60,7 +60,7 @@
<rect> <rect>
<x>5</x> <x>5</x>
<y>0</y> <y>0</y>
<width>63</width> <width>77</width>
<height>17</height> <height>17</height>
</rect> </rect>
</property> </property>